diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..3f63885 --- /dev/null +++ b/COPYING @@ -0,0 +1,637 @@ +LA_OPT_NXP_Software_License v16 October 2020 + +IMPORTANT. Read the following NXP Software License Agreement ("Agreement") +completely. By selecting the "I Accept" button at the end of this page, or by +downloading, installing, or using the Licensed Software, you indicate that you +accept the terms of the Agreement and you acknowledge that you have the +authority, for yourself or on behalf of your company, to bind your company to +these terms. You may then download or install the file. In the event of a +conflict between the terms of this Agreement and any license terms and +conditions for NXP's proprietary software embedded anywhere in the Licensed +Software file, the terms of this Agreement shall control. If a separate +license agreement for the Licensed Software has been signed by you and NXP, +then that agreement shall govern your use of the Licensed Software and shall +supersede this Agreement. + +NXP SOFTWARE LICENSE AGREEMENT + +This is a legal agreement between your employer, of which you are an authorized +representative, or, if you have no employer, you as an individual ("you" or +"Licensee"), and NXP B.V. ("NXP"). It concerns your rights to use the software +provided to you in binary or source code form and any accompanying written +materials (the "Licensed Software"). The Licensed Software may include any +updates or error corrections or documentation relating to the Licensed Software +provided to you by NXP under this Agreement. In consideration for NXP allowing +you to access the Licensed Software, you are agreeing to be bound by the terms +of this Agreement. If you do not agree to all of the terms of this Agreement, +do not download or install the Licensed Software. If you change your mind +later, stop using the Licensed Software and delete all copies of the Licensed +Software in your possession or control. Any copies of the Licensed Software +that you have already distributed, where permitted, and do not destroy will +continue to be governed by this Agreement. Your prior use will also continue to +be governed by this Agreement. + +1. DEFINITIONS + +1.1. "Affiliate" means, with respect to a party, any corporation or +other legal entity that now or hereafter Controls, is Controlled by or is under +common Control with such party; where "Control" means the direct or indirect +ownership of greater than fifty percent (50%) of the shares or similar +interests entitled to vote for the election of directors or other persons +performing similar functions. An entity is considered an Affiliate only so long +as such Control exists. + +1.2 "Authorized System" means either (i) Licensee's hardware product +which incorporates an NXP Product or (ii) Licensee's software program which is +used exclusively in connection with an NXP Product and with which the Licensed +Software will be integrated. + +1.3. "Derivative Work" means a work based upon one or more pre-existing +works. A work consisting of editorial revisions, annotations, elaborations, or +other modifications which, as a whole, represent an original work of +authorship, is a Derivative Work. + +1.4 "Intellectual Property Rights" means any and all rights under +statute, common law or equity in and under copyrights, trade secrets, and +patents (including utility models), and analogous rights throughout the world, +including any applications for and the right to apply for, any of the foregoing. + +1.5 "NXP Product" means a programmable processing unit (e.g. a +microprocessor, microcontroller, sensor or digital signal processor) supplied +directly or indirectly from NXP or an NXP Affiliate. + +1.6 "Software Content Register" means the documentation which may +accompany the Licensed Software which identifies the contents of the Licensed +Software, including but not limited to identification of any Third Party +Software, if any, and may also contain other related information as whether the +license in 2.3 is applicable. + +1.7 "Third Party Software" means, any software included in the Licensed +Software that is not NXP proprietary software, and is not open source software, +and to which different license terms may apply. + +2. LICENSE GRANT. + +2.1. If you are not expressly granted the distribution license in +Section 2.3 in the Software Content Register, then you are only granted the +rights in Section 2.2 and not in 2.3. If you are expressly granted the +distribution license in Section 2.3 in the Software Content Register, then you +are granted the rights in both Section 2.2 and 2.3. + +2.2. Standard License. Subject to the terms and conditions of this +Agreement, NXP grants you a worldwide, personal, non-transferable, +non-exclusive, non-sublicensable license, solely for the development of an +Authorized System: + +(a) to use and reproduce the Licensed Software (and its Derivative Works +prepared under the license in Section 2.2(b)); and + +(b) for Licensed Software provided to you in source code form (human +readable), to prepare Derivative Works of the Licensed Software. + +You may not distribute or sublicense the Licensed Software to others under the +license granted in this Section 2.2. + +2.3. Additional Distribution License. If expressly authorized in the +Software Content Register, subject to the terms and conditions of this +Agreement, NXP grants you a worldwide, personal, non-transferable, +non-exclusive, non-sublicensable license solely in connection with your +manufacturing and distribution of an Authorized System: + +(a) to manufacture (or have manufactured), distribute, and market +the Licensed Software (and its Derivative Works prepared under the license in +2.2(b)) in object code (machine readable format) only as part of, or embedded +within, Authorized Systems and not on a standalone basis. Notwithstanding the +foregoing, those files marked as .h files ("Header files") may be distributed +in source or object code form, but only as part of, or embedded within +Authorized Systems; and + +(b) to copy and distribute as needed, solely in connection with an +Authorized System, non-confidential NXP information provided as part of the +Licensed Software for the purpose of maintaining and supporting Authorized +Systems with which the Licensed Software is integrated. + +2.4 Separate license grants to Third Party Software, or other terms +applicable to the Licensed Software if different from those granted in this +Section 2, are contained in Appendix A. The Licensed Software may be +accompanied by a Software Content Register which will identify that portion of +the Licensed Software, if any, that is subject to the different terms in +Appendix A. + +2.5. You may use subcontractors on your premises to exercise your +rights under Section 2.2 and Section 2.3, if any, so long as you have an +agreement in place with the subcontractor containing confidentiality +restrictions no less stringent than those contained in this Agreement. You will +remain liable for your subcontractors' adherence to the terms of this Agreement +and for any and all acts and omissions of such subcontractors with respect to +this Agreement and the Licensed Software. + +3. LICENSE LIMITATIONS AND RESTRICTIONS. + +3.1. The licenses granted above in Section 2 only extend to NXP +Intellectual Property Rights that would be infringed by the unmodified Licensed +Software prior to your preparation of any Derivative Work. + +3.2. The Licensed Software is licensed to you, not sold. Title to +Licensed Software delivered hereunder remains vested in NXP or NXP's licensor +and cannot be assigned or transferred. You are expressly forbidden from selling +or otherwise distributing the Licensed Software, or any portion thereof, except +as expressly permitted herein. This Agreement does not grant to you any implied +rights under any NXP or third party Intellectual Property Rights. + +3.3. You may not translate, reverse engineer, decompile, or disassemble +the Licensed Software except to the extent applicable law specifically +prohibits such restriction. You must prohibit your subcontractors or customers +(if distribution is permitted) from translating, reverse engineering, +decompiling, or disassembling the Licensed Software except to the extent +applicable law specifically prohibits such restriction. + +3.4. You must reproduce any and all of NXP's (or its third-party +licensor's) copyright notices and other proprietary legends on copies of +Licensed Software. + +3.5. If you distribute the Licensed Software to the United States +Government, then the Licensed Software is "restricted computer software" and is +subject to FAR 52.227-19. + +3.6. You grant to NXP a non-exclusive, non-transferable, irrevocable, +perpetual, worldwide, royalty-free, sub-licensable license under your +Intellectual Property Rights to use without restriction and for any purpose any +suggestion, comment or other feedback related to the Licensed Software +(including, but not limited to, error corrections and bug fixes). + +3.7. You will not take or fail to take any action that could subject +the Licensed Software to an Excluded License. An Excluded License means any +license that requires, as a condition of use, modification or distribution of +software subject to the Excluded License, that such software or other software +combined and/or distributed with the software be (i) disclosed or distributed +in source code form; (ii) licensed for the purpose of making Derivative Works; +or (iii) redistributable at no charge. + +3.8. You may not publish or distribute reports associated with the use +of the Licensed Software to anyone other than NXP. You may advise NXP of any +results obtained from your use of the Licensed Software, including any problems +or suggested improvements thereof, and NXP retains the right to use such +results and related information in any manner it deems appropriate. + +4. OPEN SOURCE. Open source software included in the Licensed +Software is not licensed under the terms of this Agreement but is instead +licensed under the terms of the applicable open source license(s), such as the +BSD License, Apache License or the GNU Lesser General Public License. Your use +of the open source software is subject to the terms of each applicable license. +You must agree to the terms of each applicable license, or you cannot use the +open source software. + +5. INTELLECTUAL PROPERTY RIGHTS. Your modifications to the Licensed +Software, and all Intellectual Property Rights associated with, and title +thereto, will be the property of NXP. Upon request, you must provide NXP the +source code of any derivative of the Licensed Software. You agree to assign +all, and hereby do assign all rights, title, and interest to any such +modifications to the Licensed Software to NXP and agree to provide all +assistance reasonably requested by NXP to establish, preserve or enforce such +right. Further, you agree to waive all moral rights relating to your +modifications to the Licensed Software, including, without limitation, all +rights of identification of authorship and all rights of approval, restriction, +or limitation on use or subsequent modification. Notwithstanding the foregoing, +you will have the license rights granted in Section 2 hereto to any such +modifications made by you or your subcontractor. + +6. ESSENTIAL PATENTS. NXP has no obligation to identify or obtain any +license to any Intellectual Property Right of a third-party that may be +necessary for use in connection with technology that is incorporated into the +Authorized System (whether or not as part of the Licensed Software). + +7. TERM AND TERMINATION. This Agreement will remain in effect unless +terminated as provided in this Section. + +7.1. You may terminate this Agreement immediately upon written notice +to NXP at the address provided below. + +7.2. Either party may terminate this Agreement if the other party is in +default of any of the terms and conditions of this Agreement, and termination +is effective if the defaulting party fails to correct such default within 30 +days after written notice thereof by the non-defaulting party to the defaulting +party at the address below. + +7.3. Notwithstanding the foregoing, NXP may terminate this Agreement +immediately upon written notice if you: breach any of your confidentiality +obligations or the license restrictions under this Agreement; become bankrupt, +insolvent, or file a petition for bankruptcy or insolvency; make an assignment +for the benefit of its creditors; enter proceedings for winding up or +dissolution; are dissolved; or are nationalized or become subject to the +expropriation of all or substantially all of your business or assets. + +7.4. Upon termination of this Agreement, all licenses granted under +Section 2 will expire. + +7.5. After termination of this Agreement by either party you will +destroy all parts of Licensed Software and its Derivative Works (if any) and +will provide to NXP a statement certifying the same. + +7.6. Notwithstanding the termination of this Agreement for any reason, +the terms of Sections 1 and 3 through 24 will survive. + +8. SUPPORT. NXP is not obligated to provide any support, upgrades or +new releases of the Licensed Software under this Agreement. If you wish, you +may contact NXP and report problems and provide suggestions regarding the +Licensed Software. NXP has no obligation to respond to such a problem report or +suggestion. NXP may make changes to the Licensed Software at any time, without +any obligation to notify or provide updated versions of the Licensed Software +to you. + +9. NO WARRANTY. To the maximum extent permitted by law, NXP expressly +disclaims any warranty for the Licensed Software. The Licensed Software is +provided "AS IS", without warranty of any kind, either express or implied, +including without limitation the implied warranties of merchantability, fitness +for a particular purpose, or non-infringement. You assume the entire risk +arising out of the use or performance of the licensed software, or any systems +you design using the licensed software (if any). + +10. INDEMNITY. You agree to fully defend and indemnify NXP from all +claims, liabilities, and costs (including reasonable attorney's fees) related +to (1) your use (including your subcontractor's or distributee's use, if +permitted) of the Licensed Software or (2) your violation of the terms and +conditions of this Agreement. + +11. LIMITATION OF LIABILITY. EXCLUDING LIABILITY FOR A BREACH OF +SECTION 2 (LICENSE GRANTS), SECTION 3 (LICENSE LIMITATIONS AND RESTRICTIONS), +SECTION 16 (CONFIDENTIAL INFORMATION), OR CLAIMS UNDER SECTION 10 (INDEMNITY), +IN NO EVENT WILL EITHER PARTY BE LIABLE, WHETHER IN CONTRACT, TORT, OR +OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL OR PUNITIVE +DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR ANY LOSS OF USE, LOSS OF +TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, SAVINGS, OR REVENUES, TO +THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. NXP'S TOTAL LIABILITY FOR ALL +COSTS, DAMAGES, CLAIMS, OR LOSSES WHATSOEVER ARISING OUT OF OR IN CONNECTION +WITH THIS AGREEMENT OR PRODUCT(S) SUPPLIED UNDER THIS AGREEMENT IS LIMITED TO +THE AGGREGATE AMOUNT PAID BY YOU TO NXP IN CONNECTION WITH THE LICENSED +SOFTWARE PROVIDED UNDER THIS AGREEMENT TO WHICH LOSSES OR DAMAGES ARE CLAIMED. + +12. EXPORT COMPLIANCE. Each party shall comply with all applicable +export and import control laws and regulations including but not limited to the +US Export Administration Regulation (including restrictions on certain military +end uses and military end users as specified in Section 15 C.F.R. § 744.21 and +prohibited party lists issued by other federal governments), Catch-all +regulations and all national and international embargoes. Each party further +agrees that it will not knowingly transfer, divert, export or re-export, +directly or indirectly, any product, software, including software source code, +or technology restricted by such regulations or by other applicable national +regulations, received from the other party under this Agreement, or any direct +product of such software or technical data to any person, firm, entity, country +or destination to which such transfer, diversion, export or re-export is +restricted or prohibited, without obtaining prior written authorization from +the applicable competent government authorities to the extent required by those +laws. + +13. GOVERNMENT CONTRACT COMPLIANCE + +13.1. If you sell Authorized Systems directly to any government or public +entity, including U.S., state, local, foreign or international governments or +public entities, or indirectly via a prime contractor or subcontractor of such +governments or entities, NXP makes no representations, certifications, or +warranties whatsoever about compliance with government or public entity +acquisition statutes or regulations, including, without limitation, statutes or +regulations that may relate to pricing, quality, origin or content. + +13.2. The Licensed Software has been developed at private expense and is a +"Commercial Item" as defined in 48 C.F.R. Section 2.101, consisting of +"Commercial Computer Software", and/or "Commercial Computer Software +Documentation," as such terms are used in 48 C.F.R. Section 12.212 (or 48 +C.F.R. Section 227.7202, as applicable) and may only be licensed to or shared +with U.S. Government end users in object code form as part of, or embedded +within, Authorized Systems. Any agreement pursuant to which you share the +Licensed Software will include a provision that reiterates the limitations of +this document and requires all sub-agreements to similarly contain such +limitations. + +14. CRITICAL APPLICATIONS. In some cases, NXP may promote certain +software for use in the development of, or for incorporation into, products or +services (a) used in applications requiring fail-safe performance or (b) in +which failure could lead to death, personal injury, or severe physical or +environmental damage (these products and services are referred to as "Critical +Applications"). NXP's goal is to educate customers so that they can design +their own end-product solutions to meet applicable functional safety standards +and requirements. Licensee makes the ultimate design decisions regarding its +products and is solely responsible for compliance with all legal, regulatory, +safety, and security related requirements concerning its products, regardless +of any information or support that may be provided by NXP. As such, Licensee +assumes all risk related to use of the Licensed Software in Critical +Applications and NXP SHALL NOT BE LIABLE FOR ANY SUCH USE IN CRITICAL +APPLICATIONS BY LICENSEE. Accordingly, Licensee will indemnify and hold NXP +harmless from any claims, liabilities, damages and associated costs and +expenses (including attorneys' fees) that NXP may incur related to Licensee’s +incorporation of the Licensed Software in a Critical Application. + +15. CHOICE OF LAW; VENUE. This Agreement will be governed by, +construed, and enforced in accordance with the laws of The Netherlands, without +regard to conflicts of laws principles, will apply to all matters relating to +this Agreement or the Licensed Software, and you agree that any litigation will +be subject to the exclusive jurisdiction of the courts of Amsterdam, The +Netherlands. The United Nations Convention on Contracts for the International +Sale of Goods will not apply to this document. + +16. CONFIDENTIAL INFORMATION. Subject to the license grants and +restrictions contained herein, you must treat the Licensed Software as +confidential information and you agree to retain the Licensed Software in +confidence perpetually. You may not disclose any part of the Licensed Software +to anyone other than distributees in accordance with Section 2.3 and employees, +or subcontractors in accordance with Section 2.5, who have a need to know of +the Licensed Software and who have executed written agreements obligating them +to protect such Licensed Software to at least the same degree of +confidentiality as in this Agreement. You agree to use the same degree of care, +but no less than a reasonable degree of care, with the Licensed Software as you +do with your own confidential information. You may disclose Licensed Software +to the extent required by a court or under operation of law or order provided +that you notify NXP of such requirement prior to disclosure, which you only +disclose the minimum of the required information, and that you allow NXP the +opportunity to object to such court or other legal body requiring such +disclosure. + +17. TRADEMARKS. You are not authorized to use any NXP trademarks, brand +names, or logos. + +18. ENTIRE AGREEMENT. This Agreement constitutes the entire agreement +between you and NXP regarding the subject matter of this Agreement, and +supersedes all prior communications, negotiations, understandings, agreements +or representations, either written or oral, if any. This Agreement may only be +amended in written form, signed by you and NXP. + +19. SEVERABILITY. If any provision of this Agreement is held for any +reason to be invalid or unenforceable, then the remaining provisions of this +Agreement will be unimpaired and, unless a modification or replacement of the +invalid or unenforceable provision is further held to deprive you or NXP of a +material benefit, in which case the Agreement will immediately terminate, the +invalid or unenforceable provision will be replaced with a provision that is +valid and enforceable and that comes closest to the intention underlying the +invalid or unenforceable provision. + +20. NO WAIVER. The waiver by NXP of any breach of any provision of this +Agreement will not operate or be construed as a waiver of any other or a +subsequent breach of the same or a different provision. + +21. AUDIT. You will keep full, clear and accurate records with respect +to your compliance with the limited license rights granted under this Agreement +for three years following expiration or termination of this Agreement. NXP will +have the right, either itself or through an independent certified public +accountant to examine and audit, at NXP's expense, not more than once a year, +and during normal business hours, all such records that may bear upon your +compliance with the limited license rights granted above. You must make prompt +adjustment to compensate for any errors and/or omissions disclosed by such +examination or audit. + +22. NOTICES. All notices and communications under this +Agreement will be made in writing, and will be effective when received at the +following addresses: + + NXP: NXP B.V. + High Tech Campus 60 + 5656 AG Eindhoven + The Netherlands + ATTN: Legal Department + + You: The address provided at registration will be used. + +23. RELATIONSHIP OF THE PARTIES. The parties are independent +contractors. Nothing in this Agreement will be construed to create any +partnership, joint venture, or similar relationship. Neither party is +authorized to bind the other to any obligations with third parties. + +24. SUCCESSION AND ASSIGNMENT. This Agreement will be binding upon and +inure to the benefit of the parties and their permitted successors and assigns. + You may not assign this Agreement, or any part of this Agreement, without the +prior written approval of NXP, which approval will not be unreasonably withheld +or delayed. NXP may assign this Agreement, or any part of this Agreement, in +its sole discretion. + +25. PRIVACY. By agreeing to this Agreement and/or utilizing the Licensed +Software, Licensee consents to use of certain personal information, including +but not limited to name, email address, and location, for the purpose of +NXP’s internal analysis regarding future software offerings. NXP’s +complete Privacy Statement can be found at: +https://www.nxp.com/company/our-company/about-nxp/privacy-statement:PRIVACYPRACT +ICES. + +APPENDIX A + +Other License Grants and Restrictions: + +The Licensed Software may include some or all of the following software, which +is either 1) Third Party Software or 2) NXP proprietary software subject to +different terms than those in the Agreement. If the Software Content Register +that accompanies the Licensed Software identifies any of the following Third +Party Software or specific components of the NXP proprietary software, the +following terms apply to the extent they deviate from the terms in the +Agreement: + +Amazon: Use of the Amazon software constitutes your acceptance of the terms of +the Amazon Program Materials License Agreement (including the AVS Component +Schedule, if applicable), located at +https://developer.amazon.com/support/legal/pml. All Amazon software is hereby +designated "Amazon confidential". Amazon is a third-party beneficiary to this +Agreement with respect to the Amazon software. + +Amphion Semiconductor Ltd.: Distribution of Amphion software must be a part of, +or embedded within, Authorized Systems that include an Amphion Video Decoder. + +Aquantia Corp.: You may use Aquantia's API binaries solely to flash the API +software to an NXP Product which mates with an Aquantia device. + +Atheros: Use of Atheros software is limited to evaluation and demonstration +only. Permitted distributions must be similarly limited. Further rights must +be obtained directly from Atheros. + +ATI (AMD): Distribution of ATI software must be a part of, or embedded within, +Authorized Systems that include a ATI graphics processor core. + +Broadcom Corporation: Your use of Broadcom Corporation software is restricted +to Authorized Systems that incorporate a compatible integrated circuit device +manufactured or sold by Broadcom. + +Cadence Design Systems: Use of Cadence audio codec software is limited to +distribution only of one copy per single NXP Product. The license granted +herein to the Cadence Design Systems HiFi aacPlus Audio Decoder software does +not include a license to the AAC family of technologies which you or your +customer may need to obtain. Configuration tool outputs may only be distributed +by licensees of the relevant Cadence SDK and distribution is limited to +distribution of one copy embedded in a single NXP Product. + +Cirque Corporation: Use of Cirque Corporation technology is limited to +evaluation, demonstration, or certification testing only. Permitted +distributions must be similarly limited. Further rights, including but not +limited to ANY commercial distribution rights, must be obtained directly from +Cirque Corporation. + +Coding Technologies (Dolby Labs): Use of CTS software is limited to evaluation +and demonstration only. Permitted distributions must be similarly limited. +Further rights must be obtained from Dolby Laboratories. + +CSR: Use of Cambridge Silicon Radio, Inc. ("CSR") software is limited to +evaluation and demonstration only. Permitted distributions must be similarly +limited. Further rights must be obtained directly from CSR. + +Crank: Use of Crank Software Inc. software is limited to evaluation and +demonstration only. Permitted distributions must be similarly limited. Further +rights must be obtained directly from Crank Software Inc. + +Cypress Semiconductor Corporation: WWD RTOS source code may only be used in +accordance with the Cypress IOT Community License Agreement located at +https://community.cypress.com/terms-and-conditions!input.jspa?displayOnly=true. + +Embedded Systems Academy GmbH (EmSA): Any use of Micro CANopen Plus is subject +to the acceptance of the license conditions described in the LICENSE.INFO file +distributed with all example projects and in the documentation and the +additional clause described below. + +Clause 1: Micro CANopen Plus may not be used for any competitive or comparative +purpose, including the publication of any form of run time or compile time +metric, without the express permission of EmSA. + +Future Technology Devices International Ltd.: Future Technology Devices +International software must be used consistent with the terms found here: +http://www.ftdichip.com/Drivers/FTDriverLicenceTerms.htm + +Global Locate (Broadcom Corporation): Use of Global Locate, Inc. software is +limited to evaluation and demonstration only. Permitted distributions must be +similarly limited. Further rights must be obtained from Global Locate. + +Microsoft: Except for Microsoft PlayReady software, if the Licensed Software +includes software owned by Microsoft Corporation ("Microsoft"), it is subject +to the terms of your license with Microsoft (the "Microsoft Underlying Licensed +Software") and as such, NXP grants no license to you, beyond evaluation and +demonstration in connection with NXP processors, in the Microsoft Underlying +Licensed Software. You must separately obtain rights beyond evaluation and +demonstration in connection with the Microsoft Underlying Licensed Software +from Microsoft. Microsoft does not provide support services for the components +provided to you through this Agreement. If you have any questions or require +technical assistance, please contact NXP. Microsoft Corporation is a third +party beneficiary to this Agreement with the right to enforce the terms of this +Agreement. TO THE MAXIMUM EXTENT PERMITTED BY LAW, MICROSOFT AND ITS +AFFILIATES DISCLAIM ANY WARRANTIES FOR THE MICROSOFT UNDERLYING LICENSED +SOFTWARE. TO THE MAXIMUM EXTENT PERMITTED BY LAW, NEITHER MICROSOFT NOR ITS +AFFILIATES WILL BE LIABLE, WHETHER IN CONTRACT, TORT, OR OTHERWISE, FOR ANY +DIRECT, INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL OR PUNITIVE DAMAGES, +INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR ANY LOSS OF USE, LOSS OF TIME, +INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, SAVINGS, OR REVENUES, ARISING +FROM THE FROM THE USE OF THE MICROSOFT UNDERLYING LICENSED SOFTWARE. With +respect to the Microsoft PlayReady software, you will have the license rights +granted in Section 2, provided that you may not use the Microsoft PlayReady +software unless you have entered into a Microsoft PlayReady Master Agreement +and license directly with Microsoft. + +MindTree: Notwithstanding the terms contained in Section 2.3 (a), if the +Licensed Software includes proprietary software of MindTree in source code +format, Licensee may make modifications and create derivative works only to the +extent necessary for debugging of the Licensed Software. + +MM SOLUTIONS AD: Use of MM SOLUTIONS AEC (Auto Exposure Control) and AWB (Auto +White Balance) software is limited to demonstration, testing, and evaluation +only. In no event may Licensee distribute or sublicense the MM SOLUTIONS +software. Further rights must be obtained directly from MM SOLUTIONS. + +MPEG LA: Use of MPEG LA audio or video codec technology is limited to +evaluation and demonstration only. Permitted distributions must be similarly +limited. Further rights must be obtained directly from MPEG LA. + +MQX RTOS Code: MQX RTOS source code may not be re-distributed by any NXP +Licensee under any circumstance, even by a signed written amendment to this +Agreement. + +NXP Wireless Charging Library: License to the Software is limited to use in +inductive coupling or wireless charging applications + +Opus: Use of Opus software must be consistent with the terms of the Opus +license which can be found at: http://www.opus-codec.org/license/ + +Oracle JRE (Java): The Oracle JRE must be used consistent with terms found +here: http://java.com/license + +P&E Micro: P&E Software must be used consistent with the terms found here: +http://www.pemicro.com/licenses/gdbserver/license_gdb.pdf + +Pro Design Electronic: Licensee may not modify, create derivative works based +on, or copy the Pro Design software, documentation, hardware execution key or +the accompanying materials. Licensee shall not use Pro Design's or any of its +licensors names, logos or trademarks to market the Authorized System. Only NXP +customers and distributors are permitted to further redistribute the Pro Design +software and only as part of an Authorized System which contains the Pro Design +software. + +Qualcomm Atheros, Inc.: Notwithstanding anything in this Agreement, Qualcomm +Atheros, Inc. Wi-Fi software must be used strictly in accordance with the +Qualcomm Atheros, Inc. Technology License Agreement that accompanies such +software. Any other use is expressly prohibited. + +Real Networks - GStreamer Optimized Real Format Client Code implementation or +OpenMax Optimized Real Format Client Code: Use of the GStreamer Optimized Real +Format Client Code, or OpenMax Optimized Real Format Client code is restricted +to applications in the automotive market. Licensee must be a final +manufacturer in good standing with a current license with Real Networks for the +commercial use and distribution of products containing the GStreamer Optimized +Real Format Client Code implementation or OpenMax Optimized Real Format Client +Code + +RivieraWaves SAS (a member of the CEVA, Inc. family of companies): You may not +use the RivieraWaves intellectual property licensed under this Agreement if you +develop, market, and/or license products similar to such RivieraWaves +intellectual property. Such use constitutes a breach of this Agreement. Any +such use rights must be obtained directly from RivieraWaves. + +SanDisk Corporation: If the Licensed Software includes software developed by +SanDisk Corporation ("SanDisk"), you must separately obtain the rights to +reproduce and distribute this software in source code form from SanDisk. +Please follow these easy steps to obtain the license and software: + +(1) Contact your local SanDisk sales representative to obtain the SanDisk +License Agreement. + +(2) Sign the license agreement. Fax the signed agreement to SanDisk USA +marketing department at 408-542-0403. The license will be valid when fully +executed by SanDisk. + +(3) If you have specific questions, please send an email to sales@sandisk.com + +You may only use the SanDisk Corporation Licensed Software on products +compatible with a SanDisk Secure Digital Card. You may not use the SanDisk +Corporation Licensed Software on any memory device product. SanDisk retains +all rights to any modifications or derivative works to the SanDisk Corporation +Licensed Software that you may create. + +SEGGER Microcontroller - emWin Software: Your use of SEGGER emWin software and +components is restricted for development of NXP ARM7, ARM9, Cortex-M0, +Cortex-M3, Cortex-M4, Cortex-M33, Cortex-M7, and Cortex-A7 based products only. + +SEGGER Microcontroller - J-Link/J-Trace Software: Segger software must be used +consistent with the terms found here: http://www.segger.com/jlink-software.html + +Synopsys/Target Compiler Technologies: Your use of the Synopsys/Target Compiler +Technologies Licensed Software and related documentation is subject to the +following: + +(1) Duration of the license for the Licensed Software is limited to 12 months, +unless otherwise specified in the license file. + +(2) The Licensed Software is usable by one user at a time on a single +designated computer, unless otherwise agreed by Synopsys. + +(3) Licensed Software and documentation are to be used only on a designated +computer at the designated physical address provided by you on the APEX license +form. + +(4) The Licensed Software is not sub-licensable. + +TARA Systems: Use of TARA Systems GUI technology Embedded Wizard is limited to +evaluation and demonstration only. Permitted distributions must be similarly +limited. Further rights must be obtained directly from TARA Systems. + +Texas Instruments: Your use of Texas Instruments Inc. WiLink8 Licensed Software +is restricted to NXP SoC based systems that include a compatible connectivity +device manufactured by TI. + +TES Electronic Solutions Germany (TES): TES 3D Surround View software and +associated data and documentation may only be used for evaluation purposes and +for demonstration to third parties in integrated form on a board package +containing an NXP S32V234 device. Licensee may not distribute or sublicense the +TES software. Your license to the TES software may be terminated at any time +upon notice. + +Vivante: Distribution of Vivante software must be a part of, or embedded +within, Authorized Systems that include a Vivante Graphics Processing Unit. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..eda89b3 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,48 @@ +38caeaa780dab401ebef3a3da9d70780 platform/drivers/pmic/fsl_pmic.c +82bf356db93bfa49f529d0c76a0d8a0a platform/drivers/pmic/fsl_pmic.h +ea4484cc511d659b34986b50f7e73fb2 platform/drivers/pmic/pf100/fsl_pf100.c +b354dc9fb00475c88586fdc2b588bfde platform/drivers/pmic/pf100/fsl_pf100.h +5ad77c435b37ffd21f8c1955bf9d7a8b platform/drivers/pmic/pf8100/fsl_pf8100.c +b14862703128d8eff0b5d9d23bde1986 platform/drivers/pmic/pf8100/fsl_pf8100.h +88d7f1eb36d25e375eac2b6ff91f099c platform/svc/irq/api.h +813d7ab5458c8f44ffba05a611852ccd platform/svc/irq/rpc.h +600bc1d6fe07fec1c6b296ffaa63ef65 platform/svc/irq/rpc_clnt.c +fa494beafdb946f7012d422c2bb68e16 platform/svc/irq/rpc_srv.c +0a2816ead0cb66d22421c6054c2f1102 platform/svc/irq/svc.c +1bb4e752b57f41f875cfa9c883779911 platform/svc/irq/svc.h +992c19260d200d34bc1619b979587191 platform/svc/misc/api.h +1fc0fb8a3b26bd9c04a8fb750e288665 platform/svc/misc/rpc.h +f1a3e517c6d7ebb5fd10449893126ba7 platform/svc/misc/rpc_clnt.c +102b74b2bd00fdf644f2c26744591668 platform/svc/misc/rpc_srv.c +7db4e398adb76f97323063b3702c7ab0 platform/svc/misc/svc.c +9b4fb3f8448ca3f1f962cc5412631147 platform/svc/misc/svc.h +e58921623b77a8f7c9fdb9c978b6befe platform/svc/pad/api.h +2b5798909a98d184151d4f8180bbdf61 platform/svc/pad/rpc.h +3fb4259ea648dedae38854fde3b2e935 platform/svc/pad/rpc_clnt.c +794de06fb2f52d5fc00a03e4edf552f4 platform/svc/pad/rpc_srv.c +7c7ef45c2492dbeab5b7f87ef3d6751c platform/svc/pad/svc.c +11c5303759c83ffe5f4a1ac64a930862 platform/svc/pad/svc.h +9472e8313cfc90d6c9eee3c35bf0b37e platform/svc/pm/api.h +5f2bbdbc3c9076a3123a83b4e25c4863 platform/svc/pm/rpc.h +32a5025ce0e9806bdc5233e365ebd2ff platform/svc/pm/rpc_clnt.c +04b99e848feff9837353364f36c5b166 platform/svc/pm/rpc_srv.c +0f166dc9af5dd1388b5b9064da41d1f4 platform/svc/pm/svc.c +e70fc5ea40fe60d80c76f61a80862499 platform/svc/pm/svc.h +b837e88c0c48c4aff822fcb4889c659d platform/svc/rm/api.h +3ab95a3542e47f0f389de824ba6ed68c platform/svc/rm/rpc.h +627a61f2a25e01b2fac5f765f6b290fb platform/svc/rm/rpc_clnt.c +9d8f0b421c2c072d8426bd4098c5d551 platform/svc/rm/rpc_srv.c +f41b344707e75a8ee59065805fbe9b2a platform/svc/rm/svc.c +921ebb45be5f5f8c99c237c55006d198 platform/svc/rm/svc.h +6e31778eb5bb9094aadf467bc11c849a platform/svc/seco/api.h +dd6efc20df99ab32183afe984914f3d8 platform/svc/seco/rpc.h +2ce894bf04554f4c8897c443aa43882c platform/svc/seco/rpc_clnt.c +038d084a239b3d8616445bd2ab7e57be platform/svc/seco/rpc_srv.c +b9d1ceb45df9d51e0c4b123d02a777d5 platform/svc/seco/svc.c +03c0afdd9a3eca7732b51afba8f14b7b platform/svc/seco/svc.h +16e95255ac43e3741b48ad37f67efbf8 platform/svc/timer/api.h +0a0bb7020011f894d936e3695f8f66d2 platform/svc/timer/rpc.h +d772586141a305cdc8b5fe8db8a1f77d platform/svc/timer/rpc_clnt.c +b147740cebe0654ec4ba21d4882de201 platform/svc/timer/rpc_srv.c +15fd6a4703e96ebcce4fddc156ca0978 platform/svc/timer/svc.c +8077ad38d8cde0a24f5b6740088d36d9 platform/svc/timer/svc.h diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..dacced8 --- /dev/null +++ b/Makefile @@ -0,0 +1,669 @@ +## ################################################################### +## +## Copyright 2019-2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +# This Makefile will build the System Controller and Test + +SHELL=/bin/bash -o pipefail + +# Configure Si Rev +DEF_SREV := B0 +ifdef r + R := $(r) +endif +LOWER_R := $(shell echo $(R) | tr A-Z a-z) +UPPER_R := $(shell echo $(R) | tr a-z A-Z) +export R LOWER_R UPPER_R + +# Configure emul +ifdef z + Z := $(z) +endif +ifndef Z + Z = 0 +endif +ifeq ($(Z),1) + FLAGS += -DEMUL +endif + +# Include config makefiles +HELP := "" +HELP_OPT := "" +MAKECONFIG := $(shell find makefiles -name Makefile.config) +MAKECONFIG += $(shell find makefiles -name Makefile.full) +include $(foreach makeconfig,$(MAKECONFIG),$(makeconfig)) + +# Default config +CONFIG ?= mx8qm +DEVICE ?= ALL +OUT ?= build_api +HW ?= SIMU +PROJ ?= "" +SREC_OFFSET ?= 0x00000000 +DOXYGEN ?= doxygen +DOX_OUT = $(OUT)/docs +FLAGS += -DCPU_$(DEVICE) $(OPT) -DECC_CLEAN + +# Configure verbose logging + +ifdef v + V := $(v) +endif +ifeq ($(V),1) + AT := +else + AT := @ +endif +export AT + +# Configure forced error +ifdef f + F := $(f) +endif +ifndef F + F = 0 +endif +ifeq ($(F),1) + FLAGS += -DFORCE_COMPILE_ERROR +endif +ifeq ($(F),2) + FLAGS += -DFORCE_TEST_ERROR +endif + +# Configure board +ifdef b + B := $(b) +endif +ifdef ALIAS_B +ifeq ($(B), $(ALIAS_B)) + override B = $(MAP_B) +endif +endif +ifeq ($(HW), SIMU) + override B := none +endif +ifndef DEF_B + DEF_B := val +endif +ifndef B + B := $(DEF_B) +endif +LOWER_B := $(shell echo $(B) | tr A-Z a-z) +export B +export LOWER_B +ifeq ($(LOWER_B),none) + BOARD = none +else + BOARD = $(CONFIG)_$(LOWER_B) +endif +FLAGS += -DBOARD_$(shell echo $(B) | tr a-z A-Z) + +# Configure SS +ifdef c + C := $(c) +endif +ifndef C + C := ALL +endif +LOWER_C := $(shell echo $(C) | tr A-Z a-z) +UPPER_C := $(shell echo $(C) | tr a-z A-Z) +export C LOWER_C UPPER_C + +# Configure debug +ifdef d + D := $(d) +endif +ifndef D + D = 1 +endif +ifeq ($(D),1) + DEBUG = -g -DDEBUG -Os +else + DEBUG = -Os +endif +ifeq ($(COVERAGE),1) + DEBUG = -DGCOV -fprofile-arcs -ftest-coverage + LDFLAGS = -lgcov --coverage +endif +ifdef dl + DL := $(dl) +endif +ifdef DL + FLAGS += -DDL=$(DL) +endif +ifdef tl + TL := $(tl) +endif +ifdef TL + FLAGS += -DTL=$(TL) +endif + +#configure LTO (link time optimization) +ifdef lto + LTO := $(lto) +endif +ifndef lto + LTO = 0 +endif +ifeq ($(LTO),1) + CFLAG_LTO = -flto + FLAGS += -DLTO +endif + +# Configure tests +ifdef t + T := $(t) +endif +ifndef T + T := NONE +else + FLAGS += -DHAS_TEST +endif +LOWER_T := $(shell echo $(T) | tr A-Z a-z) +UPPER_T := $(shell echo $(T) | tr a-z A-Z) +export T LOWER_T UPPER_T +ifeq ($(LOWER_T),all) + FLAGS += -DTEST_ALL +endif +ifeq ($(LOWER_T),boottime) + FLAGS += -DTEST_BOOTTIME +endif +FLAGS += -DTEST=$(LOWER_T) + +# Configure XRDC +ifdef x + X := $(x) +endif +ifndef X + X = 1 +endif +ifeq ($(X),1) + FLAGS += -DXRDC_SUPPORT +endif +ifeq ($(X),2) + FLAGS += -DXRDC_SUPPORT -DXRDC_NOCHECK +endif + +# Configure UART +ifdef u + U := $(u) +endif +ifndef U + U = 0 +endif +ifeq ($(D),0) + FLAGS += -DDEBUG_UART=0 +else + FLAGS += -DDEBUG_UART=$(U) +endif + +# Configure MSI posted writes +ifdef w + W := $(w) +endif +ifndef W + W = 1 +endif +FLAGS += -DPOST_WR_LIMIT=$(W) + +# Configure AutoCal +ifdef ac + AC := $(ac) +endif +ifndef AC + AC = 0 +endif +ifeq ($(AC),1) + FLAGS += -DAUTOCAL +endif + +# Configure manifest +MANIFEST := $(shell md5sum --status -c MANIFEST 1>&2 2> /dev/null; echo $$?) +ifeq ($(MANIFEST),1) + FLAGS += -DDIRTY +endif + +FLAGS += -DSREV_$(UPPER_R) + +OUT := $(OUT)_$(LOWER_R) + +# Configure monitor +ifdef m + M := $(m) +endif +ifndef M + M = 0 +endif +ifndef EM + EM = 0 +endif +ifeq ($(M),1) + FLAGS += -DMONITOR + DCDFLAGS += -DMINIMIZE +endif +ifeq ($(EM),1) + FLAGS += -DEXPORT_MONITOR + DCDFLAGS += -DMINIMIZE +endif + +ifdef NO_OVLY + FLAGS += -DNO_OVLY +endif + +ifdef NO_WDOG_DIS + FLAGS += -DNO_WDOG_DIS +endif + +# Check config +ifeq ($(D),0) +ifeq ($(M),1) +$(error M=1 and D=0 are mutually exclusive) +endif +endif + +WARNS = -Wall -Wextra -Wno-missing-braces -Wno-missing-field-initializers \ + -Wfloat-equal -Wswitch-default -Wcast-align \ + -Wpointer-arith -Wredundant-decls -Wbad-function-cast -Wstrict-prototypes \ + -Wundef -Wcast-qual -Wshadow \ + -Wold-style-definition -Wno-unused-parameter -Werror + +ifneq ($(HW), SIMU) + WARNS += -Wstack-usage=1024 +endif + +# Set common flags +rootdir := $(CURDIR) +SRC = platform +DOC = doc +FLAGS += $(DEBUG) ${WARNS} +# Configure tools +ifeq ($(wildcard $(TOOLS)/srec/srec_cat),) + SREC_CAT = srec_cat +else + SREC_CAT = $(TOOLS)/srec/srec_cat +endif +ifeq ($(wildcard $(TOOLS)/cppcheck/cppcheck),) + CPPCHECK = cppcheck +else + CPPCHECK = $(TOOLS)/cppcheck/cppcheck +endif + +# Configure compiler +ifeq ($(HW), SIMU) + #GNU GCC + AS = as + LD = ld + CC = gcc + CPP = cpp + AR = ar + NM = nm + LDR = ldr + STRIP = strip + OBJCOPY = objcopy + OBJDUMP = objdump + GCOV = gcov + + INCLUDE = -I$(rootdir)/platform/ \ + -I$(rootdir)/platform/CMSIS/Include/ \ + -I$(rootdir)/platform/drivers/common/ \ + -I$(rootdir)/platform/devices/ \ + -I$(rootdir)/platform/devices/$(DEVICE)/ \ + -I$(rootdir)/platform/devices/MX8/ \ + -I$(rootdir)/platform/config/$(CONFIG)/ \ + -I$(rootdir)/platform/config/$(CONFIG)/$(UPPER_C) \ + -I$(rootdir)/platform/board/$(BOARD) + +ifneq ($(COVERAGE),1) +ifneq ($(NO_ASAN),1) + CFLAGS += -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined + LDFLAGS += -lasan -lubsan +endif +endif + + CFLAGS += $(FLAGS) -std=gnu99 -m32 -fshort-enums + LDFLAGS += -m32 -Wl,-lrt + FLAGS += -DSIMU -DNO_DEVICE_ACCESS + WARNS += -Wformat=2 -Wnested-externs + TEST_CFLAGS := $(CFLAGS) +else + CROSS_COMPILE = $(TOOLS)/gcc-arm-none-eabi-*/bin/arm-none-eabi- + #GNU GCC + AS = $(CROSS_COMPILE)as + LD = $(CROSS_COMPILE)ld + CC = $(CROSS_COMPILE)gcc + CPP = $(CROSS_COMPILE)cpp + AR = $(CROSS_COMPILE)ar + NM = $(CROSS_COMPILE)nm + LDR = $(CROSS_COMPILE)ldr + STRIP = $(CROSS_COMPILE)strip + OBJCOPY = $(CROSS_COMPILE)objcopy + OBJDUMP = $(CROSS_COMPILE)objdump + CPPCHECK = $(TOOLS)/cppcheck/cppcheck + + SYSROOT := $(shell $(CC) -print-sysroot) + INCLUDE = -I$(SYSROOT)/usr/include \ + -I$(rootdir)/platform/ \ + -I$(rootdir)/platform/CMSIS/Include/ \ + -I$(rootdir)/platform/drivers/common/ \ + -I$(rootdir)/platform/devices/ \ + -I$(rootdir)/platform/devices/$(DEVICE)/ \ + -I$(rootdir)/platform/devices/MX8/ \ + -I$(rootdir)/platform/config/$(CONFIG)/ \ + -I$(rootdir)/platform/config/$(CONFIG)/$(UPPER_C) \ + -I$(rootdir)/platform/board/$(BOARD) + ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16 + CFLAGS = $(INCLUDE) $(ARCHFLAGS) $(FLAGS) -ffunction-sections -std=c99 -mno-unaligned-access -pipe -fno-common -ffunction-sections -fdata-sections -ffreestanding -mapcs -std=c99 -fno-builtin -fshort-enums -DNDEBUG + TEST_CFLAGS := $(CFLAGS) + CFLAGS += $(CFLAG_LTO) + AFLAGS = $(INCLUDE) $(ARCHFLAGS) $(FLAGS) -fno-common -ffunction-sections -fdata-sections -mno-unaligned-access -ffreestanding -fno-builtin -std=c99 -pipe + LDFLAGS += -Wl,--defsym=__ram_vector_table__=1 -Wl,-Bstatic -Wl,--gc-sections -nostdlib +ifeq ($(D),1) + LIB_C := $(shell $(CC) $(ARCHFLAGS) --print-file-name=libc_nano.a) + LIB_GCC := $(shell $(CC) $(ARCHFLAGS) --print-file-name=libgcc.a) + LCNANO := -lc_nano +else + LCNANO := +endif + WARNS += -Wformat=0 -Wunreachable-code +endif + +export $(CFLAGS) + +# Define Components to build +SUBCOMPS := devices test + +SUBCOMPS += main + +ifeq ($(HW), REAL) + SUBCOMPS += utilities +endif + +# Define drivers, subsystems, and services to build for the SoC + +include $(SRC)/config/$(CONFIG)/soc.bom + +# Define drivers, subsystems, and services to build for the board + +include $(SRC)/board/$(BOARD)/board.bom + +SUBCOMPS += soc/$(SOC) + +include $(foreach subcomp,$(SUBCOMPS),$(rootdir)/$(SRC)/$(subcomp)/Makefile) + +ifeq ($(HW), REAL) + DRV += $(DRV2) +endif + +ifeq ($(DEVICE), ALL) + DRV := $(shell find $(SRC)/drivers -name Makefile) + SS := $(shell find $(SRC)/ss -name Makefile) + BRD := $(shell find $(SRC)/board -name Makefile) + SVC := $(shell find $(SRC)/svc -mindepth 1 -type d) + DOX_API := $(foreach svc,$(SVC),$(svc)/api.h) + include $(foreach drv,$(DRV),$(drv)) + include $(foreach ss,$(SS),$(ss)) + include $(foreach brd,$(BRD),$(brd)) + include $(foreach svc,$(SVC),$(svc)/Makefile) +else + include $(foreach drv,$(DRV),$(SRC)/drivers/$(drv)/Makefile) + include $(SRC)/ss/inf/Makefile + include $(foreach ss,$(SS),$(rootdir)/$(SRC)/ss/$(ss)/Makefile) + include $(SRC)/board/$(BOARD)/Makefile + include $(foreach svc,$(SVC),$(rootdir)/$(SRC)/svc/$(svc)/Makefile) + DOX_API := $(foreach svc,$(SVC),platform/svc/$(svc)/api.h) + DOX_ADD := platform/config/$(CONFIG) + DOX_ADD += $(foreach drv,$(DRV),platform/drivers/$(drv)) + DOX_ADD += $(foreach drv,$(DRV2),platform/drivers/$(drv)) + DOX_ADD += platform/drivers/snvs/doxygen//fsl_snvs.dox + DOX_ADD += platform/drivers/snvs/fsl_snvs.h + DOX_ADD += platform/drivers/seco/doxygen + DOX_ADD += platform/drivers/seco/fsl_seco.h + DOX_ADD += platform/ss/inf + DOX_ADD += $(foreach ss,$(SS),platform/ss/$(ss)) + DOX_ADD += $(DOX_ADD_COMMON) + DOX_ADD += platform/board/$(BOARD) + DOX_ADD += $(foreach svc,$(SVC),platform/svc/$(svc)) +endif + +# Dox input files + +DOX_SOC := doc/resources.md doc/clocks.md doc/controls.md doc/pads.md + +ifdef EXP + DOX_SOC += doc/memmap.md + MD += doc/memmap.md +endif + +ifeq ($(LOWER_T),all) + TCM_LD = $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_overlay.ld +else + TCM_LD = $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_tcm.ld +endif + +ifdef NO_OVLY + TCM_LD = $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_tcm.ld +endif + +FUSE_DIRNAME=../test_files +ifneq "$(wildcard $(FUSE_DIRNAME) )" "" + FIRST_R := $(shell echo $(UPPER_R) | cut -c1-1) + FUSEFILES += $(shell find ../test_files/$(CONFIG)/fuses -name "*$(FIRST_R).txt") + FUSELOGS += $(FUSEFILES:../test_files/$(CONFIG)/%=$(OUT)/%) +endif + +CONFIG_DIRNAME=../test_files +ifneq "$(wildcard $(CONFIG_DIRNAME) )" "" + CONFIGFILES += $(shell find ../test_files/$(CONFIG)/configs -name "*.txt") + CONFIGLOGS += $(CONFIGFILES:../test_files/$(CONFIG)/%=$(OUT)/%) +endif + +# Build rules + +all : help + +ifndef NO_IPC + OBJS += ${RPCS} ${RPCL} +endif + +CONFIGH+=$(SRC)/config/$(CONFIG)/pads.h +CONFIGH+=$(SRC)/config/$(CONFIG)/pad_data.h +CONFIGH+=$(SRC)/config/$(CONFIG)/pad_priority.h +TPROTOH+=$(SRC)/test/$(CONFIG)/test_all.c $(SRC)/test/common/test.h $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_overlay.ld +PAD_MD += $(SRC)/config/pad.txt +MEMMAP_MD += $(SRC)/devices/$(DEVICE)/memmap_md.txt + +BIH+=$(SRC)/main/build_info.h + +INCH+= $(SRC)/config/$(CONFIG)/all_api.h $(SRC)/config/$(CONFIG)/all_svc.h \ + $(SRC)/config/$(CONFIG)/all_ss.h $(SRC)/config/$(CONFIG)/all_config.h \ + $(SRC)/config/$(CONFIG)/ss_ver.h + +MD+=doc/resources.md doc/clocks.md doc/controls.md doc/pads.md + +.SECONDARY : ${INCH} ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${RPCHDR} ${RSRC_MD} ${CLK_MD} $(CTRL_MD) $(MEMMAP_MD) $(TPROTOH) + +.INTERMEDIATE : ${MD} $(SRC)/test/board_system_config.c + +.PRECIOUS : ${DCDH} + +GCOV_OUT := $(OBJS:.o=.gcov) + +# Include config makefiles +MAKERULE := $(shell find makefiles -name Makefile.rules) +include $(foreach makerule,$(MAKERULE),$(makerule)) + +$(OUT)/sc : ${OBJS} + ${CC} -o "$@" ${OBJS} ${LDFLAGS} + +-include $(OBJS:.o=.d) + +.SUFFIXES : + +# Include pkit makefiles +MAKERULE2 := $(shell find makefiles -name Makefile.rules2) +include $(foreach makerule,$(MAKERULE2),$(makerule)) + +$(OUT)/board/board_common.o : $(SRC)/board/board_common.c ${INCH} ${INFH} ${CONFIGH} ${BIH} ${DCDH} $(SRC)/test/common/test.h + @echo "Compiling $<" + $(AT)${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@ + +$(SRC)/board/$(CONFIG)_$(B)/dcd/%.h : $(SRC)/board/$(CONFIG)_$(B)/dcd/%.cfg + @echo "Generating $@" + $(AT)rm -f $(*F).temp + $(AT)${CPP} -P -I$(SRC)/devices $(DCDFLAGS) $< $(*F).temp + $(AT)sed -i -f bin/dcd.sed $(*F).temp + $(AT)echo "#ifndef $(subst .,_,$(*F))_H" > $@ + $(AT)echo "#define $(subst .,_,$(*F))_H" >> $@ + $(AT)cat $(*F).temp >> $@ + $(AT)echo '#endif' >> $@ + $(AT)rm -f $(*F).temp + +$(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h : $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h + @echo "Generating $@ from $<" + $(AT)rm -f $@ + $(AT)echo "#ifndef DCD_H" > $@ + $(AT)echo "#define DCD_H" >> $@ + $(AT)echo "#include \"$(DDR_CON).h\"" >> $@ + $(AT)echo '#endif' >> $@ + +$(SRC)/board/$(CONFIG)_$(B)/dcd/%_retention.h : $(SRC)/board/$(CONFIG)_$(B)/dcd/%.cfg + @echo "Generating $@" + $(AT)rm -f $(*F)_ret.temp + $(AT)${CPP} -P -I$(SRC)/devices $(DCDFLAGS) $< $(*F)_ret.temp + $(AT)sed -i -f bin/retention.sed $(*F)_ret.temp + $(AT)echo "#ifndef $(subst .,_,$(*F))_RET_H" > $@ + $(AT)echo "#define $(subst .,_,$(*F))_RET_H" >> $@ + $(AT)cat $(*F)_ret.temp >> $@ + $(AT)echo '#endif' >> $@ + $(AT)rm -f $(*F)_ret.temp + +$(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h : $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h + @echo "Generating $@ from $<" + $(AT)rm -f $@ + $(AT)echo "#ifndef DDR_RETENTION_H" > $@ + $(AT)echo "#define DDR_RETENTION_H" >> $@ + $(AT)echo "#include \"$(DDR_CON)_retention.h\"" >> $@ + $(AT)echo '#endif' >> $@ + +$(OUT)/fuses/%.txt : $(OUT)/ $(OUT)/sc + $(AT)mkdir -p $(OUT)/fuses + $(OUT)/sc -r 0 -f ../test_files/$(CONFIG)/fuses/$*.txt 2> $(OUT)/fuses/$*.txt + $(OUT)/sc -r 1 -f ../test_files/$(CONFIG)/fuses/$*.txt 2> $(OUT)/fuses/$*.txt + +$(OUT)/configs/%.txt : $(OUT)/ $(OUT)/sc + $(AT)mkdir -p $(OUT)/configs + $(OUT)/sc -r 0 -c ../test_files/$(CONFIG)/configs/$*.txt 2> $(OUT)/configs/$*.txt + $(OUT)/sc -r 1 -c ../test_files/$(CONFIG)/configs/$*.txt 2> $(OUT)/configs/$*.txt + +$(OUT)/%.gcov : $(FUSELOGS) $(CONFIGLOGS) + @echo "Coverage $@" + $(AT)${GCOV} -p platform/$*.c -o $(OUT)/$* + + +$(OUT)/%.o : $(SRC)/%.S + @echo "Assembling $<" + $(AT)${CC} ${AFLAGS} ${INCLUDE} -c $< -o $@ + +$(OUT)/scfw.bin : $(OUT)/scfw.elf + @echo "Objcopy $@ ...." + $(AT)$(OBJCOPY) -O binary --gap-fill 0x0 $(OUT)/scfw.elf $(OUT)/scfw.bin --strip-debug + +$(OUT)/scfw_tcm.bin : $(OUT)/scfw_tcm.elf + @echo "Objcopy $@ ...." + $(AT)$(OBJCOPY) -O binary --gap-fill 0x0 -R .test* $(OUT)/scfw_tcm.elf $(OUT)/scfw_tcm.bin --strip-debug + +$(OUT)/scfw_tests.bin : $(OUT)/scfw_tcm.elf + @echo "Objcopy $@ ...." + $(AT)$(OBJCOPY) -O binary --gap-fill 0x0 -j .test* $(OUT)/scfw_tcm.elf $(OUT)/scfw_tests.bin --strip-debug + +$(OUT)/scfw.hex : $(OUT)/scfw.srec + @echo "Generating hex $@ ...." + @-rm -f $(OUT)/scfw.hex + $(AT)$(SREC_CAT) $(OUT)/scfw.srec -byte_swap 4 -crop 0x00000000 0xffffffff -offset $(SREC_OFFSET) -Line_Length=82 -output $(OUT)/scfw.hex -vmem 32 + +$(OUT)/scfw_tcm.hex : $(OUT)/scfw_tcm.srec + @echo "Generating hex $@ ...." + $(AT)$(SREC_CAT) $(OUT)/scfw_tcm.srec -byte_swap 4 -crop 0x00000000 0xffffffff -offset 0x11000000 -Line_Length=82 -output $(OUT)/scfw_tcm.hex -vmem 32 + +$(OUT)/scfw_tests.hex : $(OUT)/scfw_tests.srec + @echo "Generating hex $@ ...." + $(AT)$(SREC_CAT) $(OUT)/scfw_tests.srec -byte_swap 4 -crop 0x00000000 0xffffffff -offset 0x11000000 -Line_Length=82 -output $(OUT)/scfw_tests.hex -vmem 32 + +$(OUT)/scfw.srec : $(OUT)/scfw.elf + @echo "Generating srec $@ ...." + $(AT)-rm -f $(OUT)/scfw_fb.bin + $(AT)$(OBJCOPY) -O srec --gap-fill 0x0 --pad-to 0x10000 $(OUT)/scfw.elf $(OUT)/scfw.srec --strip-debug + +$(OUT)/scfw_tcm.srec : $(OUT)/scfw_tcm.elf + @echo "Objcopy $@ ...." + $(AT)$(OBJCOPY) -O srec --gap-fill 0x0 -R .test* --pad-to 0x30000 $(OUT)/scfw_tcm.elf $(OUT)/scfw_tcm.srec --strip-debug + +$(OUT)/scfw_tests.srec : $(OUT)/scfw_tcm.elf + @echo "Objcopy $@ ...." + $(AT)$(OBJCOPY) -O srec --gap-fill 0x0 -j .test* --pad-to 0x30000 $(OUT)/scfw_tcm.elf $(OUT)/scfw_tests.srec --strip-debug + +$(OUT)/scfw.elf : $(OUT)/devices/$(DEVICE)/gcc/startup_$(DEVICE).o $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_flash.ld + @echo "Linking $@ ...." + $(AT)$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ -T $(SRC)/devices/$(DEVICE)/linker/gcc/$(DEVICE)_flash.ld $(OUT)/devices/$(DEVICE)/gcc/startup_$(DEVICE).o -lgcc -Wl,-Map=$(OUT)/scfw.map + +$(OUT)/scfw_tcm.elf : $(OBJS) $(TCM_LD) + @echo "Linking $@ ...." + $(AT)$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ -T $(TCM_LD) $(OBJS) $(LCNANO) -lgcc -Wl,-Map=$(OUT)/scfw_tcm.map + +$(OUT)/ : FORCE + $(AT)-rm -f log.txt + $(AT)-mkdir -p $(DIRS) + +FORCE: + +help : + @/bin/echo -e "Usage: make TARGET OPTIONS\n" + @/bin/echo -e "Targets:" + @/bin/echo -e "\thelp : display help text" + @/bin/echo -e "\tclean : remove all build files\n" + @/bin/echo -en $(HELP) + @/bin/echo -e "\nOptions:" + @/bin/echo -e "\tV=0 : quite output (default)" + @/bin/echo -e "\tV=1 : verbose output" + @/bin/echo -e "\tD=0 : configure for no debug" + @/bin/echo -e "\tD=1 : configure for debug (default)" + @/bin/echo -e "\tDL= : configure debug level (0-5)" + @/bin/echo -e "\tB= : configure board (default=val)" + @/bin/echo -e "\tU= : configure debug UART (default=0)" + @/bin/echo -e "\tDDR_CON= : specify DDR config file" + @/bin/echo -e "\tR= : silicon revision (default=A0)" + @/bin/echo -e "\tM=0 : no debug monitor (default)" + @/bin/echo -e "\tM=1 : include debug monitor" + @/bin/echo -e "\tLTO=0 : build without link-time optimization (default)" + @/bin/echo -e "\tLTO=1 : build with link-time optimization" + @/bin/echo -e "\tT= : run tests rather than boot next core" + @/bin/echo -en $(HELP_OPT) + diff --git a/SCR-imx-scfw-porting-kit.txt b/SCR-imx-scfw-porting-kit.txt new file mode 100755 index 0000000..cf30a74 --- /dev/null +++ b/SCR-imx-scfw-porting-kit.txt @@ -0,0 +1,13 @@ +NXP Software Content Register + +-------------------------------------------- + +Package: imx-scfw-porting-kit*.bin +Outgoing License: LA_OPT_NXP_Software_License - Production Use, Section 2.3 applies +License File: COPYING +Type of content: Binary +Description and comments: System Controller firmware +Release Location: NXP.com +Origin: NXP (proprietary) + Freescale Semiconductor, Inc. (proprietary) + ARM CMSIS Library (BSD-3-clause) - https://silver.arm.com/ diff --git a/bin/dcd.sed b/bin/dcd.sed new file mode 100755 index 0000000..eabd2b1 --- /dev/null +++ b/bin/dcd.sed @@ -0,0 +1,9 @@ +s/^\s*\(DATA\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(SET_BIT\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(CLR_BIT\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(CHECK_BITS_SET\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(CHECK_BITS_CLR\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(CHECK_ANY_BIT_SET\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +s/^\s*\(CHECK_ANY_BIT_CLR\) \([^ ]\+\) \([^ ]\+\) \([^ ]\+\) *$/\1\2(\3U, \4U);/ +/^\s*\(DEFINE\) /d + diff --git a/bin/pkit_keep b/bin/pkit_keep new file mode 100755 index 0000000..215b12a --- /dev/null +++ b/bin/pkit_keep @@ -0,0 +1,3 @@ +board +drivers/pmic +svc \ No newline at end of file diff --git a/bin/retention.sed b/bin/retention.sed new file mode 100755 index 0000000..9efc432 --- /dev/null +++ b/bin/retention.sed @@ -0,0 +1,3 @@ +/^\s*\(DEFINE\) /!d +s/^\s*\(DEFINE\) \([^ ]\+\) *$/\#define \2 / +s/^\s*\(DEFINE\) \([^ ]\+\) \([^ ]\+\) *$/\#define \2 \3U/ diff --git a/build_mx8qm_b0/devices/MX8QM/gcc/startup_MX8QM.o b/build_mx8qm_b0/devices/MX8QM/gcc/startup_MX8QM.o new file mode 100644 index 0000000000000000000000000000000000000000..1ba99e5ca619a9d15e89f0d8c5669f6d013be87b GIT binary patch literal 10564 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 Ld(<`p+IIf|F~1dF literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/devices/MX8QM/handlers_MX8QM.o b/build_mx8qm_b0/devices/MX8QM/handlers_MX8QM.o new file mode 100644 index 0000000000000000000000000000000000000000..4189c40f6b06908a424251819bdc7eb16cc9d300 GIT binary patch literal 85976 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 BRTlsN literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/devices/MX8QM/system_MX8QM.o b/build_mx8qm_b0/devices/MX8QM/system_MX8QM.o new file mode 100644 index 0000000000000000000000000000000000000000..a7a1d30daabc5b0b895fe344e5454cfd7c952bfb GIT binary patch literal 69760 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�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
{OHEv<_-(9%{;NjJ`5+R4+#ii})G(*x7SKPlp2 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 uIfsR3XwA@*W}Y_UNmFzW)GV%k)(M literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/devices/memcpy-armv7m.o b/build_mx8qm_b0/devices/memcpy-armv7m.o new file mode 100644 index 0000000000000000000000000000000000000000..e5fb786c862baf0ede415293f7189692ccaa92d2 GIT binary patch literal 2052 zcmc&!OK%%h6u$GY(|?g{M>kQ74gA#7!>(GKI_^#^9HkyeYYeFLraOwa-g(`VZhKeRQR1aHdb2ob z>iD~Rs?weNX~=h?C!z)vp0C|+9~2JN(w#X(BycC|^3wCi%F^_4c8YH3T>R4An2P&a zU$~-{?sw0gWRsy@9@S5sWGQ;>oI0vki(mhikP5fe(yg9U5|tlzMc-7XcoYt<4` zt=T>gxx5X_dyZo@c;I+^*Yz8Gpvrr0V=upLH`^Uj=3ARvyU_W8-K^&ucEFeQRlTrO zw}ZT2;2@klsx5z$Z`r=HYxows`sUl|%8hhUUs=(YS>*+s&9Ds9X3{fYW2=|*8!SFE zu`wx6#pee%NmuX~C?hYOcBMZ6;iy0}nqgE@SX{VESm2z=XY2lV#-Bh14O#~<7}{gb~SMFiruHOQn^BK^-pKBN-jB6ynEll%%pF<=?x z+b1Rhk?&>5G|_UT{|XIJ{uvIhGgtQPq$%lX_QVie(e&0e$0_o*YUFw5+5HkbIZox48vP8brnBPC} L`-B1_5PtsxmBLu` literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/devices/memops.o b/build_mx8qm_b0/devices/memops.o new file mode 100644 index 0000000000000000000000000000000000000000..5455d2d041cef7d5484fe492998fd9a72ec555ec GIT binary patch literal 1924 zcma)6&1xJ+5U!cgpM|xKY#)MUY{|sIAa;87gDnDq)nZ#0E7%djx6JnJj#k6&?2Kl5 zEGZZwbV&|5_!0aDA$NzsK7n(NA3(VoLLd+bsjoG?9_^g$zfH=#X~>zdu8dHTpeHLw2me(T4xKc`>wGQ9rTAHV!`_Ws)+ey0<=*=U|N z2TfZxt=USBy}X~sy4pSDWGIY$ex-n+jAbQC8I&(xm zc!lT){0hhDK&&cp4tSmw(2(^N~;#JOD=R|k|oC6bR@?wq< z59bEGV&(0*sK4-G;Vt=&6K&*A(t)05fL72DXx#(!fT zIg%pPvKSZ`7#NVn;K2g}QmEug3{vXJV5fdQ#*OH)flNxwgX?+6zu z?V3L6!~5&!_j~r&9KPTDc>L{_mKM>RT12mSx+X+lS7Xo3!N#mtyeK-Fhc@OGm&28E z6i50A34eQvzCbp14 z7TegtE^^qzKJqA{gaeo;;}A!v;ut45MGa@D;~e51<3}6X(Sc5Mp&K^zpcj1@z#xV& zj1i1t4C9!NvkI{+V>G zIzIpOvybENeEbiQv;-W1RG<*B1RcRtun@G&JLXgKg?UTJ5lV#$A@R2n@xL5z2|L26 za3O4oI3lS?A!3O-qN!*hYKb{wsaPRq(!WXnCjFcAZ_>X>|0eyL^l#F?S}I zd)P-FMU-#=6J;FY2vr>81gEIs40W7C+%@Unq<@qCP5L+K-=u$&{!RKf>EEP(lm1Qm zH|gJ`f0O=A`Zwv{q<@qCP5L+K-=u$&{!RKf>EEP(lm1QmH|gJ`f0OKl;gI@Gu z0D~C9Fh($nF^ppZlbFIZT<{`*Fyb(bLf>o?x9UIuh7Ba|U8#~xV4tv-~9z~RJ z025^#;s{k7;{>Ou;S6=0L)>TlXhSDfN921zt6sF;V z7XgG3hk+$5BZ(EPVh!uqz$UhkK^EKC!7g&x!#?sTqJ#sODB}=EsNxtWI7JO-sN>oG z#qV0*{&`JU{!-7r)E2P1oUXL1;zs2gJy)5N)Geu7Qn#dTN!^mVC3Q>cmeeh&TT-{AZb{vex+Qf> z>Xy_ksasOFq;5&wlDZ{zOX`-?EvZ{lx1?@K-IBT`bxZ1&)Geu7Qn#dTN!^mVC3Q>c zmeeh&TT-{AZb{vex+Qf>>Xy_ksasOFq;5&wlDZ{zOX`-?EvZ{lx1?@K-IBT`bxZ1I z{8+&%*07EZY+?%;WU-AM>>`If>?4mNN;rUtG7fQsDvoi2Q`B&VI?f^PF@Ch69UbUI z7rJ3X4|>su0SsaY!x+IR#xRZvOkxVtaKVcJ!idAb5|)v~3Rba(b!=c0TgV`bZR}td zIqYE{c@$B?0Zf!}h$B>Sj1!!qhBMT04soCHqYdroKqtD;4I6sUi#`ls5JMQo2u3l6 zaZF$mQ<#PeUIY+E90r!Kj3idDiZ!fb1Dn`F23c%l2fN5&5BtcYh!PH9qKrcvp^9Ui z;1o5Sp^o$W&j&vL*Jq!L--|!!-|d?2`|m%Y?0_?n4paixpfi{bR)W@f=X`p;GH(qz zL+MZ@WDPsR>2M`%jW{FeNF`#8I-}`mC2Ea1W9e8WrYKucwxVoB*^06iWh=^7l&vUR zQMRINMcIn76=f^RR+OzMTT!;6Y(?3MvK3`3%2t%EC|gmsqHIOkin0}DE6P@stteYj zwxVoB*^06iWh=^7l&vURQMRINMcIn76=f^RR+OzMTT!;6Y(?3MvK3`3%2t%EC|gms zqHIOkin0}DE6P@s&G@l`Rjgqh8`#7aGRR^ZJJ>}Id)P-FMU-#=6J;FY2vr>81gEIs z40W7C+++M`LpwUqi7s@*h92~y4+9v)5QZ^=QH)_66PUylrs0AY0fZ5Ufh8;>i50A3 z4eQvzCbp147TegtE^^qzKJqA{gaeo;;}A!v;ut45MGa@D;~e5X<3}6X(Sc5Mp&K^z zpcj1@z#xV&j1i1t4C9!e3A%TE!3fd)(6U?>jFD{+`!=!lNY~b{qa! zB4YRYJ_yeG7KDiSBC+_wjNw}_`X62VsejX=|CDdFx7_`T$^Lbp?%LnFehchhvhA5; z{x9x}-F|)C&#Zs_??dF7F@MR1um5dm{p+u777L#=_w=WZ{`e3#o_uY%^3BEu@qK20 zLQArRuMKa#*z&EG);llXdF9TxZ(bb0&u&~k{>irHnAC#9}lw6A#VJeB@hPuzMEbjg`pKklpY_;xnGbVAwn34JPc3r3XRw zydR19LUtn(w?B?0LiQ({9>imz4Pm7 z9=t1V-G1)f=PkEyz5L`p>hWKnTEFn^tp40@{lX!w;>NWjTG%2)^71v|)wp*2bJy0N zzqbDLwbDCUMfU+>o!#iZ9A%s;uj488tdW6#A8 z{cW=kzx~F=y528(4AJA&zsVMS#>`?g5etWX-kH}1ULVvO6W*uWe)PVdj10IT>ry6 zqA?Z=mw1cIwXjX!ElZndd~2?^>z7;4_1EeaZgu1R&)jyo-gq28^tknLqJQDTh~f4y zHxd`~KyxYK3-=qoB}4Rk-G*EAdlnW%zuxHec^2npc*pv#t_P$37>73YxjmkQ?}Mv* z-3fPej(;Fr9>8;m{x{!yx8H3TiJ)hZe=l$`|J|g!*O#uxqNfpDZCZ~_PcK8i+eVNx#>8T$H~lRn?_<@-@@YwjCh z`ReseaDDpx`ucPg&FdRwx%n6t#RxC*5A?$2)Z911`qlGIalRq8>GSEgfAf43EH@v+ zqVRJ*{k~~V&3zs=G?(?hBnR2_!sVo|RZqXd)#qL3dG%|cpI6u0eBSq2*5}jX)>DS_ z{rO_C@l)^9mcc!aH#YKP@jIgNS>IgO$LLAVEsdp%9~&HJW21igbQk)0^>yfLYrbYI dirjaFF!aLZ)I8sdtY1AY!#LKO2QhCR_a7ihxC{UQ literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/devices/startup.o b/build_mx8qm_b0/devices/startup.o new file mode 100644 index 0000000000000000000000000000000000000000..5be14d14c4b9cfe956c4319e395f074c32d3bd0d GIT binary patch literal 10836 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 T`r}!&QtxKO_kC9h=<59sq+l&h literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/analog/fsl_analog.o b/build_mx8qm_b0/drivers/analog/fsl_analog.o new file mode 100644 index 0000000000000000000000000000000000000000..f42295569590f071d8f27c7023b9920fae6f474f GIT binary patch literal 44768 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/analog/fsl_analog_bias.o b/build_mx8qm_b0/drivers/analog/fsl_analog_bias.o new file mode 100644 index 0000000000000000000000000000000000000000..387e09a041c79e3619a89029f037dc2b1c2fb44d GIT binary patch literal 31964 zcmdtLd3c+})i(ajqs5Z#_;F-M*5f#dk~nb!@tTDM0$H2{LK70QKvEVV+p;ZUSwfPt zPzt=1wWX{nJEasTTNfxxp_G?ESqc;=EoEy<7urHgmjGR$1@gP^ne*6kNZ;RgUEe=1 zpRP#voS8Fc&YU@OX3=BiwB@T-D5Wg#rK}m&2xVD6-=<3fb2QAb;?^Xq<{oQGpabCFE7tH16KxU-rkK&w`X0E7YaTweQG1xMY@P`E{@S z>gN&5syv~>vTn0ILm0GwUTInOl)841J{24q1F!>ss7K~Du-Y?XYf<7~#A1Koc?S>* z{4s`-J3{zqiDgj|I9}HdJrO`w2G+IP-7}bFmvup)eRVZH=D61(%YPpE`Qh`Iy~O-S zg7`SV{Wh~gW$8N03i<=-!6F&1r5?XTCwx=fpMasv{|Y`sFZz(3K>Pk#RaDPz8HaRU zr^8Q&sgSDMg@SUw|7*T!P^dydbN?-s|3GF%9vuE#YnX3UQvbO~joF2S&#DUfZwPM& z?c757H>G^gzKO@25|vII zrV4h9Cs7?qY`225E8a%+TG-`cVC7l(P#87c7t0!Z9xT@wJRo!?@|-s?`oRTZ)1MU- zd!Q!#&bhEh@E}cuoTI7MLQPaUCB^!-_=A_B+=Dt1s@o@0Buz} zJ@^cMPuGb#~$bIBZ&bB zcu5Ob=6r{2uj)FhoO+lm__OlY(4V!=ZPfa;$PZwQ4UR(rzo|??>rD>FB>3AZPOf8} z_b_dOztdjQV?|lS8g=@EovbVHLpy7k|0gI4uqgH~NT1;ko?wUAd3P=Ssms=SSneZq z&_283-zf6CKc##1*|nrX?tq~tlB#s)KzJ~1hbX_=oy7@vq8<7-W_+z%OU*JyW}Ca( z1vO|#t1(CBxXW3VGiCGLf6xedyL>Xr7P>{YFl6fqz1Zy{wbgJgbH_zNZ8K$uxzBTu zw%fH$sJF^}l)8MzaISUVhYrD0>@d5(!TlR&=5==2i^$zn{|F6ugIz;UKTOqs4$&ld zqaC3quTu4IQqC=Q<$Tonxn2J{mHUQW{XKN}S9bk8STFc3yL=f+|762;>8;xCi@{K0 zcTI}jPlw0=Gs^r^@EQFh6rgLBurtdWrX$J2s`R)K9@HK}hK{s!B|X_}Lx0PoEh`+N zS5H#)edyl!Tj0Bu!Ko_rcW}5mR!&o6Nm%atw90g)N8Rs^=jb&lJ?bH}#SWMGDR_L@ zc+08^E>fWb;Ti5xH2Y!|Az`_j=qyVN6?Ctoqb^mEGf-4%RT2&dgQ(i@qu}Xw85bNk z#&JEvj_m@6<+f1d=j;ea%kRF%d2ps(O~#OW7Dw_dyN&_5(Y=xD+S#_A1c$jNQ|EK+ zSzPqiy5DEV&$a6nTHNHm$bmc0j&h##yGuB3pEp#_{T)`Z;1>+F-My0Soo`oX(bDOz z!wB(3yZSUx=el>(IW92meZ~D8JA0w2ccZ(5_PfYXUw0i?DtNJ>?sgY&xw^zq-*YFj zy-N-CsCy|x)lM^OerQ#4d1KSsNUovTxTebteW6F!Sq-~`SK4LwBEv1P``6gxNm%YL zsob@8>~T=rtxCpDCbgIeR^=}6(Eo*=use9F?c-FP$Y2osl3l@(nmC>#_+`6-Et<9~ z&`n(_W`*8@QOo?ynZ((uof8>Rq|5wVf+um>c#eFC&ThtMCH-gv5?YXL#c${6wD`1u zxMDbH^-bXVS9u=VJ=NnZv*HUd;$`obxu2pwEW8YbldUPQ!?Qz)v0ngH$$itey*iFn zbxru_@OLV(&fJNi4R0FzC6rsvh47E?W=;5=HUy;br!^6BW}-NJj3z3bbudTxSWQ$r ztuRCQI8D?#KcuwdH4$@`!Dqt>O*A<7qOtG^nut5!gl6HSCK{c?5wgNvnwa5ynnbrI zW;rL4=+Q)*b25pPCgwPwC()~k`OZ}&`ZTf7Spy4&`!%uHIRL{SPHSSB^E}KHK2Z~g zIoHD$;Vqh2<-Eb34rpSnGlc>&n%Ll60JjVeYGRYqfe{L4HF2zS7~D6U)5HnR_o=~2 zn&@$+&<1%;^gDloCx;7~7;w&HNl_CyXFZ7_O%$De5?eK~-D$;I6W*qYQ=AUCTzI=C zPIp>3K07pVrt=UDf3hadbv9Gc&uHR&r}_QWn2~ z<|}^fi=4+cFGlUk1rbV`az2Kka-lPg`4KQxE;9MYVO~})HR(H;zucrBg#juLGwEv? z>_4T`_PY=^CaYDnzXp?!xzMD)fzFTlo=%6`pw^g(GD=(lBUEi0OND&Oz6DU`X9w*w z(1NqY=)MP1?LLf?Gibyuhq;`SbfJAYx>21s`9DN6)t@zK1>;wrVR$;pbB@Ws0RCJ3 zMV$_8f~oCR1l#IMP2p7-s_H9sI=&LN9Q&4Ct<_nJ$Pu~EFkK9%k34A7&x0xQh)I7M ztw)~F{j$G`79-D_{Qb!PqDlV@Ek=H3((fT%bCF4Jh8=3Rne_AMZtV_}z6jH(_FSE= z3e{d5zJ)!17pADaH1=)Ox26{I-B#_+*w;WPU%=n^S-5cRm&Qe z{EZht%i7C@w)|6bJyz`%)&DZp1C1Y1_Lb4UXxa`m9)v{gRkcC1tNi|8aQsFX=>RYHWuCHnk17xxJas6KN z@x~Rn;XZP$A21Is)oNr>Mxo+BRiAEBphD zRdlNIabppnl!of)ek%M^%3A|Bh&CJjY-Y5>g3*@Y47=$@6k(FTjF^Q1lQLW)Pj(l`dM*#j1+oOZPxqWJ!rdZi8z_ zmnzR0eNC5QG^3r$*#Hyy%Uu7=bk>S4QxQ4>yf>@h2sWzle<9_5 zfLhU`Rn>WD5dBMVxHl*^V*n(K=-BQ*&1K4++qdjoyyOhZ*0#m+K{#b#y@m!fA6_q1VVx@Wr; zJ;%$i8jLN@^)f;ewW8+@D>`Xr0jJ*R=Osh=CmGGZ;A!rgguMqfKVSJyrRLPP;e_Z; z6}}!ua~o)=%TyJYN6S3~^E!Hks&7L-Lhh5WQ}ik|o{ZJ*?Wi5STGihSs@8pvZgq`v zzX2-d7Fl+!p&HzeXy-4h@pqvt?z)H)(d*Rs`$09jE8tVn8&vH>pk}zoFm&8#ylIv@ zfz$COL$$d(85M3;lO6--9QPck7rjMIdK%Px_XG?`^j0;IE6YMR%?Wawn)ni^#qNo0 z;dV9g7oe88-@zIa{kmC54|Cszk4L|ubgW(Fenje%|`AV z&REy9mUg^L)zYEimm8Y)V@L1yGOP_v>zQ$nmk~Ou=^b|BUN6Hss_7S;|M#g#HP?=i zwW;Yo8uI?(jLl7pX|D%WHN$`^Q=e|y&SwAHo3Qq#rtwtlAsKSN|JbHFc4U|56zbTf zci5MQy^O$dO=r>2-&eI}3A2xDs-cx0Q&sn~6<^@^rgu2>kE@#d(K%)Nj&HhzqyL0V zGFu(r^ccg!4@9w`ooHG~O`r5UO(mM{;{ZP8WmpMJym!z}nZHecUI2+@{%-wwH<~H) zp9nq6{7>kdgWyAD{$D{K+%f9(Y`ALp1={Cn<(m&8@H)nHf{sEe>u}>o-N-p+7Ye3Wm0JO1)pVKu#0|m)Xz=afTq``E7JgItQpmG!g0gj& zRF$I#lj`wN_Y9_O9k&IR{UrRp?$WC1EL%QY#&xoet7shs>krHRJe;=fOOYeN6`hO9 z#eJ~PAiI(LBdAb!c|_Zd>^JO#T}yuvbu7D*#aBhX=N7cU>gHc|wim?xW6Ctiu9$7x#qrM(T0Bu4L2o>TZav_XK?A zKMBx^8Z+F7tx?@gk#oE{xBX9bEcKw zN_T2Evm03B+f|=s?R)l7d)PpAt7vfjF^8$e{NNn0>~-whJyj1=#vlJj8M;)PyUgFi z9`2;?-52=)we(2O#_DCvLhsQoq`kCG*G#ibe&1sXjDy|BN%KHt5!XFBOV_Z75zEpB zVu%M2r|KSz40`Mr|0j0tG%Widg!j6KBK%fIOMh%1?7yK#x(VY+X}0!o9v`OvBSJYGTq)6Sba!8)h!tGVqbk;p*(qE#?=Z(yh$@Al? zXDIWHVVT;|=`13t0&%|X1kPiNGRUBoL=8k4CoqmNr z_o`;Fzr*y;s#cSEV3?UpZ=LQFk9c+buT5OI!KG){`NQmVHmmB2x;Mg?PQ=k| z3K{=UcO}x6(@T&2IXIy*J?y5DT3M+1{VL z62xNX1&+$UrfmSR%z2d3{yjMX;xNZynD}7gi6C&Z#V&j}aR|g(=Pt5+G~sj*8=P*A z<(>&&0I|uvi(YD}iI;&o*4>}xQL65GP$#&pbQxR4zYeO$wb><~a=!zr-`&GV=U3An z0X5+Ml~Mv~;xnLf?nc@us3yJ)s_0H)+hwZZbx_;g-INkilm7zh6!%{=U|3ClAJplt zpCeVS;{Ld0o#`q%X@#2LfI8PbmF-ok@%5n2cW+}0W7M>1pe}NsWm%P)+y-hVLh(oF zMSzY_=I5du__9uN4G!F@lU!c|ck3kA&cH)D$#pUClumNZ3;a|k4`T9HI(aCQZ|Nl0 zr@%jSlFLp&p#%87kI71%tb#`d>U5HeKwyeaGTaB6buz`|e4RXr$xfYQL=POHle?MR ztdk6~fgYV?unc5%l7TRAvQ9F{1&PNgt@y$t6rq(n-$l zza!tP1+40(W3YjUZBo^jGQ$pzZF-VM+N`R-!i=Cbc4nbq#XddU zp@LptIP(JMhC; zO8I_CS(JdDo~X(TNSU4vjOuAddTQDkRMm3BRIS^|s%jaBu~ztO1lm|m+51COfb!y> z^EHh~1%he>7Xes4WhaEETFLE40Ay=qLET~+FuFoprXh1q1f_Y*%(zBrQ zRdB3CVzL!DgoV71kKu&RyvnWk*n+n=Cyqh7%)c9b4djrFpU4rpMolA6ypiUn{r*-H7$K47v4JnCmL% z1ZY-&r6&B&9X=3OX(Hq_v*c<`R9ZH_Lax8Y=RyD^T_64_C0$`7^9FrAU^xv6#EmhY zb8P2)Z2jtQ(pP#u=TMAN{ns?%cm54?)!(d%fb%O%;rd(jMO@H%9}8sttx=wl%A7w@ z$=mep5iT)brtI5&-E6(G{*LgZXscTo9vT)g4Vm`!aNzn~zILRmV)c)Oe@_wnVX*3- z5E0)a@dHiR&OG>G{gZk^_?^pXou@PrFxGim6G7(>G{_HiH_Du;2pILxXd+|`@~k#U zwPnA`)}Qkg*?M*TFT-uq(fUPfcOi&M7-S8` zxy(-wE%WQaTTShL=X-~;?fO54^I(kh=Q39PpR@_A$N-5yYXW!Z7J^j$UwlV^ttwRi zZuqN6m=^yox-6$+|EOaDZyqVo4r2MJ|EKR%Q|p89OGrd0_aoDYvj&@|`aQ-o@y#KX z#Z_GjIOaZy$yq;E zx$H@UdlspPDQk2;6#!LZ+MDL;*->k#=`hGGs8Qx$iqG&aCY6ki_ znSGhB#&NJL_ZZI81u9yGBELJ0vJW(Og!FKJmmFZN@Wm8%5N>zT=lG-arZ1=(9){wp zgCH(Y6aJgTT@YG-vC`j8#~&fFQwZ41s=wUC@%US`?$t_v=@u`t>t7M#3=%g9@jmO^ zCdA}25Z@BwPBwbCAu1V)?t_v#l;Jz}PEN^()%aVG7hg^pkE+N+94xxan;xfM^ZTs$ z+Z>n2l>1|pRC4kKW{NOn#dom&<0|%d7IL~yDJlFOYd)nKBFKx!=m^iKY5ib|zfPZg zUd30Uq|9GQO%~Gcer7DtJc!9ox2U=|{QsM1=RG{uf9Mk4YH9s_lP*z(k)f#k`*IBFWFkx*o ztoBwIh20%(6qsW>Or;Lg=0JdfInJj!ZbXJUuz_9Qg6{O;J+~c0t`402KDw@soU4cZ zz@?g6XU*%S7c^GrGd3#4wJ46c@tMX(in<75&d1wWwsD@eEa*G&Zv8LJPc>b9rg*>) zp^ch8?mSfElK3Lt2WaCr=}7h-XkJ=(V5Vx{+RLM0uK8ss7wXtrjszw;Fqn5Agz>0$^7F4XnwX?6$s;D>w9Ps(M7IOmA zH3X#~q@`78=1>jlE=1%Ei;#d3QeLMjDvV483E1J3Hc_e6${Oa6nGDIT6?LaAf`Cg-ZRi%P)TK9!K-N{&^IRYb1*NzeeZyqc z(FtnjN>$w_3a=lP0a@dR^^qzK(hnggh#7>OSXv)80RUH zuSdq@Plbr#4p&r+si>@=W{o0QbB<(B^Q%KDI8r0_m_7q-HJ}O}D$!%28y%^FHAFX{ zvnhIJX~qcOeq&%XmhX=))85j@S$areo8}g^$n{3O$sMaA!Nsx5m+B6;1WNqDuKUhX zxM6E)XKl=ew)4(VaMyP2Dea#>1N)KK#Y<7p;T2$xo8*_4y6v#zoDzz5oja--)SNe3 zr2^ptg_YT$P$xK%^+nO9I zW;4lRIy=}}%nuE2N#wTlB~DHa6Qr+YB`0Mv zsV%L=Os;iXHov8HIIB6A-Lj*3AU!y=ote#r?%r+4%NNswea&0a#n$$g16tbl?@Je( z^KGqw)?zk0(A}R*Ll2}1t$p3y&B=VGc`!SeYEC7)(#;E+JKEY8G@mr5Ig>mwn{ORR zcaf`g6j$qlmX4P8*7RWaz)(->|Czpy?xXaswXmb`zqE%O?*txIYwb0Q{`-I~vQGWEtS;Q!9O#s3h_Y43FYq)(pW-lmRUjeX**?kT@L z-_zak$y2{jzy`C|vU&>x3A3qAbfuGpmTvC53&kG%L3A^ArY-$E3Jhesw;+X6MxwYQ zmnxVvxO!5(h9jR!4HivycQ&6&bZ6#(!ubLFJM6p@daHpPoV$@sqzh>fIC>2YrXj{u z^hD!6P_H+M?rbKL9Yi6HR)s8e!2z^CIoLCRqd=)h6X#Km15`3c(Kz>GT9|~%!STW* zaN1y};dCg*k&1*KM3A_If>n^f4LTBu0=tSdS8b#`%}mm$ggjh%TLFDy@-?bJpr)oa zpn_F_Kx05P;Ik#zJ}xjWSRIJ91p>ioD645X9H*R-S_i6t?F*|wD5wJA*@5LPf$+jW zXlB3$cNlqUimgUfcphKt25KN_Y`i5N2yF(}lwdr#=-@Q+eB&X-mud+vMwZW67^sAZ zF~KQ;@F6H&90>1c`$kFofYNG%n?_}x0|iYJfvU-PrXdiR8c_Q)9SBZouL+a~#~vIA zbOg%hBLh7Rw%IlWbmxW=g<`UpvI>PnE}zO}3&li{!D=!;V;$ zSh@PpMCXb_$-6zZJ(qyZv%=k<$ys7^66ZEDxVy%IAg3_4@%RTJ(Jv?=z{@z^Qn`pM535Uz<;eo@1S;V3%SU^ zk#7C^#L6{^rR$a@IybCaWkJzye)L#)0zH8~ZjmOtIq?#y!DQC}?Ae{j!5lg(4;`V{ z5N2unJa&G>*17C9ScuIaU-Pj>st0NeB>SK)PBMeV1WR=Hhq}O*%q9BL-HCiA!AIT` z-CK)%4^Vt&B#x|Zzev9{`*PsoZR6J_~23qcbm!Vuyw<9iF~ zlT%_nT#$4l;_l@uxEU#Gs}{xJo$J?ij3j4U#_f~+T{Jdr{c$-k9=tLIk1*qC{Pxhb z>k{iXEZJb?vzdf$M$b*?2FDVel099X-}WalJuz^47UK_a^u%AcW@Vy1v1(nXl`QPY zKz;%K(UmNuI1h{2ZJ260hzv8gC6=sOd)N}Vugq)4hJtPw&YMpahBCB)8F}r*n0{6^ zS4`&n*g5T&dTQv|GL-AdZW~1Zs2wJ0x|q!yA1`$tGlzHdBzIW(4#X~)e$|@JPbD^R zYS4+qZPleTe`CYMf`#XY}Av==e-<^Xd#<0>!Uhj56sx0pvL-Im;v;&q9L zH3rsEHP7+H2JxtpvI`Jj5M|jjKAXys@+PZw4K0n?$}aXko=pB(sB( zqr)TycEr;lE3qw~MqEQk&h+K2o>bRRUt%D&HHAozVII;eMp1`tn7JD<66*-sVBAjT z+D+VMP@Oji!b~3-^3B{bk#ofB5lZqN6Q*WYe|Er&dJO$LQm|Z!46)Nldu^sYvk)GU zSh{gVV#%^)>m=+Ja!KgGHB*ObXg{D`gkCl5BExZTeX6)F)q7MYLmg&N9^qRIu8klv zb9yP(>xh^&l`O!bMN6-jxJ2#l*Mp5a3K&c;)QJ(Vpn(T7h`-tHkqC^IhjPpHV$n;B zj2I3!*_KQfv7~VIV!VRPT>lR2{<2nXFquioE@1tJ^(^A_*Fgy)@(A>tPG%CBRbS6) zy@3$3?yaAd8^FFUy%hm6+npTXEW?d&FJ*g+H$CAi}-0VRXk!0i%xvaP$nOOJX<;MDWHKZ~DQVec_7H8YwTo^I_D zQ6UFb$s}{K>(%$fUT4x6bQ{8lm)HZyivt0#|K|kO= zDT|4SEywVd#G4P?Brwxxvu5K4?fq+4Zs=(y_t5*WygWKhVwyRzfwO4u;hJ!M0GmgpTUd)Xp*Gg_r>xG#c5O^^bicFV;tzkFq z(7Oa38yEo0=@R^!VSVSQGXxj;kuVH3X#>Pdj2d^bTk+kG&O-n~MuFREW?;JYFmx2V z1`=(f$#$(hHVYXrN~lP{NZCQ`Dli@h#WXCth@iz~+|15Ge-cZx-dUOc4ttZ1WnA>} zkFge=-jWzVu8#Fw6TPl2S+zW|X2pv2%Qt{8#T`68u~X~EcTn-+1sX~rxQ?vVd3~Be zAju;iQ=5Sox*09Z5~y3!Z04NJ*$QoWrWl#D_)Avpa9pHP130Bq8V(@dI&b>RU6)=5 zQOFt8m(LC{UM*YSnOL%NU8)ZiQ~7nNB(z89hJ8i?&}{8&I>L{fsq_H^!mwZ0%MoPh zk(L;NpoJwev2kCSN5Lx#48i-Tuo-K@yg5ld50gD7Vw=bz;O0p)>th(4rDQ|nHN3u) zYHR9HL6pRxp^-$AFVe(#&~Ag(c-z+Mh(4vhKpiN=+;Z|s8biZi~j3b zU>4oMYtxr6Lt8>G5Gcs# znFBGYOe)`pjo1#;J1W{{A`q4u%uy3b%pB&_DsdBRS!7K!ffvUIZmmrarbFw4wy_1O zar$zp*N4QCojEr=(39bb69Qb^404a!TgdUah3yL$4sC@|bIwetkcbmO6kWlJ_J zk@cPplvMEUeM%O7z3s&oHoezYN6+*gm|6Q@=^>UmoMGl{#kpm8FqLE_Ni0qG(KC^g zPw9iG9xJ)PX|wRGuy=s!DGVoRY`rHN-so`JWAszpYw*I7XSqyY#ydFkysHDmp+{_t zcP>~E*Wb^_`AvR%TgTk^jC^VU`{>ln_%Tb?t=8Y=FKF(9H+J{O^Z2T@fF~2;9S0mR zcfo?=;>{T>_6K7X!zEL5W)A3L|4^n2*gKF-7Mt;uz`=!VZ?QMWEU@+dPE*gpT*kW)p(kWUjkF$anW2jIY_Z9*}Cz>`w`O@#Zxs!SU_jZYVyI=!GD2 zy&7-sK{PDG7f&W2K&s{j_2L0k+&D68`c3Oow|La#{8DL6sF%69W6$4ovs zbr0VLVf;q6X)qbq1v#>Cc=YMnoC;(Nd+HL?taWlGqUMUq%*l8+*RZJjk^b2IPr+0S3!M-7~)crHwxiMHFBcDDx)Wlz7$F7 zEd)*z=+7X2<*+0yj5;#xRe(5*r4x5@xF1EA61{1jk&D zDr+USCK)2Yp|2hBSdF z>KVdCuh+Vcn|cUj+3&Eyz~nM-x2d(&_~^nr6m8;eHg zJ-_jU;ZqPD9)3?3HHRNu=9lzC?zUkgZwmkuQ4~!^(|Jc@WaHACSLj8nZxv3L-7;@@ zmoj=G0tfbkyn@HDz)V^_F25rOZVvnK7YyJZ833+9=61b9JI6@)0vqHNWWNK|Mjr!E zT)F`?tIWtINA5B797Nqz&g{(0>P2Duy1Fw>niD$gGm&bV$s7G_; z3k0(Ui;-zoYOn9?ynThIwz7ruQq& z-IqE2Yp+CY9`|tzWj2$>KT5s}pjB~_m4&=VZ?O&2=y@Uy@LMK+(Xx*XoVQgO=`}Wz zc(9)h@YV!tD=li4vf=A2X6a)XhhFdeFc>)FaMI|tPj5y`#F*2a_9`vuokQocR9K+JhIKaz3T1a?J3Ppe&2yy`-x8O#1?LL>0cQC9n756QDCZ z0>~#v$?HGMcQ*Jpl|TFVV~lbhvgq`c&}MVEUAilbvIPutJx*3$V~F- zN=r>cGH}51=G9hkOxfx%ev~ZYuT|qzoew`@rs~yrHF4yTRuRfaO}&>NKdh>u z$xmOxpEcu00SrxFitssskKdd%mh4l#FBtc6p)sdcjW%CIs_>{EIHuJ4^8Mf?pN9 zS@0gg?+gAw@KwQI3ce-yPr)%5aLRWD7YVKs^S8$2+kCoC&)iAWcgY_{zfV369x7Ed;t0^q4}eLEdPq&Hv}ILd{yvG!M_XQ zxei^=5j;@vP{9p?{eo8teob(f;4^}+3cexuH$na!2lbmPxK!|1LH<@7%eM-CPVgeZ zYXx5rd|i-#Sjl>O1jpcUA=2XoX9^x5xLk0(U{WwE_*ua(2wo|8v*0~~-xqvd@K=I= z75qqW3?>luxkK^@;xc|qTuU-y9GZKEJu(gf1O~XV7uTUf}axHB$yJ+3!Wx;zTlOD{C!`_=TG1e zcL_ct_^RL=f`1cKSSH9{CCL9Af%FW)xq?dt*9aafm=@eB_&LFg1g{mmP4GTJ{@pa& zc~S5;f`1YGmtYWqn|u+$M!|W4oq`($y95UX`MXc7f41Nyf?pQAP4Hep{-HMcpA~#n z@D0Jg3v#z_`2X< z1^+F`KT4&Z4T1{8X z+$eaAU{bJ8Fe6wH+#z_H;Mszg3VucK8-m{zd_wRA!QFxidjjee5o{D(EO?|~mmq&< zpZsSE@`oEqKPvcp!5VBZnBOSKpUNYBv|vH-48bo8J|Os#U>Ms|)~grf?_!faMld6I zp5RS_cL}~OI1YOo)@u^%6g*NeA(#>TjNo~KmkZt`c$eVAg3k&5LhvoY_XW$ar(*l# z1g8qN3oa5|EqJ_OR`7Jeiv_56Ex1f@v*1aBrwLvlc&*^q1>X_eBRHOa9gcSR6UoFOLH_3# zq<sadaE@Djnt1^+HM z9)BN8z9oWPf`fuz7Q9XHUcpBM-xU0t;5ZzTDQ}+OQo)SiWr8;d-XZv);8TJx3I0~_ zZNZNOD{xj|J2Am&f*pd31Xl@e7VH%)2%awZMZv2CZx*~;@L|E{1b-p;mf-t>WjNzd zuW^D?1=|G|39c4AMldb7P4Fzid2u7}IKh(z&k@`yc)j3#f=>#*D)^S*2ZH!H0j+17 z;3~l#f}a<>TJYMQ=Ly~{ z_^9CXg6|6QAW8d=5u7U6CU~&m;ewk4GlC}zo+G$Z@Or^-3O*qC1Hl&s-x7RJFfh&N z6A_#)c#z;>f*S?Xf~N|8LGTK}n*_ft_>kZa1z!<-L+}H^@N}a`RB)$o71m6`LGsCoB zFW4kFM{tSY5rW4E_6rUPo*{Ul;5CBx3qCIR2f^S>)9zHkHo=1h*9smd*h9o#uORfP zMC>8X5IjfnFA@4O!K)?zHX`ajEBKD&zfZ&-JhUGW{$E3c+&aMqBFYbt@N!kJZF7 z=p}R?5qfSB%t`*Kf?pK8f*7!@n}z;15%umBd_eLa7y2o|=Oq6%!9Pg;p9SBM{11gz zvy9vz5$#PTLhosU&4TTM3j_}q^jqM^c!mVA-PJU?oH4j0@k zc%0xiBJBSe!7~KU7Q9Gsr{L9s{5=QOyGQVT!Ciun3ce=z8^J#a{#o#!g8vr8Uk_=y zLBT14(*>Ia+Xd$fE)-lLc(~w^f*S?-lSK5FtRR1znDohl{GB0=(@w#w1@-+J^6wG) ze!*RW{IBX*?`6TC3%)1#fuP?ud?7(saDrfvcEBLx_@U)to2T`Q6Jc+J6+ND9MEC_? zY*+gUQ2Pn`Q^|awmV&xN(5Dk2&uYORR}_<7Ks;xtvENJK`IDm6 zqMrh6>B6snw%{q27G|~#-#&YH-+N{2Cv5k@?p=KEqiFQ?_C6R&FS>QHd3IlaVb)^O z$*wLuO=I*lIrwU~luY80n?5{KUQ++#IrtJWg>LJ=41g)D7Cr^T=P62R_2%(xy48Y* zd0LW1d?(&Dguh>bHUE!a_*Vo_^2v4#m4v-UiV0P4DH&0@;E&`{T@f! ztAnJqs2OwI8|;#@mrK&*`y2**k*9n~*$YUQwtFMIcQ+bfyVZDm?Y>b`2TALZjuD?A z?dkM7(xvit4w=|QdFaltJleslgQR88HhfI;<(2&d=~8)*Lf%^BQC=|6;MGC4 z)d6|W&~Wnd%0ft#%BzKA%m5GNMe+9J#Y7(G3152_!}mE^P+xZz1&a`dg23Prrk~hhfj@O8Cefw{QD_ZFo+R_bcG5h9BVg ps=r~SylTAJW{DeFcVMF4iahT{IecM@Hj3|j=(pM{M46ZT{{RR7iI)HX literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/analog/fsl_analog_pll.o b/build_mx8qm_b0/drivers/analog/fsl_analog_pll.o new file mode 100644 index 0000000000000000000000000000000000000000..f1ccb3cf63c75ec900dcb42e25749761f99d15e4 GIT binary patch literal 32344 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 V|MKK<3=8?zLO=e7vG?+l{|j>Oqx%2= literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/analog/fsl_analog_refgen.o b/build_mx8qm_b0/drivers/analog/fsl_analog_refgen.o new file mode 100644 index 0000000000000000000000000000000000000000..4fb86d0318c7ba228eace2e90e051641917c0be2 GIT binary patch literal 36512 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 OZ#(q6)G5s2`+or0NtO=) literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/analog/fsl_vdetect.o b/build_mx8qm_b0/drivers/analog/fsl_vdetect.o new file mode 100644 index 0000000000000000000000000000000000000000..6ee013cb048ab05de1147f76f1a85c86511caaa1 GIT binary patch literal 32216 zcmdsgd3>A2)$Yuz#a66Xj^fCc<0Q)J1mY!o!j?Er0)d2tED%;jwq;wyvV z%HB}+ofas2;e$Y-KoiPVplpS*_MiEsW_pIKoV*Z%t&Ycgb?KH_jjY@fqZM^z7VWonqTB&Cp zrD{#4{ctV|D&>r;nFi9M{d0x_9AEiJWL^nYXL9XIlz8W}*z5aY2vF|(91@)S%JI=u zn?Z^17*o64@gu7TW8_SWp3E$#Yyt#2->SmL%;+`9@}5b4et5iPPceTdE6s`C#jNtO z6Kj<6dwr?C0vR5xL)lm#O2$QB1VfqkHGGz9bj#^R``)RQRL@y70_mJd2c8U2AziZr z1w*{vA9*H1p^9Hsg5##(e<8CX3l8ti!jH;^4&6!lHiL4j8}SChKc!)nfLu!Z-IkxziD%3J2$f;^8dKWP}0VA{DB_Vq_h--pF9 z3bp>`@()oE`T#!TpEjIn6^?IE{^_PIZ|DcGihp_q8!iteVFCa2Y7)WFkua5i`bZL0 z;rM3dpHcAO&C47tE zGVfdvBZkd`vy}V$%M+kN2^i78aTwDobTUU^lNApkbe>_yqLm*1J>|E6F&xh-|Gi(4|D8%suA@R_Q4sGM zFX>bf7O_T+`Cun&^88>v%={vXd@QP+h>yu$|9YpKosS+&e`Kdo)WoWjp?&r|ff1NX&o_>I?+lXl5zupPc zlb7kbw<+f)CpZ^%e&f`A&JnuZsd^9{{+&~I6b$FT!x^#&rGIi@Q+lhh`vNeO*xis~ z_md#f$BZ)XIDAGvfC6-_5_V>}!*mFFSd|_(z=PWT$S{$Xu4E>gW9d6wTB$%IW6~I1 z*NyItyaK)(^pDr&pMoQ5V&z0VjD(7QMypKHX4JjWKXLRLv>Eksw8ajWc`110B+Qda z|9oA(7d#_cOS3P~VG=5OI-RA}QvN7|kbj{LpNyiQ3K9+kgQ!~ny#FMpERI2l9>H-v z*{R(D4i(+W;C_k|=4g4NcOY!|Pj#xuSROqWpZ?RF8V2ME(Vuc%JKZsp;DG264DsJ} zrgG6+8GVZ#Kf|fhXmMTiPaL>2oe1YiPqdrkc9x~G(R zoD1hVRVRWvBf5>wah`4O+US++?DuTF>!X`!zpa+KEqWj< zoyuM1)IJVsvkEeHGHJw&Qo$YIq5lg#YN!7@j)zlqG=qWvBBz2QHM*H2c(qf(7H!)V z=%%Suixmi}mwA~phO^Z;Co&>PmwCAakKwd&9eF>K-H6X1{b&smMv$XoKjr8&d5nPA zXoiDk&!}giNbpRw`yH3FOvP4U#LGS}iylOMSa>lC$EtBJ!?Vld!_Ed3&|`=Np>hm=AZ3U}p})XPfnyDE zK_%R)hRyVnpaL(3^3ZHP6YIHp0M&k*ZEX^c=HV~C?dm6(u$tRdEiUZV!b z8KN`vCcB+8L{G?JN!}2>p#`)~!4TO{h(y033ZV%kHX34cs1frku*nc7gx1650-FtS zQfM_5-C~GSLr>7~#~b2|&>mFuTZT9%q)41#h^?U!B))Bk3qzBr^>++$sdAQb7*6!i zFUH03F{CQ=9EPdP%P2GMc^G2IzbZ}o75LwfFMpa}w&?(jUv;wOIgUKvwfTMU->P#> z+P4mF<%~nHt-8P#uE$VSU1rj;IBYrWL#N896G!9--)EU_gwux~vg!B06#ltQuSM(O zCrrPb2hd{p1)INs{4d+|C1^4HhD~ondiYkG-UvHXZ?ft0(B0}SHhm8QM)escU0Ggz ze&8ndJPZp~Ur>7&>Z|ejT!*T@u=YnFw8!V2a2lMV`l6xKT6-MtgvT*ksxP***4_zc zLd)t)gjU}1*-lk`Y1Kb$b>D9)QgPM;fIZF$~-FY9;QTO zy!O0Hd6ZIL71=`veoc9Y!3`pfRzHUsf5wPLnu-}t!>P!PH0zpr6oA9qunY!`v=lS^ z4bM~GX}acdt3vtYj@}I_GDBCfg}@XHU1X+q$F8#BDb}B*-NCDDID}o8?Pho?Rq!@Q zdKZ<4?!cgURbVSyn4>+jkmqATeR*U*9XJ#rWlDRhpdt%&CBv8Lfw4$yiA8q6wId6) z>x`a;`!Jf3HXT|66M4&`-YKb!iY(G$Is&}chZPnc5Lv7}pRqwUgCSU}1OE%D=+96q za+t0>6Ahw&t2o^2w5JDUJ~Dvy7#;X2S=(sL^}6aYxTTuh*Pm9Agw?}Qf!WB5v}?}= ztVnirsz(PVLtew*Xp&=XMW?)686$2e8c|Q_NWrST(kHLh4V)2?v};7AqXmw7pAJ!; z7vYlX26ocVGTQS?w%LS|dL8N4fnKCc6Pt=nC@XQZD-jbTa5bV&WQ+DJ0K1QM>SK|U zbYRkOx2q@XDy}bTayc!vir$Lakt=lFji9QdmGqG-b@X;n zwb5>tU1h2I=%bv3SL=~?qbwGkizpGfMvuH7)P!gad@6FCuHFu6a`a+`j_a*AO^r_E zbiBb*EzwgsS~u!3T&`zEzYFyuH|a4?gPI#X9Rm`%S&x1J)IQN}PLNyl=vP23i0;i6 zZq=jz6V#&U^H^gdx7mgCfas&}@yPAk#M))i=Scn7QU^DzWea!eVP+w%QY#z2$4366 zn6auMO*`JLtLf12%QX#k?C3T(L#=6OW5zvhM){!)Z?O~ix*6)whFbRcJ{_*&+EK37 zH9X7td4DnE@P;_;^^mS&7|><#S>7LdCYrkbAvHHM~z3+u=HeKC0o* z?90P$hVSTx9c=ayTsyH@k8^axJM8;oy7GRu;_)5R@MjMF<9hi0kfj~ZF%742^q-JP z=ICP@-r|t|LKO2m@rE91`lRb=I^M8@1NfAiq2ic$A7eDiye;PQJV-3_c9_p?Xr|12 zEc7h%K4Eh9h7Xl_e+PYV$7s?s;HrTSXrHIGXD$fe+ZfYP-pI?^SBLD;&tct*ykZA; z^p)(utCnCic|ix(fhqbZqsfalM5=}b?A1$J)^48@y_miFwKjVL&mNzm0fgKO=tHk- z4_n!@Q%8QQ0}oJEf+6kqdN>JHXKeVEwPCHUGY!41E1yPTovsUW=-<(`zXy4suH#-K z@&`Tahj7+axbdTIfpXr0-`8AFIf-S9i)CCVYp&r31)C4$tc26nTogV8T#;F*T=*LH z$z->ZUxf-amxNDp*{}N=b|amaX1sU@`{m&~T=rjm4Lb$bnAqu@htaCJGW@2??uYZ+ zehujUl&iaRU>S^2b4@tRdBP6N`kFeIvknX3UEC8o8>q(*OeKeFLCtmH)vkbV{W}3h zQEP^`u{El>A#7qR8@=VftD~GtXyhBi_qt8I_V3uaM^(;8aKM_I!|%H6K-T^b1 zF0lYzVl8Jfe7ok>;dOL)Dmmk;m6Y=$B0%@AUvPz9>=Y{C}O~}w1F7n z9K@-bhr)d>`}zNlojVQXd>h-ln(g7MT=vJlhW#ySWSX#^lwxZShhK2({O#Y>u}!=d z0Q)1Acoc|Pj}P1b0im3#%9%~~eyo!BgJTvHxdw*EHob+R;EBp*@WYYc=GsT=2zJY$4ACu7rD^PEk;LYXgEnRCeVtIB66^Sz=> zz5lozA8zFRghmaKUIC-QMTi`D4vx zNaHY0kNsf$^&q^V76z&hN8JIUJQSfL{%PV*K?Fn1B>p`1F%VUuKhTN(GWmHB)uG>T zw)}PM8z5>!m$CCZ$Nm9CeP|&Tyqb^3d;}sEI-lX_egJBHG)b3nbnG@zozZ0!winbR>p-0oeUdE<)e|Rz+8TYBWtDnt3#bbb zioZlJd~}2|FBfIs)h5X`*mtu@a((q}GfA$UzU?N-bH_jv(?tP6WnPhUVNgl^!n@KXF`wlkA zolG8Xk_@uGPLpJ?^kqzvfzWrnNixX!PBTfyF5gy@WNh+XVUi3$z8{$+qm1uAOft>n zgC@yv;(Nj*Z)WmWCV3B&|7nsBGx@$rGEDeBG09Ju{L&;D3VZ?5&JP1 zBh$P!DdYu~Vjk6wmHUg2A-#5-5HZN89dC*H^4f(u&^#6gTpm|z7s=Kd&qU0%MeSnu z+5#6Fcf%WMm*`5yHH~M~4cw;I?(b%Jbi)al5VZ#sPbW@89im3<(qe{pN@u=9)gGuT z@1YDozPS)6gR9maq&>GoYacbKudO{q2cAL7oYresyGPjGWS^>CBS+XN>10~ft}W_Y z)$k1ab*Otb@KrU$FnMYZ(^aQKvi7N}hJz3UYuD+j3z*^fhc%o=BOR`*u4RT_4V#kB ztJ))q9SW^ZBl!FOIehFo*t`*{$*A zj`S=Dz7CG1NQ_m!{aAP>ZHN;-^MV`ku>o)Kc;Asomw9)huf8mjv7uUpnrs1w}Y`7#M0WUb@fHa44wozVH2?aJ_%*& zF16QHp;06*GlVzvk_W`)hA0nx0=v{*VThn|mO*aam7XXBK++Eazow*z9AsW+t_M`8 zMuWJ%mggKNbRxEXbvKwRJx^!_Myc*chVX`lA#Bv$Xb4~E3ryjx*eWrNLSX@Jr?)_ zMU28=)jc61?jZ3CLpY(u@WZ+%&4loV&Z2dmGK9}s=V?RuLtN+TerdW<78=eGc*YRr z)*#OsgH$Q!kK}vKQ()^=b-xX?OhW6|u#MkK>kJQdZ$(((wFC8bcs7Xg&|PrYx_6@c zfC$1ME8qcTUV3Pm*9;zS^XlI9d`#I+-3Ngj7{fi;w5t1)F@XyAlK8VBaEBg3kgEHO z=U}i^me+j}_#qOu#ZN_-HB{`sYFNOVM+$W6=?9;AzGG|sEAR>uVaol|HWKzQ~oMx}8rvkh$Zlk0psaCZZo`#{>E%tl=meG(^=Iz0AekvF=E76{m~@@RyvHbmFn zkFsF&VfL}YUdvQP|AX#@dw3cl9NkHG9croS=w)6|l~zh5Iuf(GE@Y{i=p^>5N*jf1 zqYq+o)(z89_M|?VBo(%06Qbw(Kn=I;O^lk^QEjP7Fvv})QRZEU&%jf3-4WXJ4uu5k zX6t~SjDA+LFLU(>4wj0Z$ay+XN6Jv-jdoM^UiOZV9?oaUKGq7HPhorGb{Bn)okedt zTMy@9D0YS)#Cdwu&q!n;wC;Ruo=(S3Byph-u$ij6#K!U1gS74y+B|fNox-kPE5!LE zZV=*ctaFPHE6PCJA;fRl=r&6P8H(A+y=yz{e3p8$m1@x^$ct+-HE8hCbse3Bb#Epf%bu#xAkZxYh z_k+;4&i)(#7KH{>^LH>;^sS4TcQok3@NP-wa!TJ`NvY?8J`?Y0ccBLMVoLJ^ttx#_ zVB8+~-rCbBxD)hkcu(IB;sqq0!+XXnAl^sf9lU3PRgG@smmF6*{rEgY&zhxIIps0P zrot?D_^|+Qec!N=$eX?|K1O3I)Z;ySDG2BM&S{qlw~yRV5k2-@jP&#yP%s0W)9{`- z8wFo&PtTmCSL>Nd%{dgz2e2~UO5YIt10{4b6FE!pp38z6dE~4Ibrjw+P6WZHj;D|~ z8^lkLxEpV!=Iw)zJqj^H9x^we4)4!gkdBIb=%>)$bHbQjILxn>$XO+RMl?+HA10 z792${nvL0nV<6u8N}AsK;OrQyz7BO?#=H3l%AVaw5xYSD6Yo|dYOWDA3B@tITNhEg zd8P}Upxg1Dhfrt6v}daIqe9V-bc>pYNoh*Y`D*C`TD*Lxnun1$Ja>PE2c8Hf?}CFS zj8XFz3fpU6!`1>e&k*>{yp_VW>ub2!qTyP&UbqHaekIC$ILQu0N!xtv4fw9!>2G@# z^NR2CTl{U0pp@_GkNs^IAtdk}JjJi{Fg>wyc!j5OWaZkLVY&*Vj<1n;D)*|`yJB9& zQe41$Ca8*v{lI~lKT9#kH_3os3d#{nLf~Oh`EbYh+O$sZuZf5OS25K}dYB)tJEu z#BCH+U_-H)CHeECwCC8d7~OG_Z$`%EkB5k2hbt51xISY z9+M`6vmR9%N|hO?g4NVCV05JDDWw?$e0vOq(OAAGx=edZAE%ljg>4#}^!%u+6iq!$ zhy4p`FIi~1+~h0ihg0*Dg>b}X*bmVt*xX+9*A3_$qzh!U~F9S8;g7VP?Fh z`_#1I!ZTy$KzinxCu{iqG+27pStnzIS9|_KY_nz?79{2r<*lt5kT$nMuZ2?c+{zrN zy_(>E)|Tv1%rv`qX;%;>O9u^swX{=8?N{0#Ox;p}R@{QYb{k~1)>7Hh(}h;Sixx)N z!L}wvN9n6{^@JNKjVOs1LL%bMO2SsWz3LOa@){)UOPE}?L&$a(-de38xHS&>w>4G` z)Ht-X#;Rfs1Yz?!9iNVBxrRu&P|D<+q}?ZsGwIa?>|Makwa&h@*+^iWM7_0cCKf)E z%?cGNugZ7TF&2-##+5J>5-!xmY`31HDdFxQJi@Au9>gYPV4p zF2rmw9YS!K1_n~YL9}8Swu`XdamIQR%D0ZahKnM{#;0h_YnWtxzcTAjv3uBA;KkZ# z#H8^t0dJaTU#P%x;>L=PV^Tt=|mxw>1!_J`ujG-vm3hO z$0z&q&F%TDA<~=YHW!lVY`ncc)!P~GOy!zQsxgI<nKUq>Pun;`#9)&85OcYb3> zb1wbO)EoD^|1t=c14Y5-BLMQ&ry%D?8rXFthdovvykiv-|Uf7aN=4~2WoyjiCkxM4~3O2hV zlS{@s(lbGMA!5qp zK0{psO7$fAI(u;pC>3dAJj#bCmB>;w?l3SVY{KT?XkimLX|Tg^I27YTjD#6LkhpY% zMUbd6iFlq}MVc!%Qm$q;X;nfV9%Lw=ITd+kYoBlU@M>SVU;Apu`F#HQo`CjM`m21} zla2X&o^TAQz9y4u@=rf@#FmYlNBFeA#pj!fNBx>#8W35xf`Bj-R{1K%`2wC`%va$l zK#G4XGDE(K`AClQRcK!j%~iyF0f?zWGT`6OH`KH3MAWaY9^v2TK;(FSfd~9mo;dSH zp!6sv{9S(h2*Lam3Xayknp$7TU+oKeM#g+2Jn@*Xa;z^j5p`pxfuU#%(wmx0J3hbX zc=T+huNjFZUk$|hwcitnq5Y7jfl7???TePHeRar!?mmC3vCFXWNFIzH3~zEg=y6B3 zKb|in3Q3jE$FsR)Hj^*J3mow{{w5=y>FSCXa*4jYYCGWIW$~rU_m8(N*`K_dlbf?~ zj8{gud(v5jKUauDpursfd?=lO1Lknv>tq$gNYhq-Uh1Sf+{V+Li4G&pwA^`IetIW( zxAfUeu*VnTM5po{@QQe6qL5JWbi36%4&^uFFFL3)lmKrsOD=?kcs^N(XOp>9wkMfO z^r~zp3Q~qMo!A`jM&G+~$>UT!UP#B`?JC~YXC{I|E;4ZVTfI8IbVYpOszvd(HLI2> z=-9!JPKCchh@*QOq_qxC(|EEk(cTMFcEq!=gvrW5J?PYrIX!JQ`#oUhY-SUT!)B0g z_*f&^2{n2X-FcP8nWwK1XNl=~e>?aR*?4!VBc4mg`DYLDj*SIA1VD?(ft}d`$IcyA z(D8h#JKog~#SNiubkmcd2-P zAM!hk5)zbv3xbYhoN8EWwJwdXIt+0vQNT#&lf5FgGZV*mV&d?zL@K9fe0W%%2EiHM zwH@>=B;kUI-d;q5!i?!|hkE;sE15AzUPmFy3b%1(_$PdiPka949EydDPrsyLVsUYvvn z+2OS#xBtpj@zrZu*Qi`39XG9+X$%$Nh@x7ev)%Rco&;txM$1fi{Lz+)5vx`#jZcd& zTh#{9d3a2FBA?`JEo3%fLYh!hC=y-c={$aS;N#*57iGn1}A+nL$ahi+48%=J_ule1H$)U#|T z*wUHUqH@y_{V*`gR4(iHPi(8j3T((#lL-ZE#V=%B^Cm#k& z4#qp5iQ7e4Vy*4KCU(F?wN${U=^A;o2EM~@jw+;zYlW(AKAj5*EMmqv)qbWmUy`#N9}^mbDsRlxefrHnBN zBC~32p)pMC1^lrFtrgu zFw>Ff(O=T|v<>v@V)tU{s7LBv_%?4NcbJIr#3f7SCkOR-|uZDu<0l8fNBZ z3Hop9=xOI}S8Ds-uy41RHkea6%>%xIuEW2Q-@gdEr+oyf{I-7u5f1jj}NyDh`c z0D>4>3b|BwH+C7&HPhFJLk31Zxd|VsOnY8raP+xL%3v;G*HPS+xc<%U05h#NE7qBi%&TqRJDe7#j)76LQji_Pvd8t0L z7qv150;LEY>>84p67wZGaKD;QaWlpxg?}=Nes4B&thm>t!i;^1UgK`?tjvZKLQ1}n z$!2T>OkjfK-Q84<24-Mhfi==ZW@=~~zzI6vo3V44<7cNOXyaD7biUix#b$EV>NR#V zX$H4#)ryrS8V*FjtP!(&Xri{XD_4*><~ldMabqpBE*bA~?FL6<2xWYcExH&H%brSX zPMO7#TLgF`{4m`vepqz3>1F}9r%AAx{MBuP4gg$V2cjahqw6AkVF9&YJ}l@kE+QlC$)2GX*m+``PAl2< zp(lZ*(d>I{UyJ@>q7WBd{9{l=hd0D~k!#{FmnOG=t;-h2S1ehwdhr_YCAksD=LVJU z!9%B5ah-%_2#W(tCMJIlIhdFXmQc;MZ`UBxhB>gRa*^yHynV9Mdok&W|k$w>C% zP)=z$LAVPoWTL0s3z=03g`5rDxlBJ}%%at8@z$lQlHI77%&kf$pf|!TEHe;3W*8SU zQF-7zWKIwehHbQ2F(Atfw9IgX94uJzwO^NcCX z!lPdwPi!W_s@3M|V+~jrC3_Kwuup*B(BJdM;oVJ2ss7WyuEUaf=%AiT=Ha{9{xGv8 zu@<%KhY`;mF>08dF2)gIzQe4kgAPRKF8Xg~hFv}TG95ih9K3qr{xRco2t+1`!izU` zl+0Qa&^i)eH>XmYf)13`u+1Ihf_Ku3S*kFX!1M}7f z6+5pv(@J~?TMb#J6c!W{KjgG$0xdTF-1yp{OQ$!dX=@rt;SA?i%$)B^_RZY4Ky3yt zP8x7=JH?HpduGk!hXUf+{$3m^y7F0`p0HEl+F|T8Xp-7_I1oqeL0X)wWI3YgWx+Am z8Rk&N{q3fKgEo}<>e_;e9sSa^rK^|5*D#itBaAs7uqS47Wc1_UL20WLx3b)1DYNMY zpQ(kri7Xy$BV6VR*uQu8_Dg6oiv*8U9K3#a>r%2k9~^iw2No?}xOV^eqSiI7vdFW6 zk_zrsPswU;_O956rgq!am;iwrN}9=a!Qvj3mE=sp*=Kn$*<{&?FHCjQcaf7znggY^ zg}t+BQTU#?d*bQL7n3$rW^<@%c7b*-6}LK!67Y^BcN@IpV zS@Y%{9cxVEDrH|Rgt%mCOwR;e=;=?l1G{=Ni9#d3RIqP8(^croG7GF-*^M(B^V!DE zX|s{jmuc+B{=%#ljdoLl+(fn`Psnxj?2D)J8|Ne&(|b}vcdT&*N^l0-w*!g~B)TBT z-pIxpyLgwwZ(B5CD?mhzF3y%xnkxwwras&yLny2B3m5q61PHU9H74N^*zJA&7d)B= zUrT2?cynW?u$-)m_d^(R4xKp)+rxnji5!kG!UIkQW;+46fN|H{kIf!jXd~~d5XPqs zqNbb4B)2?v@fz5B$5ZJnPyaYf-vU!unttonjm5e7Qbf+(4H-NmM;&G4{plEQ( zQl93!aGQ$hhd_o21?E9v3}Sfq0^jQ7{zEP~DZEEE*ZIW8BqCs%lQD(;9Lf+CFcp}P zQ;$83vQ~U!f>8t<=0?)pfwKtltYdRxAo9;Jdp?|Naizzdhf&U5R#_oC%e^5qQ;}V8 zhqJRE*S~J-CbXK7kPSr}b|`Ht7B5-SB3l5Lp0*o3eK&f>ZuHFE=vfHSodqlzo8sNP zC1sGyQaKUC1#O0Vaw-YNG!-nr`#m$ml!;Fz5v|xOID#E-R>mF|J!Z-nR`?5Q=^7kC zH!tk(>cVjeT*a-qtz@=0rRFh<)>l_9IVRalIb8CUj2~tjcI#Lv&|{nf%>f1}CHG$g zvrA5XDvh(QISAlTSlo`Zn6WndOCHa8;z_$Rb6~&DB`DL5<5B5U!xEcKcBHye@IrKj zQ^(khw&z0ttASiVV`B`zhx^l0?MVqY{UzOz+i#f4-A=$#6lE@WnGFlOiwQz5&X5Jw zy$pv>evh7m$g7jVOBOh=;p8Pf>cU!fNXhCxZve-D<+(oD8~5o(;6V5S8zkgqw*+Md zpD9pWx_z{Z&cGH)m2PrP|HWQbDE4NGHYrx8L76Qu;uk0LM zeVA3rnntc#Al7&?pK{1)&~ozu$qJ?RZ)@8tHkrGWHT=3_47c>L)?7NaINhGa)7{S4 z%3Oxm7@1r?w%ZpMr~JQcYV2R>?7|CQ-9Di*ICRiYzw;ZSODgf>;OFVCXCJLpG0^Ud z-x_VLjGgK`&3n4%yWnuzD)FZ+s4`}C<}7YpuKYvGmIv^Yb760_9-(VI z_<=fIr$_41cr-ou#jl&XFR%J&mzyTyDP<`M+I|Pt&Ghimc*)CyC*OFKT=Md&FsSv# zoWad|_$a*O<-wEY!S%~b{d0;ueCj;#!q4Rm5J-9W{JZ4kF@F;^kbxhQA0UwOn6Hr! zWO+<$r8F%(@bZ|i1((wJ1GJKt2cyXxT8(2FhCTSLWA}w8>S`~%S{|F7ar&l4!)~^?=2_?&NEDq zb|ua4hC49SSRx83pZWZACgR?L3j|jS9wA8kk}oH?N$@nmvjl%Ac%$Gwf{zIPLhyCL z-wJ*x_?h5P47Sl*aK7L&!6O8_1Wyn=UGV#Y*9hJx_?Y0Y1RYFGwi6Pp7vwL-Gk>;V zo8U^pqXmx@+$4CKAb%~E^{*AYUGM?H*9G4f{8SKMaj^Ob?j^Xt;2Oam!OH}HB)CKH z8Nt^D-xK_sp!uICpx-Qn7V5cBkUy_ZIwiPK@D#zVf>#N?B>1-AM}oTqhvF+dls8h4 zKf6nMj^JX!)q)AZj39q$iTq~^UM6^>;5~wm2=c#kAph?K|0?*U;808ymftD(kl@pT zuL-^R73>h?&+D@MM8R_fuMoUh@F#+g3BD-!d%?d7ej!+a zIZnAz!3M!uf^CBQ`wsG5E_jpR?*;!N7{n4lzO{nwf+q@IBKV*n|1%QuzbyE+;7-9W z1c%@|RphG?oFF(&a6iF=1lI{B1#^NY3Z5f)nc$BE?-tx4_>AD|g6|3bO;BTrqh6JQ zBLyc5&JtWGxI*wK!Ia=e!BYgc3SK36i{O2N{E1+vwNd_wf~N~! zAb73d?SelQd_wRg!JUE{Yd+@Et*JSeZXmaH8N0!9{|H3mzwU zqTqRgR|(!G__5$F!I9YGvYjP@{essEz9?9RKhh=NK7t1bo*;Ou;Om0?0T=Sm6g)z( zOE4#Rui!_5{6#6&>k$0D;Nyb)T|$i{3 z-fY2zf@#5v1+NplQ}7|drvzUSd`Ivj!7l|XM%i|11t$tl7o0D+Oz?2QF2TIuNrLAJ zUM_f};5NaB1)mfAPr(lbKNl<;ZS@)rR|Wqn_=R9agOwi@Y!I9!*d}<0U|cXQ z_$|RR1uqf2L2!rQD}wI|ej+$@vTeUkut9L9V5{K4f=3GW2=)t}EciXaD+TWtd|dF4 zg8nJC-SL7gg8K@t6g*n6hZs=mWFq!rrwg7( zdBJxi|9!!a1V0u0QqbAM>QP1vVBaA)Rd9inFA`iU`9}!$Nq$anljL6^cr6iotvjWB zo8bMD|8t=q7kp0eMZw<){!Z{cBJ})+VEvw!ZY08f2MQi0*dtgFJV)>{!Mg=t6?|9l zPedQ?qox8ePD2DkM6^>U^k~8HlHVlsbip~2zfkBUf(H>HKP7ms;5Nb61y!Tv8$(39 z;|2E=Y!;j&xVK=N;QoSMh5E2txgfUHhQ_wfAi8U?S#Y-CUV^QHiv^DsObGS}_6p_& zHwm6Ac)s9ef>#ONDY#AW0m1EpF9`lx@O{BQ34S5S-%nsa`CD1Uaf19cEYfoX`P){c z%{?4&z0jS4y@FXm{@4}y&lTi<8A$xvQ}A8E zKML{}p;+#5EDjOmj{q~DzYay*LvU}w`GN-u@;}2NAAdQD*dyqty@K|Rnfcgm8odAp zclQ^tnta0ter&^xyqM%;xijUDfRXa>vqy%;wq7}KGPhof&@+W!HRZRY3yF3hz8+|> z$4%jj9|in$7XRj`sU5$++JvuTO^e)>x-)qWc$Tz6Kz2v6kX-(7qO?8*c7Ta&L zo5xE{Hl1j1$5&HIOYtbQluY3JE8X~Fw$aYk`DzXxwk6RO^IdtUqnh}Y5`GP#q*hlB zU+`8<_-0H~qJU?}?fv)*518ry`h_jHdA7i@<%>2hePQU$Yb-wDUU>dtU%T_Mj4v#$ zCSLrX_&BDlQ`&APX!k{5;%h42aDBA^Z@#?k_W1#hEc}~E^JaY7A8*Q=jyGSI;*Dcg z@x?N}GlFirj3Ha`c3*D08<0`j?#z;Q%TPu>wtF7llAu{uvyf3LuM_gt z!N=JT=DYGPN7}7}r21ZyQoOfzUvAlL$Z*pvI|Uu*J-qvJ%WgtOX}b^hWB!7V?Q(v) z?J{<{b&yp5zyMEXLSAm!Pe7N-`z3-k=PBi3$t%ix7HPK*l4{&6J8n$#<(55#bg8^| zAa4QkD6a}{SHIsO?bbn3t%AINAzrvIx9m5_D3v#1vz0@6SPF~s{)9B^&=2`KxJ{{V zaWcq@Wqf}o=<+>zj8ex755eWb|8P7=zeRXxw6cVc{V*@^mFhPW`o&N{{phc5e}{n& z!=6Q!d0hy3t`5vVv3U_ohFv`hz8%QKQN1Xy3Td`k;zsJ!1n$|8=e}HdxSATow+8x+ Kbqi7ECjU3Vz}24s literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/csr/fsl_csr.o b/build_mx8qm_b0/drivers/csr/fsl_csr.o new file mode 100644 index 0000000000000000000000000000000000000000..f28c42b450de00da85bfc856c1794fa13a5479eb GIT binary patch literal 30420 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 kCn82)6v#e3VWh4>{Bg~=FIOLZB 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 A0RR91 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/drc/fsl_drc_derate.o b/build_mx8qm_b0/drivers/drc/fsl_drc_derate.o new file mode 100644 index 0000000000000000000000000000000000000000..febd5d7de39faa098abf56e4155627ff23107afc GIT binary patch literal 40704 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/drc/fsl_drc_dqs2dq.o b/build_mx8qm_b0/drivers/drc/fsl_drc_dqs2dq.o new file mode 100644 index 0000000000000000000000000000000000000000..196f39af21ca83157de7e6630d529e05131d2dc1 GIT binary patch literal 54840 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 b-4{h4h9ru^TV1N})2`13-A|LYfY9!L9vVxn literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/drc/fsl_drc_dram_vref.o b/build_mx8qm_b0/drivers/drc/fsl_drc_dram_vref.o new file mode 100644 index 0000000000000000000000000000000000000000..e1dc61f7e4249aaaf0efac9aad864792e89b0792 GIT binary patch literal 44592 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/drc/fsl_drc_rdbi_deskew.o b/build_mx8qm_b0/drivers/drc/fsl_drc_rdbi_deskew.o new file mode 100644 index 0000000000000000000000000000000000000000..965b5472fe7e0a011c72b7180e56316a514e4187 GIT binary patch literal 99988 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%0A&HO8SW^fN%Bdnp<_ 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%0DAi}2ySgNXo9;!OktvbN-mJvp>lV>DH(Keir9M_m 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

@KihtSK~#v96GQ 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 um8tW$s>#wehY3e8UaPGrJ?%@V>w2^ZxPV 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 IK^K(!Z-&-@oB#j- literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/dsc/fsl_dsc_ai.o b/build_mx8qm_b0/drivers/dsc/fsl_dsc_ai.o new file mode 100644 index 0000000000000000000000000000000000000000..bf6760838c30807c29490a93c970a0d6aae64bac GIT binary patch literal 84952 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 M#r+{iMO*H_0abAcG5`Po literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/lpcg/fsl_lpcg.o b/build_mx8qm_b0/drivers/lpcg/fsl_lpcg.o new file mode 100644 index 0000000000000000000000000000000000000000..94670694c4f5b87f58a8918caba199759743065e GIT binary patch literal 25780 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 I|4h0631g*P$^ZZW literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/lpuart/fsl_lpuart.o b/build_mx8qm_b0/drivers/lpuart/fsl_lpuart.o new file mode 100644 index 0000000000000000000000000000000000000000..85d19716c7d109e7d66623d97709dbd4953f78d8 GIT binary patch literal 54784 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/mtr/fsl_mtr.o b/build_mx8qm_b0/drivers/mtr/fsl_mtr.o new file mode 100644 index 0000000000000000000000000000000000000000..48d1412c0715745c5700537d018218e59eb46ada GIT binary patch literal 26900 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 DbeUpS literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/mu/fsl_mu.o b/build_mx8qm_b0/drivers/mu/fsl_mu.o new file mode 100644 index 0000000000000000000000000000000000000000..bef4d8ae904ddd61af752b0f11263c7a049a5a0c GIT binary patch literal 19348 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 F{txY^O0WO` literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/rgpio/fsl_rgpio.o b/build_mx8qm_b0/drivers/rgpio/fsl_rgpio.o new file mode 100644 index 0000000000000000000000000000000000000000..560c4256e97bc3dd22f79e8a03b3476f9e066633 GIT binary patch literal 17788 zcmeHud3;;do$tL@k|i&(yd|-+3UbpJ5?fguvXGD{vXi*6Y{zn%0EHV_mTeI&Mv}9z zHPDTn0L=h}Hqe%qLMe1wpfH7Wn?fILp|5nGwo~@$YiEE=UrQI5@AurF99<>T>HEBY zI`8w&$5-F;JLk8ZbAD&Ji{I1TyII$Dt(0`FO*>9$T31-rcsdodX|uIins3{!n`)kQ zy}mbc>n0!YVB*$Ibw`b$D>$)5!=)27e^_7O`h)&@^Zo^oMp6rYrR(AN#Fp6p*^gen zJCX`Se)mdv_a9z)@b�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 E0L}S}J^%m! literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/seco/v2/fsl_seco.o b/build_mx8qm_b0/drivers/seco/v2/fsl_seco.o new file mode 100644 index 0000000000000000000000000000000000000000..ac331a023c4b10018cd5ea18a38904f1df3ed415 GIT binary patch literal 94080 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�<;*SC6Od0n*0s*m=S5q&H2xA|7&ZF}gQ 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/stc/fsl_stc.o b/build_mx8qm_b0/drivers/stc/fsl_stc.o new file mode 100644 index 0000000000000000000000000000000000000000..21fe5f9cd454352b02198c0432c9e21f86556a1a GIT binary patch literal 29960 zcmdsg33yw@)%M&g$&zBl@+#YM7C8$RAztEykdOdL9Fv4>PV7K{5Jk3STd`#cNsbem zwkZV~_-NT7(6F>XX`vKop@p)AvJ?tkSXwBwENv;YKpSYG`AVVx`_4UAmYuZ!_dNgq z{7?Ds6X~5ZbLPyMGiT1s+WL12JvEN}B zTT;sw-J#z4obiLd6q*nJrO+|1=b;0;no`S(?=tr~W_VwC4zX74-jYRezqSU#)mK&?tGTRv;if!a`NS?G>M zv&{W|)1o|gsHu)lwzi#GI34@_jz2OInQ1;`>K)sVR>f zP>109`(a8sbx)nf(`8Ee!hWT$&$kB(&A)=hoKiUpX@^m;qXJ;M3c+dKT!OD~RU1m2 z$FbPyN+RFkaa9+hBs~sa4OK~$xHjwBo<*g|`d~c1W>ufbEYp2E1e$NLjXBlVBFlL$ z`7dLk(|rb8FpKeZRQ0!+<#87mC{^He#Rs!wSZSi{PY~#sQvEC#+|FO(+w(5#9Ug$R znMG93{K$cHTBp5Nq0qJ2sN9EwaZcyg9MjR|!e@%W@paz^$SnL2y>Nb`jQPq({f|Uy z{5~Wcs>tKK-g`1=|2vdK6P{^Ozq&4|hOYvNR2=R=FEJ^I;@^1q)`CF|EoX{mR{}HFx^YLx#J#kdi$9*C5K> ztef!pkB6z<%{443E{kke?%9RMp?W#=dp2gQ%WN6DMRT_g~r@4>vJj3?B1rxaE zds$iezmB1BAFTP+t1yszu_i*Q{5JN&aG&6*#Nhb5;al#NYm6yb>ihr*&$8p?M%a_hjR`!!jWKM2>j&~TsT*-D|>kef@H20@J@1?;8M@1l}XZwe(I zKQ(c8PNFS#!(f!>+l4QFM6la=4v0YMB+NaJd&qMeDF4Dj)Z13VwDRvpZTGMx9zv4H zD?JvY(&xU*a{#TCMN-QB-BQh57D+4j_pCuJiwrCG-8${@e~m)!@y6S2FQBbr|J7u>PuHpPhuM{f$I%iK{0A^=-H%S(iiSh}`7nn2hZC;^G0p!n z4fmt*_k#%gFUNd$Kk0oQ#LTkDP^WVLM2l_$0X2WB)tmiu(yb~vT&z*0zu3ttPPQuTtZrv5id-zJz5;F%cDlEi z9(F$XB2Cn3YCTlY!IA1U3s-Qm2j6FNy=FNnPw*qQ*K1B95&8)SO51>!$A<;IGV@A}W5XSv(E`Uo~rf#bLS49CtBF z-!|d8^j2;6FTs#`cGslXeHWB)F~jXl;k)vWFc)1bkDXceFkMR?R;9;{@Syg?$k1_{ zuB0cMY0)3qv{K%0A?==Q1n)wBCb-bF&pp-fv_Su$p5oJu5)vwS2}j{DLyx*MSX2qB z&d{UoL0jyw+eyI_y6{!xKF;v$rjR>0u#1dR5-QlkL0D{21;GJQON`PpQRGuT!XB`R zsuO?a-etOP#UKXfQplNR)jn{jU>%M8d9#$Gzv@{phPm=+;eD zdoERPa8xoH)h^(aZ*)wY0K!`et9qVvlyGO|ybo2pw<894es8gg9RRd_d|CC|?- z9`6kh?fI3XbQ_Aj=b;at*Bqtif+#tiIrB>?q~r_;@hcuk&-X64*PefUB_?HkJxmfML%cLlP&spHXTt@mD9J>`wN6l{~0iwueF4lDgOfQ zcaJZoWT$@y2GO^yXIh^CYG$y zC3F1!Ftl&AE?MO7Wyu;{veaLNi0WIbOWOQtmbB@T4!?ua)|Jp=Tm1WBQ{Q?`?DB8M z4#U^3iR=7t!v%dEn%L+6GzDxZrZHZvcoDwgJ5iTlL-RgWI7w3>qv9@he50lo85Qd= z%)XN~wZ*8IPw}T{YL`*5n<7swraiASDt-?i_ifT;%B=V&IZxA6$gH@8oSSvyi_D6b zXr_oI)2z6LWm}4A^j&7fV;D?d)RN+;C}LTsCB;#3DRt@6)FMa4FGzJ;QXCaOhL`zb zn%d>4I0CcQ*Q2TH92Gu@_VsFNpQGX~Qhl0w)nR$S?~$cl@3YFBf%xr zXvw&k&ULz#e>HkgoVN0@2&&>wTj^t=Q1O`-&(C1h;xAbFP+k>(QKwxOAm4nD8JAdv z4`48guhi+dL;qptW{s4{Dv`o57 zm0w!*YY>LR<(&RGhS$r+Q&YoXI;Xp!N%`d#Z5Yn!FTdVW ze+AMNtF_^ard7ne&6sumA#hdn7Nt<8*nCBw-F#^JcQLCf;(kU(C>v5{CyZ3F)$tG1 zIm~S&Q6=za<79}by8v0LZY7#G;Brtq@SfvX6xeJBjN8eE0({>CZ!qdy7zwlP1ypp@ z{TAQOy6?bRuDaDo7u3C9j%Z)^DOB*(O~AKTd4uSEz+pIIkmNlTUKc1ZbkDrshD!y! zM#Tbfc-zV5ladU)HQ*OwmQ2WA*vg=WI9!!Ch( zOFy3H!yRm(A(vr>zk$FIXf!IRJUE=;(_o!IQ!b+*+>L1)m}OMHYpLKlylbFe1!fz? zY{5GNLl>B1*ke}|KA+t?(y#}wD7*r`5}0deIEs|-c}OY-n~oGt<^2+dC2*AC*uoyL zV4^2*tl|9}QZqW^Sru4h6m5eEbq};f7Ux;yQucp|VLPKE{4_h=V)*|KQ#sw$&KdEf z3M@5B=?L&%m-1F&yaTOt@6II$8gTz!lhH6z``G9zHmfP=TnWhpD{l*hZ(}cz_kjj!yL%-gdZD*a>$IY_%$y z9*@#S?9Um|n9&u7RR^R`PQwUuMg$VJ5tR|_p|cGde#&!VcSCi(s}M5+NyG6sws|s2 zCK`bu!+Ql%x{2Xj6Uvgf-IfUP-T)1`!*KM2-NiZ+LxEj}m&>o!)iaG^?r+rLu|cT! zd5iJ{OVItmSr%1nDR#D{Sk;UK;!@z8Tu&#=h<9&SfiKt@YJz2p-FAj&l2-KGoT8Iw zWN@SnoF^HEbF!uRf7zNlCM)l14$}FC;~UhR`cB*uxYY1Ig{d0+9sT)oqv&hk!7h}e zyT=H=1oQ;IMd~V}hK$8QG6cSC1fKy_9vn}%-D_080IDjOf@=n@wx|igw^;8QqvmCl zg@PB*->x-keg|q=umCy)t~bj62r3-Bn)B@j%bR8f_j25Cw5X=wR*X{MCS&q`aLx%1 za6rFqO#T4Wyx{%R4zm9^6P> zZZ&kQT@}2NQ}T%(u*f4*as)1l#)9pQx(ey5$G zI>JTFxXaG)oEUzXX8Nw3p-#lH9T|5UrOVI?BG$(6x$M|Ixr~#;H#6gYqnKg9a2uzD z|4bPV*b~;=7~Vt09+V+>IyZ%{qdE53PGM{cKTAy?vNK$#h2Ma%z{5tlwS<|cg>Pb& zM~$N2u@#4FbC^elz+*<)@6b8JbZibkz*c@Jlgub;bW zJZU((K)8x9rjwk3Ul^`dq$WSi_MW!}cXEhkdch(XO`bNqp9fQL6D|I%6(Uu5G9$%v zhOFH#Gx#S?&z~E5Z{Rp0gc=CBX$pSPaIlq`-A3RQ!~1*6`U*4+yk?YPF7-`ygtH@@)f-_xR)lueoY~rTU*KBrY z^}+qpI&zPy%v14I`Hj+IaOp9b{jbS&2$+KDd%HZ^dq+^46lQ zC<~o+FhkY3kf+QVIC|x6deqF1F&QiG&~9cv%3goF=LF_93{>@b8eD(%Gd0XF z?zfd0M;xiVtLSaYsKBx^c6di*=u(pC;g{LN9?bE|yG!d(OPghLt~$L(yO8$(DqZtB zw)std@htyMl)`nb)$ z{}AlsF)y@qnW}$8M5uhI^dEMe$u%g~Q+Y%qUB_zTFPwi57aakvP-~8LL@1{!+?z&z zv}hf<`g2?(rqxz8cOu4D{;+76T<7PwxJZa@Z*%OQu*Uv%PO~2s-9YBYM>F%RF%nXw z?llPIl|RVU; z2AD&~9b7}1t!(y%qLpOWGMd5a^a8g3qGm9cvi+Bewv+ja95a{RD%~d@@v8Wx%mioG z%VpPtOV6(F<=E+Ls%TH;8{P*d;plcZr}`f%A3<9A@8d-J8DE6O>_A37r{t!gDzm5+0=h}kFG|mS0ZGUYEhzb4&sr$Q= zCx8g~YpC6O)9XM?^M8qh|Cg!FAj1A@X|TUeJqE-~{~EUQ{`BP_n*6nt_Ca+!h&lc* zv(djz*bHKx|7|QUl?NuqK`ivIrRe{z&4O6ue;b{u{QLCJf>`R0GM0Q;dmf18{!dfD zKPFuUVwK;^ZhtiCIuLFC0Eh46iMN30@Ym4>|D5<;5F3M!Q-CriJp^h~u!(9LM&(nW zwghjXJktn052`zOH5GRl)xQDN7rdLRo70&74yb|PHI(l%CLI8k3f6H778sKpA*Hgx z&$5qhV?q(A?ZGG6g2$+>2DLM|m!|a^wbMZD3f@Hb9%qCaL7f%+kY$C&#G^s&4qiYh zKBJ};)cL_>9N_WB^fpiz2FKC9MMmwZpe{wAIvfj}i;m!Sa#40Yp_5#LUC-$x*H_mo zI?1)u^+%oLy6AdeC%NXi@Qfc4dYCNK$uyGzo#guDs?|v@JFb~J$tA^glupiPa*0lI z5pb>6NrrpZMxDHn$u6DT%jBR=GNQY7=wuCi+I5yrGRV3v&`AbM*Ht>nK8w;(AXfpJVbPoqUx^56tRzzRhHr zPBKimCh6oPCJ)z1h62|do#do<9jB86OrD^VoZYSsNP4%?>HLO+6WFx{IlctG&ctW@ zK81;;Txq0hUxyzBnw-@v@No}z0}{efdp=w)Fw0qaDe}DQF3k4Y$&_Evj1W+ZMR7(F=F4I^HN^BsB0CD9mkY)iOK7 zVT50WOI9t>I9?cZO}i&;3^K!#KK&4l2LpIBpWVO z9DYn8W1~_005i;jlJH9Or0Qg&_(^6IsFE3(jH)^%*P&A7JwO?!8jb;|UPC0fdnNQgta zrjvt*r>Z^1WES{(VZoE~IF^wk1V66Ak)8!U7uw1qF-5uJEWDU%;)KsU-&gQ;IX-p+ z=OFEN^4Xi~%ShIKhvT`|m`Eu;daSx=7U@_J4ZFMQ#X?VUlJdynVq_sJ)kee$7*J$ZiY89 z?!iYjbin(Kv~B>yfPU0KC95ClDONvJ!%i&uMxSPaO~KTcW9plf-`T#I?8I;Ic^Mz8 z#lHE>a~phIfJDPnm@-CZUW>Qogms4Ug>^Qt;!IQue1VmeQDRIlDl2pp)f8>0EHUunp2BS{N72!R z3kv5KuE4&>F-;W~9t#dQ^O1@hz6M9Erd_Q#Wbc9vw2{zNgy<;$eBmx-^Es3$oP;CU8sqG*W{Ci1xuPtLcO=*Nl z_^`>gYneLMDj+P+6(I31E<9nR>I7TPIxT04RX~`DkJTrpnydoC(YXSq*c?RRd(=g- zrn*RrCkxYKFUvOT2=t>v8&Jn}wVq%z9Xu3zrB>|(o9SRj%WIC(MmM(!IUEM&+ZVZb zQ6w++gO|sG9I{zncK%@&seN9O8vbv}+lfXU>T8%UW_yz9 zL}Pb4zAcu{G-k40sE$~)i|6?_c!LU>Ql-79rXk8!J+NU ztj~1y3?na{jSu$L_s6r1vl@cy+Uo;Lqkjganc6HT9(~0`Q zAbg+8>`~Q4SE54%~ zXOU@1uO#W-(}(1QmOH#T7nByc|*iAaWBMVcEuq|go9 zPJOhK!UGnUK3_Se87^13%Tr*uyaiKT;|t1Mlj>c@RMWs2W`wJ06xXDJ23KvPYeGHh z)Ve04uF*86!a~Dkmb;9C;*iT-aE5CtYPbs;T~okIGzuIQOgRQaW6P%gZ!=K4YD{y# z!ZR3jBUE67Tt?%V!rxeh(DM+5Z(4=60j5L2x{zyn!@*s8Z!~B1p}PGKiwFI7d8TNK zPD5`GqoJ(M6IpXYsKHge@Zd&v!|Lcro`AX$0aWhL0@B#$M-tJLiuBOuBU#nn9$B$A zvaD@=q@`p1DwXMqq!N+gXn%}H0+gqdi3kp#*+{gzJFPOANUA#m&q<;P1YXn3qk3c6 zNSBtI!ZBhn3!d&+=TI*>x5u`pB6x`td7aTrOhJq7!`&G+m`;GmcJ-kM!Wks-N^B%G zFrXsI!ANX-9F3=YGb$Ce8dI5pBwFu^ba!ID4GzY-*b>^n8MZ$X8;o`i#E=n7!M!7h zT9FL&O2yLgR9`F|h1A}Gp_odhviPUPK$Ojn6L=RUt?q;+Nws&hMAo+~?ufL+uW@;@y#LIFM^CLF-|Nc451miCfCjkX_NPzW>x? z@IecN8XC;Rdk16PA^vGMEEr3tb5^vCj>n_P^bVH778nn>(_l0a%cw{uenw0ih+ZcC zgg+te(fM%BD8?Ig5`(Zh1J>qU=l$MLog7FZi95~Su}lC zMF!^1iQ=wEk4j|I7~X!mA{*!)!rc-*EM3|3fUSw`*3u4{ux3zETY4ms?52}Jgf-sQ zl!zocGgGaP0S%az3i7pIcZJ;Ep=ZjZF)}Lf|2^DOA zg#$%8`;u^YDkKc>^#nK~m>okH90=-84gq^o$qe&*1~YlCJK~?JYbb5WLCs`;Jcf0F zE=~XCtVwo8VWLE82nsmX8@b2Z+rrynds8%LJJd$ota>tm-!unI=v zJ&{y$7-GeSkw_LHr#reslo}gGR4N_IAe_KxvCPmwR`qjAuE>qW8r*hLZHw2eXo;*_ z+a6ha{PFFr9cl=z&Td9`f%CLA&`Mttf6bg3j`Y&963O5?iCDTfHrTZTAx6iov>rn3 zq6iYSDuN=tCd;q^Pg8l}gvxAK8d)08Fz_r!*h1Gw&j8e0v8JPS{i@c*C$>h~TUV)k zGg{(Dn`AJyJ=+7-yJOoGgy;2(v5{}b+e$HvQ(txw-j~iMhr2T3JLIKblNoanfuCHQ zw-`vyhJoZ@Z%BWQn$D4ErYjpy#550uWEipFP?_UbtZG#ltPK6KZ7n9_>LtiYbR#xf z@e9ffcEhDB5%Bg3GbEjWJ+K_eYx&%MIivAYx=$ z(^E1vG}=wcjU|ZOa7augd)kT{4`pK3e1j<60n6NE$D~IHgP%~1w&-A751)=WSv4H* z&h}C2=()_1;>3Vd73tcR<#1U`+NjkDTBCdk?!)TgXUITJJsx^drQp0ci85_Mte_bM zyCve7qI5R82>E)`$su~l`V-riMrgU#HH$gIy{p<*baXM)L(yEs630Vbti`mS(#E$} zYRCaQN4YzijapPHjm2B{YzL=2s#=~&&Q#wHESE_;Fy==TRM{5gx~-dJ2&I`5vZaWm zj?AcNT<_ksAQ_<1lPa=d75rT>y2CyC$v6^g?5;@nl7rcFlEW6kbi$;<)RIYsSvC@# zF*jS*ZdlV1S=!pNK62vXRU2BZ4a166+%Jp-DTN#6Sfx0k7@Qq?7Djr8FnF9Om`Ce7 zW?78l;f%EA&bxGkPe4vK`eZMJ~;V8)sm){xjE28U(<#k5AR ztWb&{7GWt2ZCNU}tZ;-!O#t#mF~~Z^XRTqjwsY2q=eAcm>ccGJHw?oJzj~dB48*p@ z21a&N%VJr$7~Fdxi7g?gaTGhg{2q5jdbsg~fW9c!t{6IoVnp#S;kU*dR9FQN$8!A!d&wQLHKXyU_M*G@Wh7%7i|1 z6+<0sKn9c8L3Z`)&QdqkvUYXb;`ObO6-z}thfwylIlr52`yIw179GToe^{!F*iZGP z(hHN zZh5t$yk3^ESX%Qdp6SN$;1^A}-P7|N>JD{619(GP4;;IeJ1C$ddZ6Ms)Zp}=>r&ov zf@`of&pVc{Z*5;5nWZ4nI)^a8S!b!$E7s5jm9-G&oMY^MW!Bu4)`CZyHPc-5EIn7z zwzcKe3<#Wh7o01W_<<>pZ3xap5(6_S##X&Qf&R>d%oq-NtJb!xj96QtS#!bC(%!PX zb!p_J#Va~w%%j~~hhVH_tCmC#E*y!Th=S=jx3xOZ)BPcBWM{foJm!!)Jbhe)wQUFI ztg@zq-b1W!wYCtlwjtgvb4>=>t zXzsYYqGNSr{q`k8Jv}(mr10<+eN1QVjd6Ssf7FVR*8x&b8~a?Uqi7`4V{Psj6B51H zpEqN|;;=<+;5sl=r`{INokInzlbF4C8s+)ogVrh?!@6Zpc>CNx5=J1&8mZAMDGnL& z0lmde$Mo$3y*aQrbIXm?w3ijy1gk%~tas9o9Kpnj4&-*C&;lc$PGovnHZ+JRi77uA z8`c{nzL}fW9UePbF~@Q{c-gGw=`6m;A+nth;u)+uIGeEP#qmd*-fBOiPn2WMAoEsY zeZX|(nSo}Ly8zq~u@n8)0yAopZS7E@e>~Zl!7fnWFR}MZJhkZ43)D(m>#U`67TarV zlyc`Mj4n)O-8383MRXYJGY-K#%E&qy!3Jx| zhGmhZi#ryN?3kJ)idi-Fe9CQd=uMU^I!ihh)iIt6M=tPNE8yBTTMUMpYX&NgwK7B? z?6#^)JSsPNOHcloMQ#C?u?BIIC-PLY|VyH z%l!Ev{VGL>FI~)PYCbX)PRFp6XJUtkPF=iywSMhletjogr>ifN#)H}nULpxKA9d7` z^XH!ys!zc2kHOt)Y&+`{b3kYNh7z4X+$4-<>+wRzF_~mfwkO3bu=b?3&8g3%>bqyn zMb2QdehBADeKV-ux~YZSXsRniNO$!egEu0!9Tlrj96<@aq58Eb!7l8WE+{^d=z$>X z_IaqjhdX1w=~9p54-qwb7{>Bx?!>TG3}SLZD68{j7reFtLPz)d75Xd>)WyB z(etwQ&Vy51-wG5z&g}_!#{|yT9~r>*f}WV?h?p-K*|1qt2YYiIX{}v_zP*XtEBbb& zjuwb$I#ceI>1mU)BCnPtu~|P-kWtPHfwD;DW*wIj-jKzxbR+b^Q5l!4#z$`)k+*vB zM!g%cf+)gL&!B!>F|tDHJvAOz#Is2pO@_O8%CYAg&exC;8RUeJP^(Y&5=!Mh4!X?^ zETSHmt#h~bSsboVDU*tI#e3qhZc)LCIQCH+3h_2yGwy{T^lpz*6vBIo{jttT+@@z@ zjPbmuU>#F+K#S@-Ot}qgv%P@@bHB3ocAa9)kqOUH?Pes33?{InPU6_CBdh4z;C|yrY{;XF_A%e>(jC zWPai?44&<%f8xSVmFz6?jn_1?^u^cHSZ-f@?Tv2;+81AcTU_Kh%ls1lw%X1F^0l{r zNAvZ#vE})44@0>v_h02NZUj@5Z-gmhI+CuVTI*MqS7D$HB*Wd6xrExA4>~?;72l1CQ)Rm*Wv$ z-sQkUywT+a`YqED8(HOenkE+>`sG~?Jn|b|ACCa@E(bwCfj+DId*^Ut$_lKGHKva40-j%)1E&~Zx_5z@NvQC1YZ?=N3a0liS3sOh6LLL zPZQiKI4pRU;6;Mh2;L%ix8S3K&kFL7XxQGL1V0q?A}lgLEI3!NMX*iqG{N11mkEAV z@VkO<2>w;D2w|1-YXtezw4{#|Tq3wu@biKf3f?UEJ;6r=pB8*s@GZe92-B3$KV>2w zC%9VhRKd95u;AH(mk54EkUvpIIrj@bDfmmlHw51obYP;8zeI4dV1wW>f~y2i75rGR z5X%7TR}0n&9x2!+xLI&O@C?E01@92#AHP%Hj|E>6{Da`%1YHPfJndMsTIz z$%4ItLxP_dyh!j`!8Zjz5NyP9#r75oo+5a?;O&C<3;tB_HNig#ekkZc(5Jj|!I0og z!Fhs91=|EaCwQgcp9TLR=*6-~xdFkcf=z9@)tT;|4qRU1f2-P%r6xT2{s5W6g)w2qhOCADof`1g$ zKUWXACKhqZFA@w29wyiC2HQ94JyY-)!L@?@ zf;$DjD99f(VLkq!G4W-=KMR&%Y9@yPyY$BeoY1 zoF>>TxJYn~;3mPXg4+ep6}(FD7Qy=je=PX2;GYE*Hf(IaL~x4WY{8|18w7gF zUMYC9;Jt$Ubz#asLU5j7o8V@_q#%Ejj{JKCZx*~q@NvQC1t;wkT<|r)cLdAu=Ywo-vfv`Ys9-{HkKjXsKM{OM@J+$@1-XZ(T)*H1 z!NUdT3bqKg37#gnRd87FEWwKeuMxaO@NU6J1)mXoMeuFGzYBVBwxE6i!D)icf{O&# z2yPPGD!5(n9KlNkzbbgUU^Ha4vs>^+!EXybDEO4%Zw3D<=&BVx1?vRo37#rAEO>+9 zU4oAZJ}>y+f)!INxpM_u1*3wW7Q9yQ4#8&yKM<^*YROq3c$(lDf;S1?Dfo=wp9RNF zv+5TM1_UPvP8DnvoJ+)9Y!!Ml5x(3h*em&Ip|=U1BY2+R1T!B zBjtMqzasg!3*Jk_p5;eE|D1?+eku3|!FL4zn}~LJ(B^+q<0pa+5>aoGV1r<@U@H-P z?Sh*nzf-VJ@{>fI4L&3E6;l3X!RsXd7NKtwyi@WY6#8MoCnW!8M3+)83H=AbzY?MM z0YN9aMt{L^K_g755ksW$aKU=PIfC;9*9fi`JX!EG!3+`pGc5QS!7~N-2<{cUUhpQt z`vo5od|dD;!QT+!H@_ErNAO)i{=5jw`9A>>`K#u{fFOTGg#Obcc$DA*LH+x#*YH546?~aEfctM#CpxOruV{^Njy z8AjdE9aAi~b;sn&&E1jQkz2eYd82Rij>1oX=NP10VMCweGxHJ!$-TfNH=q>xO7Hn~rx5 z;RQI1+5hmua-#3ob8hmYZ{=T@y85ccH^Nr#3DH1{4>ZPm(6#%@Y(sE4NBc@6F|1h>tgWb_xBO#XZIJ!^PGO% z6Jgj>x)Q$jL7uHE^VlvgV&1T;{ovb&j7i9!iVxc@#)oa@xskekqf$>I&%SJVSiVN_ PbqwMs((FQ%*~$L}_^(#m literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/sysctr/fsl_sysctr.o b/build_mx8qm_b0/drivers/sysctr/fsl_sysctr.o new file mode 100644 index 0000000000000000000000000000000000000000..31228e369d8f3040fac3a9cc8259a644928b8487 GIT binary patch literal 31332 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 z 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 MFub&qz1-yg0%@7i4*&oF literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/systick/fsl_systick.o b/build_mx8qm_b0/drivers/systick/fsl_systick.o new file mode 100644 index 0000000000000000000000000000000000000000..c2f581a3013dc0dd8dc401f105819e5cc403b1c0 GIT binary patch literal 27416 zcmdsgdz@3%)%M;wIg?~&NamKAAuuq*MS?OjfS{ltcLV`NKm~6hlgTiF$s{Hj23l)* z6%nnic)w9;)wW)%zV+6(Qnl84Yt>e(R;#Vn)>~DoR;`!%J*8JafK@{*-+ZH0ddjRQ74*J*Zv1 zoPGYZ&ZLKdvFy{~COrY_mVIV;tdn6XU%fG5&9yLRqp#gR9i0z-;6uTrTBcQPY=iPm z_OY@z^aFhRCRdQ~hh{;PZ?b8kGSpf|Vi-%RYGa#}Z~ux}s9py>|A6KzpTO4<$S{^s zs^)66J;ryS|2J%}hwV)durf>qllu-bgf~=yZuky1gg>Owd*2L0RED;qP}|pEb`R2C2%#(1jK!#Q`)>1ph}LRjS>?OE#xU2$a>{py&+yj9`jzia zllF%$r;r~9W}$Lr=s{Zbe+&_-%qN~KwDLz^T>9WsnZxbf?c_MRZILb>m`@)yvb z<)M}A&kHs6@TpaypONjQ$|SU29qK`^d@lz%RgVuXrlNl~Uec)=Xd~8WG+*pwBPUxU z^I_%|6xl2qx&azRy}q>`KRX|Jf+p(l_zYj9!2YiDR4j(4dn0Gjz1Df^Nckfdv%Phm z5u_?3-{o9LdHk$b6&VZ3zV#meVz_=?WE?ruj?9UXduW1QPyLA~n-bZ|{$!o9X^|9d zmGhKmP&Om-JV&U{Vey40vVZw^t;X)(f+0)nZb)NKpLYwCu$kfWX7SzdI?P4a zDq&}qJ52NgBa$9Bz=PWNA;ZLNx{{e}9*6$arIiY7McOw~M{YxZhMxr&uk?-9{&~

N9!D)KRne43|*qveeR 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/drivers/xrdc2/fsl_xrdc2.o b/build_mx8qm_b0/drivers/xrdc2/fsl_xrdc2.o new file mode 100644 index 0000000000000000000000000000000000000000..cd3e58db6da12077baf287e0513936880e6c38e6 GIT binary patch literal 74608 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

n%%BxX+@wp0_JzQJ0#tC`_K8^mTP}CF?HSQI_ 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

8^q1xTaj$F5TN!HM8ubRx8egl0vtijA%Hr#|-QM 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 APXGV_ literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/main/boot.o b/build_mx8qm_b0/main/boot.o new file mode 100644 index 0000000000000000000000000000000000000000..e835c6fb8b1280eebca4e105df84f905b3f5e7dc GIT binary patch literal 48368 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 LytDsP1Tgmx;-N29 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/main/ipc.o b/build_mx8qm_b0/main/ipc.o new file mode 100644 index 0000000000000000000000000000000000000000..13086291a312e62645404ae0f2338cbcd56660bc GIT binary patch literal 31812 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 npC9GrKEKcR_5I`bF|XWtpXZe4Jm)#j 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/main/main_common.o b/build_mx8qm_b0/main/main_common.o new file mode 100644 index 0000000000000000000000000000000000000000..b570d07693da56ff246666496a5426dc511546bb GIT binary patch literal 88144 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

*}dWRAoa$>A1#3;)=$GI%oA4w*qli1F;z#i+VL` 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 aK<_nfaryK$Pri1O&+9X_>%8h*yMF;Q1s;0< literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/a72/v1/ss.o b/build_mx8qm_b0/ss/a72/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..6c46efdf9926db6ff88a552493f38d25b7662b31 GIT binary patch literal 66664 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�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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/audio/v1/ss.o b/build_mx8qm_b0/ss/audio/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..0bb3c911b3146fc2ff64c80efda6f0f4fdf87889 GIT binary patch literal 45356 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/base/ss_common.o b/build_mx8qm_b0/ss/base/ss_common.o new file mode 100644 index 0000000000000000000000000000000000000000..8f9322b70cff2ab6f88ae78adea5bdbd776e42fe GIT binary patch literal 214204 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

7!|^z=?L-@jENaK;r#@ zlk77X5BpYIEkosXIPi-+XMECLl&nW&6!1kp(DhV*ZQz_iY&{UndVrrfz-p`-^PM70 z_?Nx3<=;6UvkyfIKdhZcuZ$>t`#||~ze&s8}o&FIB+)|nAA zKOL;Uz4;OO{ScV>8nQPt6EwX`;2r`EBxKIgs)@Wr;LpH(2~*Wv`W*o1i|}ieNODEXApoXf0D*qM zQJ;eoi?#_c$ESii2|AvcLHAMpm`LW_sm1{Y_$^3gwWJO8UB#&)Efy{hY!lTtkf{}I6Sy++_KiYTX#3H)0T+0Yve)qq*I7l9GLG-HdyTDMrb=i9LF@gZbuC#NRvO z$93pR__h@M!9T=f-KLK$xi}I!xmzWX(DxCNxtHxuQ)&al`Sp>M)>>MA5p8PZM>agV zyOi{gx$`0+Yr)gZ_&g&HrpVc^5IKgxQHs1vY8`X5BwfC^h#hV-bLtbz?Ao<+NuG|b{_&GfN4s&SW1u3 zvOux+K?DwkcQCMcFCy&|`1vBS6M^;_ME--oIbt6!_7Z-!5xX2{YQh?QdE%vQUcst) zdokYbY<24QpT^NA1A?ZFNbCLjk=U)~5KB|t_O%MUSJct2M}qnympvkgzwHx?s`&PK zR_!1pySmMUE#@emsi_VDVZa?O)}mj@VG(h;I_vPy+Qr z0>?u+1~~G&M7BdctP{?5BHw^|4$%HnBEKi_pdxn=>3sr6G=cX2BC>+OkwDW0lG znx2F)1ID{KVcLU6g6Ciy4x^kR=c-MNw_zLsqb|YFtYwG8kB2cW!H}xCJ!rOTVMsH5 zZK=N4Jqz0NXj-`)S3L>g8oYA_(Eb9E=LtNn$lF9-Ig#cHH0d0<^n53mLC|y;G-dkJ z1nqHXvhe;Kjkc!3>d=wO^ydUaCN;ecLtgkeV(37>-#ClA6RzHf8-cAkSJ(sSTou~O z_xetjD*3PiIe&G~9=-WX`u3T5$;G+~w0IZ&@Jdb^=G3qOgb7M=MUJNKlTg|;Dw5cd zkl3Yl$jI3`wVEpLJ>VKeIQ1e1&_0dHvB!QY2d#v7!-GY7>WmccZ(m>E} zYi9M=C-WW%&~I(|s^y=@z+H1cPs(bl)haK7ql%D=J@g5qSw} zMo^%$#^H9L=HKP3PGY?zs2NWBqZ!8qHG71aRr(&6VDMj3nN>F+BB)U|H%?$X4(R`3 zQD&9qCP7UPIHyuJpl=V9>>+z)$9{{QCrO&0xv z!Kab?xMF5jp#Kuwel-pe)J#P48Ke~qT1E$`g(~QO7kg$z|H9xkaOiCCq5NYFqZE{jqY zd&(aD!}4-hr0>#}_bkv`5r&8K5xwW0Xx^V8q_R(ed{t6@68vgq$ckk`LeGH%m2vMr zVNqo=uRf$Ljmx04eNCb`Z%s{sc0ALsCfEyA{cFO#2D)Jbimk{4b4e+e3?39EwPH#+ zANei>%-`plGME)i`i zx#X%QqBSIQj%d@$Lw&7udQzOBE@?qQ{*47XaKj8KP$Oyj`eyznhX31A96he2vU zM-vh=VFY4u&k)P7RxC%jcSgbomxn?vqr(FS#;)0GU_rKrc*0AX2D<*)uG8Y&ITfbd z#bt8}+=D@fxiaN>c(UATi*pkh@ubURTU3m!8_d(6WE!=Ew!-Ya66b%861Rr8H5IEM z?d6M$7g-BgP#lcy6FHy1c$ZfeMT!0Rg)Vxy zQSl@y>rt^RCsT5gdE;0M6|^n1FZbeezm)TX6s;&MuSmzLzQ^{l`aUklrswWbkH<$@ zSf7r(a6(i+N!p1~GfUEV6*k%NznF|hs#cDU+>z@qUov-7mQ|wzja;iL;}*tVVgZS) z7}Am#b7l|*^MsB7(!oE%d7TO^b%xLhIR=4(iy4g6S)o`c+Zju+=8difa4HzvDLfq@ zLm?#*8I-#+gjgUV(kd$?LXh9w#f?}XMUbULQoEI~k5Ris7PYq8$W<!Fpm|3{UMzDO^oCvF78PR<=qntx=?FUs5OyYC35o_QbV08 zi7)CpvS2|>!f_Nzmr_U@pFYq#qrp=^7#tz=C!i?U5Oyl?yhTn6I~DLOfO7ZRCc-gY*Kx;Gp|0IRG;n4tIsCYcdfKS^{q+utqJw5N%gI!ULUum zy$Z$FC#%~Pmx5@QLa|U=qD`-$;PDofo_ zDlALTR4Tkaq9?2m-<$okLLlB8;B8 z5KQH{QAqm!pPKIlC{Uxxb}DoWKwpB{6!e&{aV9J=TS6xe*H``<-?jL{GSkR-hpe5L4+jD+(WJf(wO~ z0Y$<3uyZ+q%K&CPq03`BIJ#6TUjPcmocTFo&Pig0k3a`j&p`ktS;$K$Xu?dHO@1+4hj3h?+0Xpd0W!i zEi&A%XepwI_yX(}8f3wRLc=V$SV-1TZF!>>#zrM76B%oD%UoD!1u#6AyFTc>cP8jl zTDyPWU`)T>jfd6^+Pf?mTi0)R*l+*8ecES8V)A5)BGER0Y8Fz_i-WlvfANc=`J>4Z$a zZX&rzrZge5%V?F$t0EyI;|i`wPjx~@!&1Q&$@ERgsOc13k<5UE%z#)RWq}4O?U+Pe zNk<3ej zA$AQBRyuq-B$0kdBK?qjx=MnRfL#V!3HZb@Pv|0``{B=pvPq%j@F(?3oM`g&D%!Ug zN~8%{_%st*Aan*$6s*hNb*sySb|gWrQVLNvFpQ9h%OzU#5^_Xz z^#DtEa<-D0c$7skxBOj8fR+k zPCORs>SX1IlZ9fTu1;1t7!`$Lp{`EWJtLjL?j0qiaQ>2iL`}3x?*$?j1^n+?EQ=bu z)J47uREufnxyRS7uj3En(pQt@TA(XO)a!w&L>k8K;b{?-Q`aP(nas^!>a5$WIAc2R z1U~>!A3=+=A+%c41R=Z2(^lXb({MI)KU-8ciCi;h~Mn z?JYnu!YZXP5XxQW6S@na1hG899NPl7@hd0dE$Nwr9)eRqQc18-{9I(7H}M7H`~Jm( zZ3N}iZhE7VyX$OIa5_=%2MWyq@P^Rtdpyi&AkM0>#Tv4mc@6qBPEJGD-ctt`2MWd6 zBzsTah`vi@QwBuoN`q4}j2Z_fy|)zJGe8(D;Wu$L5dHw5+#i85rnJ2R@i*lX{(X5LRSLS!RhI( z;Q@na8a^Z@8VKyfHGwes38~8S{X;bgL+G^}L!mdEA+$5cAkfX_%Ckx3-gR7gHmN+@ zDdo~g>+41rBv)rMk+;%CLf)!dg`|P$HLs`@f?cTyPXcRzRYK*ZaKr+sxwr*KNf%N=)i}!A zfI|9K6%3(KIYyi+iM7n3+Js^a+0ML%Y*ItlPApC8Zgga!SVL<iY3I9O5bsCw z0YGBbO9fLP$iPHJ6hVqFvEKlsR3>QfP*`{^z$|;)CI!wi#@J5b%Pc&mQ-(>m62uB! z`TR&NYXWJN=>%hs?y^$&HWK#&JW zA-kiEg}T-;W{{mNF=L^89cOHC5IwOD;4qhw8^M|=*$U`X*u~V`bJrw7>R+Y7x)Prg z&Lj4N0t%6WtCkq$7aD@2yDz^NEh`iYbuIr`)6^;?AvOjH6RQzRM%04b;x^@^To~$RsvUaj zSG|0fD|SmssvS1Y_q;_vIaRwI2J9UY2L&Aj=kXNNB@7-ONgLk0vNy}m0 zpFq!hQ2LLwvJ}k3lORoTvXG<_Dh(-)ONiUu%{)Mb}b#1+)sqLivI~v}<2}8QO(np?q_25e;BwpinF{FSl-qg=7qk z^0RG{aGeR-ZML%YW~$IAX9&gFbT!zsnJ1*S*}by{nWn5zEY#IMUaD51Sg31u`ztNSip+rZInZgqRnz7IayMFg5>I2lj>R%>ROZPS`+FL9!M%4M}&SO6c@J5)Xi~*P+Zuygt~<9 zh9XjH(z<2sa(x~O&Jk(=+?@&?;tZkh=NJU+@&PK2DVf%S*)8FhgR=MP%65+E+!Ag{ ziK@=gcNb2_Lb#zgs_m}nM3q6+!IrRNekP$&hRG3K(}*ftyQYCyaCwt$6^aX%Z2Vrd z9&jfBtgohkly7`C@@ywx3{rX|_|07>6WR>mQ%QW=gZvg;2`pkE=oG)F!6JB1xDhRS?an*MV;ZsD>v&(o2xvf~yxX$U-Vf z*NUouItVBUwiM5go3%tsA#|)0g-Gt|O-SPXv2-nuiDf6{UT?cVD!Q1%fPpH?y0|C> zB5(_?#6Ye8*XwGdq#0#{?d5A(aPrC%&`1CR5;w!$VTISa%o$UsF_0)qKsCcPKL60$KCN!q)s%K32uhR;|&F_P{oz928YATPck zHW;sQB$25~^Ne|DOsDX379QIv>>FfDVqM9SNsYwaKSw-; z>D~;E5JwkGF5P)+qfU;Nfc|1l;ctWER$+qt6sExIaRP#|Ji*@% z$crz?i|3rHx~R+s%+HI2eB8|MK!+ya z)Ui3YgkfH`dum>TiZ!1fbw?FT_WB6AJDH2-!Q5m1^$af#WQPpblIH7}7XyCihg0~Aw8e}30}F|{_M0|>=J zU5h!?gj$6plxR%JWl-)04H0DgVO#})Ot69TgTp!%9vQ{ILc9{ekw7Lm)%XfGMse{` z5ntAtW)fQp;EnB|8$Bp=Ghhz8mB8L)k#tx(9Xttnn2{F?$p{-6AjcOuNcS3mHYpvK zc>CQ4hG>eF?=viGBoC zR|>!;A&R*hoBmfqr2dSn2_E?fsabm26CmG5z92*u@VO_Z-SS-w^) zU&e~jDioKmHBr9SWcgYXiJ8__!j7)J!5V#(G9HDrCRaw%BD&O!BcZ~=Dg}d<(7cE& ztP(*M+8&Wfn7A4UHv-J6QoqcDD*aMRn!9WB^O`3ce;&WlH3%u+;7Sl<=I-zm7+58w z{CzA_NJA?Op}TSnh1Aht2*s^yp0zH`(lCVX0$i0s&pJcsUpai7p%aCE@6N-!A58>`}hEQAtAK+%1rCFi42&5o(pEHEwB4j%i+UX3T zxCq%!g^n>xvqEtZvbHw&BK%*Bl_#0CtwM1z{7ImO1O`!|xEMZ;%{HT2h2mn6g4hGj z5Q>Y@YQ^Yb*0u@_0_5=4PKEY%hEQC-)Sfdr8O(-rKDTv+c457GeZC19AoFNn!p)FB_wqz075=H1T9L8O~!@7PuF42Iv z0<1dy?7>loJmQxi7HQV@o*)LjnEbXjHE(K z0g;8J9I|w~mGkpf&WC7M+I}bSEA31bQm)hlDl8jf{jduz z=~vShmRxtuJd!C*$dnc+Ari?{BxEXfBU7D_sosrD--Jxx-N+0`$PCzxOl?A@HkPqg zl56y9A*)FUOPY!kT91^-!lzldzEjwplxRWhJv@oLpgicbp>s?b9@?gPVfY!sb1aR=71m%? zDt^aX8xbO=T+4XJH6khFtw5~gGQys*D~U6UaTwl6HZNMX?OW1|x1?Vt{F=oVY)L~> zSXwi|5{oN*p2b~WImpp5Kh~VXp{A6#P2<8X=|x-83QJ3=jjFOgbTx>qI28E0QTq$Rvg*jWE)l=x9+o&?i6-V`hca(|CF24B_EU-WxQ* zgFO>LV0eDOD3_HDDhaQV4FcRR= zhLEx|I>H6lbYj$}&;Vq*ug{StWCyBap|17W+l1`MPb}26KEG~4Z9=h7*ZPzPRfoco z>h7iBNG6?-=~ADOOld+UQJv0%YyTTG*8*Pr)tRW8a;Q@qj4#; z7G7#b&KL4FzV?hx1>E@gBrCW`NUoYU@Mi4M0tq5R0EC28-0s_cr3u-`Mq;6)1L1Nh z4;&;E3+3B>s!Srf^r*!{`c=L|0ZdS|yGzPo3(W%DLWNqKAv8P3P)M~;3ZeEKgFwNR zC{rxdwM_0p-CE}~<;xVSQ$Ju)D->($+Mi{x`m?a4lH;=;RQV-WXq_|~JTnR_g-TVh z(q?vaJ-dv=8h{!BDk9Fw8!a?l4S*CU{H@HDZzE8_yBZ9vqkvs@XgsCM__8Vhvqu zIAcO~a5NU`TEoc1?-UIn7-z!`Ffq@jEtyT%>X#2x<-*D*S^Y%0WQe=3RYKA%Az>v* z)FM5eOY-voH49-S!u9zK607Qnz1&1vSAb6NAiul0q!M*P3jwc5g%UNnA;(bYTL3A9 zF3&L(y3QH=cDcN7+lz{Enrx>+-v_8WAthJ#UF%NW62Az=LfzM0y$QAn#o4qavS~|Z z)3xqMWj;`K$OGR76c&~`P0hlxAz81o%dccTNdui$$P*OSlZGWJW-^L(7R*a^@J1Rx zw{4Nn2f96pm0SDp0F$mff%j-Y!`4^xetwx4^*~?wvkO-onOc+M@(HzkVwtQv>U`pe zeJXG2l*LV;d+x=gQ?a_|#{Tb~OS0Wu>!8!*gf;@+NEOo7I}9P^>1EbNg@yp$MxB-atsqF-6N-gC za~zC?x;C*&(`2ve#zNgUF+SUDqVt570&bZ?$2vpkxEw>Fwa(zT;HoBu^+J;9zJp{; z$Y$VJsH^q8O~^hb6AN{3z06eO7xvoiFf1$8L1Jrn?I5$@w*rhBYNblP%hF0MS{fOS zVwMT0q$)+pF4=T8e!}q~Jps5RI6btQYt=1h~t?dg{HIZ1I5{s@{Foh6W26!P9S_#15x0`DUH0nS|{ZXm1oeC{> zhR`y=849_&L}ya}k%tpc8dRm47<_${3MO@qBYZf(1SIXtJjkzIMfRJQpOBDWn3qp9 z*(f2XH$d@(RL5R!g~mEVs3FH7P;hD5rTjv%P}f>j3eU!BHqNHCQ=xqUDnuyOP*CNe zgvJ4y`Gh?@w#y8qenvrr)XTjf1PZRbh+(f#EY#IrAJ}Y+kA(_Mvg(>?nii-p&+#C? z1()~F|6xbt|6`#(ScsE^)LgoEk_%;%LZ9iRSW}^sM(o&(@Op(8E0a0TdWr(OnOaxasgQS}Au!oDVB^4JG93 zmU%+^0aQhfT@X0XnDc~Wv>T?7Ph|6iuFo+PQVZ&)giyI$T{fwX!!s}v^J1(n+nHDQ znbx%?)p1rOr>-?=U28&Jt87VLr9|ifLb6}Q+;u?8i>rlbXcAUtS{e&q8_|Vjy6D1c zHVlF@@DRlP!w5u{Wg4joiK+ z)FmhJXBxkts3Ko%T`S~DH1oFJwl6kjv z=JU>toB0$T%7osih5eD)nTAJWkQ%$N)TprwPm1WmvM1RIP{Ac?CirONK|!!f)9VXY z`Oxl_l~faqwHEY-m581ObXm)*i%kHE*^@tDP^W@3fGVUX)Y-mbrM`KWD|#e{h+Q&K zeca7hBr_fX3aVOy>mwPy_of}6v74eyhbBPgU;Y-y9Ca2d7<-x|HIy!z}Iz^_oDk~d!5*_C2O=L5Au;b#IdEL!HTEI zjx~6YEZK@A2W23~8jhqBOFHs7l7|qIkU3?j0||sVKuRf1p=F**fu=N23S2r5 zdMV`XPKYTdz#Uhq{440 zB!}bW<+~b0)pB{zW0PEAyc#WV5(=pZ@$&LV!(4H^ymYVKgtbydnlhc|5qUj}vGVfr zdC)8GLB58=>yZ2}^os|hdA-8|VfK9N(C`Baz42_(aEn5(zaBiT@e~@oJV>hIMdg#% z`z(;}YVmPV!#pL;t5N&wm4Dtw%gYaZZQwzjH!N&y+->dKi&F{sZ(0H%i zOBx>Z`l(@_$KdsD3*?73_{cZ@c#$3Rs;xlb=-Mcj>&#OCLo$&*A<8(wWcu+?ki}14#Q* z+~30eL)<5jhaah9egBEuyK3;T4)+G!3EZ3q(#tcrzk&ND+t z`wO`L3HOh1|0nMM12@-8KkhR0qXxIf2aqH?Ei4z!$24A}xG&(o5BD$OejRSklXs2d z;pe5_9Y}uw&!kJ%^LpHG#O+WBo_m z@5NX@fZOBq%*(m{dFjt0{W;vEkr!}(7xjq45zoBtLHOMo$NIgCYhoNX`@z0@7vuYJ z-;VoA>2buD;^z2n#qC`u@WAmufcrt*9^H{IUBdko?hf?ByI4mB?j5+NyhuQ{-=J~t z4#Y3RGuv*%eODl!^vN=_xP$chUW9)W?R^2aC+865e-7k}i08*SzKZ*sxVOw zaU^{?$}Qq%8GiKPjkx*xy?2!c(i4GrK3^&SHpKJe3(s2^v-9bu^w@Z&X{lk=U*=O&t`GP$|)W4Uy*Plj`t<7=xy(d5-#jq7_m+Wc5Bq`cUwfUO$j(n?rkjPy zU#q>p_WGSaH_@D%yEgm1aEwDU+*{&~5X0q36=V>%vt9_rC$Xv5s&(6{y~zgF=+*M80RJhO1k^2j`d>a|Jh=O|QnU3=~U^|W7u9alHr++yz9 z?fgXkTJC&yZZ3;69r=7}LLQS7Jdu)LoXpHGHerJ~Ipg5S!)$iq44!btCAD~QA)U9+ z$TgXsvN@LKGYH!FTsl3!Xdk`YI7T6xh+Zo*IN9$^WOM1%#9TYF;#d&&bFtH&lHD%E zT!&B7jP6ar!;8Rj8_47{HjvLU7Oz&#jLlEZ!V?@UX7_H8UhFty3oNk`wVz`NJlL33 z-UHrinaa;~lj#=bhjqhd8b9`m;kjiu1c;+T9p1d*HN82UDNv?8*I36Y8N`+Ml z@dXBn$MG_OYZc;{jD%|y;#ib~*DJ&^GzsI^1_ahA+@vs}5N9DIy+Pq-g7|* zv)L(H7K=BS6#|j9q{FO^yO~%5HMkp-Y{rzt-T8z`qSmqwQy%X(Rfw!k#un4m$mhC^rmrVMZo@t?HQ(Feq~ zARofz@n$}lq++(u)bI&Cl?XvG=Ez+cD=H2l_bY-8i;F7sqqM`U+ETPUl;>Y04>27j zqN()yZcinvUx%J7C#KIO*%8b#D76}Ejr6#t6&=J1S>sl)tMf@dCHhRMJ5P#s z*Ca9F)n?U3fX(q_{7~F2MqO>DWN&=Oi8zRTO=N96WCR%)KU!-?ouF0|uUFcRyX7%c z<(^L_5xK>zAp)=<`jSOOp#eSjb8Eq}@`|FQ8!GvNl&r+~I0do2rlHN0vI`dJ7Tsm; zs)VW9vAW<_;85x;?96i=D-wL%8Dw^S~J~O0yQi z;-GYz-EKrTYZ9jR0Lb?)(}%R`YT>?ZNpjyB2&q#@;$o?d$NEN1&5H>3FkqV96&T+p zcQgrJzCB@|u6J7#W+w!YS(il2t&+y4(LUC*HDS;n5YG-YGr>M=L2nRK&()D+&BYyNf2D!Y>B9eNso@~7lQiuKQ`2H<>yW8M zDoh?QwWIL{Q0Tt+YO^J2_9f(hQvSD?`ew7KuLId@Im}Cfh1&RL>GDR5eJ7@}zJ62v zt&q6LjV?l}*T*+knyvA26mdsTQyeV+fZ5Vy5~RjJ&t*NccDDr`L*eAKbO)V*%u9qi zQyXuo#7N4`zG<@wja0|i#g|vaZ|0DV`{nx}(8DqZzrw}Es!R&2qr{YK1@Y zYPOlJn@!C|`M;C@OX5vtE!u_r-`b3YDKuCV-)Gi<7JV5<N>l8J~Y z`@A%b0k|57adp~ zpkzLSJXkg*t7ZesKg_D*hd~mkX(MaGlSys@(U^@=Q}O?8HLVyGtqEPiD7j!q(U)6H zE6_@!;}AAr2=SZ2uwrIo;z14sY|TRja`nd(?ux$n5zsZUFq(+p$wyQBJo272-Hct2 z+M(hkp~Wp>i0*st2gSQDIv72K>%ZRzg-{ktvZx`%ZlA(TT8)B4VW7o{Fxzh$8o;zm zSn1iMDcx%2d4rp$IBkZsDMbeY)YC}n5tU*)=eNU>N78KXwog>@m{6dUTJ#zO`#r~} zl%L#}XeHY1g3AVoxL~TkJ+oK1|@)2s}7IQ^01ncrU64v_R(zUudIr9VASp4 z8ZeluOdB4m_yCEsQK-WOIj-UpXqW)gXyea=?&JwM-KHs1rO{KSPNOBc52**xngnRi z*nD7(e&L;7q#td@mR4pkXy@3#2s1y4om3|Ak-LI(jg zYhp1VCT@tkb3)x1)*f&Tv<)^16_q_9PhvMZ5IXsKQzCVgSWb^RZjkVV*i*8Miv&AR z7^Ip}R&zrfj7f%yUWZ0j;;wv9CwYUp2~`0nmL>FIJU3SYF~6=@BN6Ne$-A?}Tf_kQ zhEJ+1sv%+ADv&ZDlv2!iK7~6fZz}2UMUH@ii)w8X*0Va|lgb0L2bP z42y46qFpkl+bot1m~&ZtHEfkW7$hAb{`uF;I|`lAT{Q*TUxXC{jbB9ZQlhG=ib@~& z>pn4%(6>d7i}>DUO4gedTTRJfG}IRFi{EXwO4erBIwol<-4&NcO<9|eC>#do`^*75 zm!#PuDDVWZ`3W$ZGQvA;ECjd&5iOa)Rhhcctdz_HT4&7EBaD%jxYHo7l~|;4cNx`QEcrsT?|@sECOd@sM_X17sx`2V22W5L=yDrpOH7)xQ%AD zWNFoEA;S@dC@ev@wqf3@w#(lF^(@Olgo3W7Gmy^zSOME=;rb&)yy-kZHh_>;%PECyPv|wU3Hf z@2P@5wL(3ElDKZWSq{o~S9U;1!lEX}rX5gTZ^~}MGHVqtO*yE3Q~WUEWA2Jrr2bEP zqq(s#8YmnuQVo@%Z1#qNNo?h4)^aqN!e~n3txU??fyA3J3iu`>%l1278!&#MyY7&d z$eNbJc>s?Hr4oifa)D8rkHH58{RRqs-BcfWS4n(e;Eq7`QJeQQYlQwRyNSVo-wFf% zfY}OX$p*uEVlBqhMLP9Nv{3a{vjS2c#v^3oDDLfW+m|ke3&_}=;&_F(sh|ttW)>1s68@?NAB_^8;gHBRVKY05J zs?yNxFv`S#4l~k`W-#bl1t62|=m(m@$ zgwG6+x+k7sHoFkQkR~KqcqL1z(~H`z^8o#OwT!hT4i+eLsOzV}>_-CZ#Ih+_nY39E zS`oj4QkoooNfexzTP5rsowcl}MbK0Nlv4wzbCsq^`6j5NA}sGNx-K-Je_YQ2iRh;( zN!vl3xgd#sreSl?6Na@Y)`1m&a8)O{7U9Unli5O(b+bDIhsy>8V4nenQ^_i^dP`u2 zvOBG$4fXue;oD!S?vexIMyN`f8<~T;^xYCe$AxuGw7}Me#)C;aE~ZT_Mz{+m@a_h# zySprP4pX+E$K;d-DSIOz~m7NU79W_FTd z(TZ5*YU?1(*azXz`vUDSrp1uvDXgM7_A!$4zX1XQ1MjePo3cx0O%q~vk=kheb4!5^ zR(6Lp$B~NDr5Xf}KAUY@P0b$D(1MhMX1nCTgy@4nTHfexX3Fa>!^w#M?aQ#-3kIR@ zCGg#PP)@OW?KVUUB>_|gIw&@Rj{=D|nziC{g&w(9RtSwwQ1%=-0aRRB7y2H_a5wQG|240(YFKMhzv9IRiBtOnc7MV8aT2 z4)8HF#@(QfBqS?I2y_qEA5@P+L@fMof?pd-*bo;PDM`==eaWm5HjK@tMRg4L*uQKf-<*ge65?}+xA*Zij7#Z}WP03L(l+TjgipCvxKYbsT zm(}T4U>Q+2ShEct6Kotn!=(wd22oJtDXmaWTp5cb1Ys&GfWHzKjGPQ{9Viy~o%ZnC zB5Za0akC+f0`)>c#lZz;7{R3;+1QjcU9Unq2M!j(brW3jmId4_N!l}us6&FLl6bek zZY-Ap)&fbqZ!Oh*uE~1$P4`1-+Ti}`{V{i6hdJQ>J-)=TD#QyOMm}g@cJ(y)tH*cR zLhFEr1YJPYh1H~V0}WUA;)^?Zc0_@F6i1dTO_7Qv-pc|<>?lYuTt zjcY}GFW?%pdM{{xF4-PYzFuXG)qpeEY5D`*Z(+(~|Y&AeR>|+Ad zD-nZ~oz_L8J{y#axi^by(me{dES4iYVc1zw6}?~NG&p?YaZ^oZ+@iE>r6Wib{tWnC zNHiNjY<04oeb7`L6S@H|NI>q(5|u)@TR>&p*nn(D0q#F={;>0pF4T~YW@J&I1UNhE zTnFb?3HBYh3RIq+5NC@O_AKH;@Np$=KVUYrn5{bz1*XMW5T8-P?qkC}LgE9ViIs>{ zIC?7$d`@h>HvTkO4tC-@&_i^KGsk@vR1AVIM-RxV=&tOGCnJvj|88|nOEfb+(S%uU z4d$yIxL%s#zGYCk#10`Qirfbdtv*xN1X{SGvI-J!9gGBFpAd&+hB7^5R`*!OdC6l{ zn1)KIaO`4Pzga`!+@OquYk)Ye8Z~vDrX`J?i;uxq4bSbiQJKmW@kdlkfJ>ez>O}*y zq)-wk*a?je(x?00`=^9(OWj+9p`hDzi^InX8y9PtN+7$4siT5denDh%6?xi0A{0tI z_UMGK{TGKghw1+^%IuO&*o`fNtq)m`%;+qS8&F%Nrc(~3)N5LnZ}Xyy?4+A=w+&l4;Z4#Pk(+FRvV#&8 zh9?-mrx)xeQy`YyJX}d`Ns^waJotk3=hKCcNX#!t02^_u@`>F>DUA$KrOS z{u%=#T?-BYf>==n7pF)_C~Hh2v!{>EqN<_NM+-<4Qw0XknF5iHbqIH^MQ&tv=U|h$ zm5>5Rl5N{{6o0aIU@BVPext3d!Bp)>HXIUR|9fLMwnprbXRj-uLQGE#6+$(PkzECh zAU6hoDS(k0F*7Y5Ec5hs$Roq$I>(a4$Tr!Lfy~F@;u4x@kZpi!94Hc&Q;n_7sz%#$ z(hhVep&86HtUkzV{O73Rw7u={IW4!xZj6lYixnK7H?_+-;n*cuzSZud!S}iYF7I`K zJO+d(npJ1{v>FNuI+%@xO{w4^n&fe_7nGfd4}g|0Cx>>&V`JpRTx0I3zpfy*>Ug21~?x;wPIhzk-ZMG1B1JM05%wo zb&-9#Lmk5LF<>}uZov3D#J?TGQ6d(nOlTFe3dTz z2B==(BhAM#4HOwg)Aqy@&Y{^(@xP1>43N?+I5rs+r*NP!DC{Z9o>VRPnH}EQQSr>H z;R;${ccE9yXi=k@;X2Bg`?uhl;KLuiA4o^?7WV+wx!c{xr%~(5al5TsRqQzQytGn= z1R(&V?0~*UQ>n@J7W|q!{*auvnSJoi)En%F?{hD*-_143L8#y~BF~0;)3^y!(=2ql z5h_m$Vr%2iYWQZUX(I$UQ7Ai#NwW*uln)WK8{F3;M=lQ>O&ehA*7xdLvH^Apq+TG$VEzKQbFy&a}VxU%E6vL;(~y%*A| z?P(J`)#aE{P+QUJ5Yk>J?x?Ut)N@!O2`|F5H#b752cRUYmg!pcJlqxg>3RDk&g!7Y zUv?7o^@fRZZXHY8<>+)zB9? z=k_FaBK=~*f8heIxDk_i@j)J10ZcLsH@m2^RyV}_LIA~h+7B!uN57W!!#1OvSdcj4 zvk58IP+kSckPVShmqPdequ5U%#;tg5p}PRPZ;`(Jjg|glA(c{+K+@aM?ZGToVRI0u zfc=X>F2IcgXDU=3m_3ci+F%tPH9WYF2G`eZdK?Z#_u`S~$7Bg%3=n}ORbnC8lX0Nq zIZz9_RRz&&c_lPm;hCa2aTc<%#0DUQ{_%(f^$|g1c@C&#K41g�-O2YQDK#jF=aWbss1Lm{DFEIzE;fqnA68*ew;_G8M> zAVLsYC9pU-d$lcQ=Pd|z80a$4(BTij&YfsehzlUBBThFc6_J~oO_J`7#4hS}H$ zdbizpP`e>QD~Y-0=rIWL{C?H?r#+4z@B0*RRzu}h?1B%&exbl^f&l~n*=;=GSa3l1 zgO*|b)d8Fk-Z+3fSn%-tgP262aA&8?EtnNg@bXc$C>$Py_Yzj$gXjr&y9<)N344)H zPL7*)tfgR!2W6$vcBS}&^@#motGIA~`ic$VB!v6H`+3}VWr(f*P94{Nh)BI7#XM|@ zU2ORAv6mpsbAf^s4pZ^Pq7QPiX)9D2&g6_gaa=>y2xCEasJ;P>&JN#f0i?>I${RAe zB~ujPeb~W^sF5$(&e`=Ii&NoUj$_N9k*fF_aE}VOnc=Ljl6hOvYAQA|(F!`DT)5!+ zrCYI?WN6qwk($ZtO1TBUp3HI6dT?~;EoJWASlA#sSS~mffGW4rsYp`{m2Tn*ISOYo zvK8?gg>7ww0?K2hI1i6ltPHv>wuv27149`{MZrk$VMa?=b5H#*FxIAzT%YHmXt%@w;o467#Qw2rqtcar#r~g?GsdB9-1w6 z?+|5pYx1+IbM;GgWw)7X(!UjC^~4wEU(nWIZ8-59VJQeMS;sCR8Z7Asu(xXH4?7Wg zn{`3&GIiXpyq#usxdBmQ5G qe+fcSLQ+0wO)%JMH3-UId(pC{I4m2a7t{w(TSq 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 F-5(M*(X{{o literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/base/v1/ss.o b/build_mx8qm_b0/ss/base/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..41d518f9b1de890f536ff060b400efeb54367c35 GIT binary patch literal 34852 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/cci/v1/ss.o b/build_mx8qm_b0/ss/cci/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..1373b42a4cae0749b3ff15af163f0eec25c4b65a GIT binary patch literal 48368 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 QGb-QBkZ*2M1$Msw3sV!fJ^%m! literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/conn/v1/ss.o b/build_mx8qm_b0/ss/conn/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..75043747ce752029367e66a637a7b0141071d2a8 GIT binary patch literal 50268 zcmdtLd3==B6+e8RSuz=}_7#&r1K0r{1$lefXsM)fYokc5FAM+y49$+ru9WRpi&Hy~`DHJUaBSdekcO zi+!g`ur)YzpQp|!&ab=ri=0hYe~~eF)=T9Ne(S;fRrU`bQ~p(FZl5&j+`HU)$lcTH z*6iKU64F{^ubMPE|88UYn!Tz;6`FC6+-+jDE9>P@oiUB2I|^B{F~|K<zJYY9Cfqm9aqz0 zd57%SP8-d5$uWD`Ywp>HzB+AH>la1AtlqSHY#$n#=bSXPLG5+f)_i);kowY*kx{er zi6&!llK0ECt{~{O(syp)EtDPqOF?>jCFj#(x(`1<>CrWp$sD7)bYHCZ_{7J|+PJqMfbeG9*NIt_xzDBoUCpNha2j#kH5EC=3A%o2W zE%7o?$mrg*efuWt+m{c@21}3bP2aa~B54~^ouGaD_T`ecBUKsO_hx4A%iL$r2jx^Y z(Ahcrvi3RhArq2Q_w7~t_{vu<1>3mC=~OjAsR`q>Tcs(LHcn4a9;H0vbec+6-&C8% z8w$Ddz&egSaOS%`*l-j;GZ=WZ_)Xz{p)Orry zJMf-?H($mM$JmH!>@YnvC~1X)(*&mr775N0oGp0%VnwUrhu3IWP;6OTcOi`J0jASk7dJ^MpJ=s&ioxQjSQ+zf%7oQk)xg z?$qTlx^2{kfAjLsX11-2x4G&e)pj0=wJpfMh4B~SpYtmIW617sWkEIDiD)C+;(Sga z_EcByG`Nbx**h>yhD>Vo3pl=gTK?-`a5>(_|J2W&i2ev|=P344QQPBF5RU4wdlvem zbEA>>ED|O-9N)K>!N_U5(K3#kJv36<^In8+$!5IruqMk9N+-Wvc~c!Xx;sJp7NMq& z@422pwDLVW6~wL1bR;;Gt&!Aic4o7^I33|1OnM1i84j1@bi~<>R5yk&C&QT!qp*|= z-!6n*j#C(O2l|t?PG{rB=iAzK1YoxaMUutg^#fl&f58?(p4>25^<9QBtb!ikT#I5gy-_Xg62+ zB&K9!hewrbep&;v=RnUtK~K-?_;(Z{v}KganhCv&T#HkG&+_2?%C*$Z%*yuziak^l z4&OVduAnfq%g_F73-6tX?)kjTS9aCtF zb6_ya^PG!+e2ZY0V<(8*tXC!?gKH%90Z_ivFb=x5W-_dN@3958nc^XYu9)=!O4;nX zFVzMg&kheM*AKHab9OkYTt6}!H9Ndbx$f8DRNwQ|@d5V|WcK);rH((=gf~0f(XCt$ zW?qD{GJMBDp6el<$M4%q%RMoHmMHL@G7H2{Cl5ojpl>pp<>|>cf++G$MGtm8oBlM2 zknag}R@cwnZ-FSz4v%yw*YjHRTo6$61+C^15YY2QUCuJ!aa8A5neQV{h3^LF;d(jq za}d?p;XVlXjTTVjODEfJb)H6FIn3qy-GmQNpJv}3)cTFAAfU~+n*#pm8HCmweC&L# zcf9PX$NE;H8@b-qUecxVoanG@!W|ufCN@=%Er(QU;1W7pk8KJmPoR`7&}&Pj{EWa}jFztBZKPmUAldH3k;jL7ilBHU~bz80I?J=4SQV0?n-7wKi8NI5$k9 z+q-VGWz*B^jY%sonz+7e%c3VY8k3HpoSSW)o#6ewZPGR>cZV$_2NnKT{7aMF!Z`F3c5-D+Z*W?qX-OojVPDZ#KC*ptJr--I&#j!KWYNlJr!>shUaUSG; z4iS3XrYq^rW;1CQw3E@wefUfiG}Q<^ii#8zV>tG>rW>hE;0Wk0KEuc)p#tk@m6?Wa zbw}V$w%#m5w|XkdVuf7}3NHBGETz1z9AE8MDA-3yjHb3Vc75IRI`{}kUww5EX9n*p93|j^nQv=y- z$un(v9FU6wYw1;I*?crlePAtz__J-roI;xei)Vp4#}+sWC2j~D&xZS!EtmadbKq7O z%yq6w4Fz_wuIHK5Xu!kr&bMVejq-K`Ug8LGfi2@Vpw0klonXY>hHEqBB26VSQfahw)v-k8dV;SoeXL*la+^-rvD2) zWv}ZSHaolOR1OBN%WP?Esi`+3o9h}|8cQ_G?zA%bRqClUs)I2>_Eznjh!{ZF<=_+? zWVf*#`Enh7CjNWqN4F!OOSh@Qe@sS>QhOdpqryAcsAcxaGeNlZ%J%2>%#A4D@f5PS zSD|95FWR&2LX7iO#@q%AroLkGxF12Yr~clawUx=AGx>cKmim@G>q5k2-itPKFU_K) z%tJB8yO;T9Fn%R!?Otxim%(k_Rc3f2GP`Td@L}*1cfA=dL{D=4r>V>#o(;;w`rK*d`I|{UV$pV!e%_*eCjEv*r>W_f&y}af z{tBw&I~EP^sm-|xB9-q+46U9zO*nj2FrjCKCQ^OXOsUs|$M+8y+0&qj44)s?@T^Q@ zc{#ov=wY5!Iwj~kjd>b#PJ`qkp9e#Ur%4kteT!i*&uYyU@}15F_8LtT`-(6@dYUyc z*Y_O~YjvIlzTa`1(V~e(zP-%Ts@azKN|@57Q4|oXNZz9~;qdK-TY8VyM5?bA!oA06!sD9@yLyk+M27F1Y}ey7 zk>l&3w2hkZ`&=-XH>`;Q-@|A!?ZscWe+uhbBV4J`$apDE6I9qDvEV zedm*iXkvkHH;HadEb-k=qDK?UeD|ZXdpB#M!uKUi?CsS=jqe*6N4&>tqTcs!7{r_p@gK}{U%y9)E9cSsYPd#*?=})6ni%#yMq;ZbMt!$ndE?!tiIaUH_P1py=RMUP zgDq@F!tZ^9dh)VOq+@*B41a1v_#qv3{{!yf%QCVqRG5Zd!+@5tEtBC{>$zw!1`%9X zn^F!*p%#>?LSMsCj8Fu{I6~*bPn@BDLtIMeA{g8is)vNs(94{*LWjZt6GAnpUs~uw zxQZv#igrj3Jw#iCj-x`M21v^YO+ydQ484w+tk8Ri$qt=~M#>3QLe9j{E0CWXx)qZ1 zLcfPhe`q3P=7-LQI)Ttx2u})~gS-Wy^Wff-L)ReJl+YWPmZpau!2emHKO%1^bO)+B zJ9IoWnG<>z`X3TH2l^C;eui3byYkufWG{b^W3Tm`4bORb|QRo&}V{zyO z@GJ>^gj`EQgRtwtA*>PSPdIXvu5vs@k<)H_lNk!;v_)BHzC8Sn` z8o^&3S`4jfLOUV3HgpVz(z?)g#HouWVXw@G2CHOl+k0WnqXd$F^g+i!fBvgTktUJVIR!`_k*nD&7Wa!fy z+5~HC4=qHkPYj)cUVBpLTGZ?0&_mGhl+ZHx{Wn5Kqjsl;>S5I#p>9~??2sMO&Iw%z z&TobOI1O9u(EH##FO&F&1^5Cs+j|(=Uxrg%oB8? z?E#oCD{96shw53Um|;Iu&pOTISxTO>&G%7hybr-ZIlnf; zDbPIUcV>7x!V`Cz;jL(l+-+ufA+*ZfZiY`obLO6-!`{@~i`;*N;eDg9W9}vXzkpB8 zjzv3F?xp@efH3S%$DA}YQ|@KyEZMNz9CO?#J@;~xHVns{??B7kD}+{#*+X3__sWa~ zkc;fjIj2+hcXC6TwmIi~MrE$bsUYoeq|Eu16Z9@Kdy37aY!NtL?rwV{7@XA3_8ELE z_eN9wN~oXLq#MColoxSVqRPHC5SiEGJsy6bSbW}QtN7rY&tUYtULRM+P&TM+@4@hS z$J^78@ep$y^8d})3@UUAcLSkSXfd2zQjf2rWR%*+Lhf z3ii;I`0oha1&?utazh-t?t~~;C>{1m4SfJJxRv`J=;5~;cKW9K21xR!7`kTeBDj~| zZA_$Zx=%zm_j@FzoP(a1c0BcE1qro+J}JN#1&_i+dn=Q3B&@Nu(Xn~2f*sf@G8LqX)OGAw7b7e_ES`Kt||8?Ehd zl?;sZD}TGGhfTR#5a;hO?9VYH*-@#@hPwmyF8-9Q zdc2v@mYS-x5x0yP(J1Zgg;o2cP7cE;W{>dqTSiny;C>8*{sF^Bc@AuGsjmBRG_ils zu%{r>xf%Z^8~zc){e6UV5!=R!P^QFDOCn6>ejKBZf4gBnk-3>?a?roSaBsrsY*zI& zBZHe#}KWnU}1*N@Rqso7_6@gOmY+-Fns^9}p`)SUWG-sHd3aQ_Z%7wDj& zE;qb)L2(sWf`0A4(g?hZdZY%{W6<|sWlSPtM&MC4^)4g8u_7n1jXtv5$bX-)ftmb& zwMi8ODlyvmuQ4WlgxFxu0@%={DO7tTP7aNK* zX~+l0B91Cf!8q%G*vQ~8V7QEiru-fIATY{Q%3eDs2r9T8;f(<`cF$I zvl$zUqnH@{&xm3vws5hJn*Pl4G$UO6Duq64MW`@3UNNFvj^m-A%khj3U#@LR$+Rfz%XwG|exF4?SE}?yXZrGzBoRiU}Qyl(Z8_qU_riR$bwO^(a40dA3rbMZ0t?&WN9Zn;bG0i|LhJY?Cf6Dd^czOP1Sr36L@6X8m<^k9{$Zksh9u`~qS7d!?v3uESy5uD38L+Oh zU4sVCzbY%hMGmDOegJj~_Upmc)`;fK-<{Q9v7c}Nb_bg+t^)Nz zE5HO8l#5844UUq3z0PEN6MZB9#;ivy0q^}M0a{Vh3=cYy=X+TnTX`m;F_O)o3pLsQ zL?hpnRR}I^hMNDx&P6RAaKo?jZ^>%5*kk{Roe8KCbJ<3j>9*`MnTe%dvwtRKTMdWJ zzr%Yg(t=O!&mgXqPj!EwTg|qSu5`C{Gur@`H~IH?KVa@4%${81F$4L}qQUjQ0ftWG zzm3pU*>cev^Y8N(BYSY&f0dzAwf$U3l!#{8dTarde7g#S|>vxvnQi1MHCZUI;D%rVw+q3o*4b`MhW zf9k!6T(^yJjW>^3G?$B)(LH>_Wc*W}1EQ7hQ;hKWf1b`~9S$E| zKL5kX0T8LaOEGff|7FGu5FXzhBt9zSDM*IzcXXn^h7JRfrvBX!3C0PC!lWzgB%y%u@@t=izKvejyHbDGq#-ku= zeDf*o%fe?t)cc$qCcc{T3W!Eu7~L`d-&6hoqS-f%Y+q0Q5Ja2rMz-a?$^QVcA+QNH z#4W5T2I_Te;BZ#eF!K1gV^iQgtYGqOMlcUlSKven#Kpa7pf(3?e{p2>7?aKfb$(z9T`=94u@ltJz%kUtYZUGRbt#5o&eBdg zg3G~4+37}^E(hmeXO0eXesxaOLC&4dIXcLB(Ya6uIp;YmbnyEOuF}DK7+kM|oS&TS zI>>3q*{6e?Qk>g#a65xMN5Qzs-~~F!;of@oh`K1nWY;vZ+C@u#FAZMlya+Glv=pgr{&RIIh z;lx?4gEpb_UPYLH2Iv zWeB=$uwK5;u(Ja@uS1OI4*Yu@Z@o+_P|kZ0F8nu|&_CCa&jb(GX77x16uJ#0&U56w zj5v2c`ca@z4m{q)kQ$gKL?>hfrklj%)IgQtz6!ph_jG|8S&QR(r#|Nh)LQ2pI0;z^ z-2!!nmm{I!G*mIywSg5@gxx6q13E;Yer!8qE4~85YM@~(!cp24>%_BZ!^;(;kzz|x z?i#ppV3lF_LkTA}nd}d&HQYZ@pst6aH@>r2o?~54MxV-jIgC-7Joz|9c5&sp;#kDWtPTbDsc2z zg|d`;D}^3o*l(wH)Cm^bWVp{jsF-`#K*#t|k!8wi;-?MtX>ztq$$XTZpiBdH8s&Y+PY?U1S5r#c~G$go{b$&^>P z7#%2ZiD5pHz6detv&EIb@o#eE&%JAlVcU;rU1?WnBb{} zZhH`zrkuAh(MucRNPuykxA5=Rcv}TLg|N#phZ~jOAz1iB`qFM=26+mPr@5~-CjH8d zoZN9|&Ka*@VJ2!ExW>rAwNvH!5QWZ00EJEg6h1WpiPsthj4Qkp%{=J^Tc8#qJlth& zK&;ka0!9LI_@U#Zmu&@1C_I+LYqq@aDiC|%V3Xc332#Qhpra) zFAq_1+gd9ALwh5_koTbbxiNVUi@Zx%-$w#W5D|}#iP%XIpJH)P@R)r!MfeMT>Rww6 zgB%SHD0o^#G@#`Qp3#KO=Oyto-60&lQCjC&O*l>K{9F?$zRPKlU+8MMd|#mB7Cfhk zRMQ~OYlCDc+f;O)f*0&>vh<9CH{H8f`tRWD1#d~|93Be(n9Br**-&q1T@NDF*TWWg zC;ui89vH+ifnH1x#rXyP+y2g+@7j+;y4P0lXZPy}WN#koR|S93CQ#XZBtFsv4&7U* z%U|sekUzEH6L)%v=Gn1=7rOoQ!~v?uCPU8X+t2d^)IflgbG=T%f$Bl-$4}=+y;2lgbM$V7)R7 zt*}4vF}6DenMOWqQV{4Qm1U+C1)`~-vd!{l1a$AnF{zm_NH%h~9CyGJ?ihQ~M8m#@ z_4E`hGTeQv=UUcfi7}Clr2Uj{0iN#ar==2O5G<~Uw>7OlI>&<}(Q_ps{M z3Gq0I?+NiLYjCR&d2GZV2yrx&FW6%e9u7s*%Va3SwX1)z4Sr%w%0^saJIj62$eIJi zJ#?2=i_@WpKD#RXJKN=_M*iVQ@v!p^SuBPs{0Z|vW%xHSk=^xzxWwa`^I4tfDeQAuK=0l z7!M{NF`ZGFSHW4Qn0%RUqIXP@_){T&s>IKO;NasX|0dWx_=Fk0403``>fs>sNR$`+ zsTrPtRt`R8h9749(`NW0cygi0EHR*ugk3?{SHhUfBRe*wQQmhjKvawQU;(o4gKc|&(-L4^CbRsI8nKTr@_wURi^&`hCSym)NNDffX)l9vS;#e zZC(`&XGFBIoTx8i_Q2dmcU+9V77|BPe%6WNw~!FJwc#tR$IiG$@*9u_kh2+z9{Ry1yy#CWSvsIkIgb1COy zvhn$Xaa%6qg^ef80~T8@b^>Gzz{`!hCo^8ycr1OH#pYGcGs(s$8ODo~882-7MA$Rkur5v&8$p#?92fOnYT(uj(pb?6C~}$6Y#TPK3kG{*MbR>& zRrnSOU-|xg6)VU2Dpm@gHX4hmSXDHYVoqUk>WF4mw$7~VIp8&Re+#0uZ`2ucSlRoa z{~dVi%GMc6S=moO{|)a&d)PZx7*3vO6<}1z!Fy2^n{$ORg{z>W5wV_;kHQ>?T*k<= z5pfbD%Q0&h_2vZrHX?q5w`nWcTvkFQwGt8PK{%Ln`y2FazV`DCxWRL zqSXRo_HUsPY{g zG^)SEM8|i5&5=^|G79G#300?KCgMBy*AuFS&}@9?zLHY?B6<|x3kr>tsv#c|@TR06 zqSg5>xX_lSj7(#OH#^Plo#b7YmuY0=VLh6w?A}Au4oh2_)_|6_7pb(gBfx<%W}#w? zbEbwANkC_D`M|@Z)NJHkh83Dygg8wh6Y`9-G*hMlHeAVxFT!IO4cUxOFNEYWRK}Z~ z!0(IaUxM@u7Kr7=f;c(L^I33Kwqf_imxYfe*i)_QFmI0LaE@y;F+n=qB6p&i1yOku zjam7oVt%Kta{gFW)QbuSB&)6_g-=R|fGjL^MIXsBS*j-F6tRquQ{(fay{G~UDwLY) zg3OvuD}?_{hqRROsuXDhqSzUbGhS^bEl=H zr+Ly?xjCYo_Kfl9LmWo3q~iE$jB}QVTwM!FERByC=POHxxtTs!v=-~ki*Iimrik)* zvoK=*0=0rQLI#oxN{!|D+SL%j#>_ObQY!pcRB59wbecxe>e%vrR0Z!}ggAPCeB5G` zLSx3qEr~A~16({Qq7IGEhH>Frry1yO^R%ZgI~S9y&3{o9lsp^>D$}^EDt{hY`iMl8 z6BJ%X2Sh=JJcse^R-rD zGGb=|W^OPPM`$vyy_TU-GlB4pu>^)F3ONXtcujyl@T&;XhT=AQtcVs}#8xwbU=`7F zEkhTZ34}}Wrcy1}GGvzB5?{6^kaXZz5YdKeC0NyK)n!M`1cFs|t1g=p8FCP;vRmWI zZjCQn6JU&gu^1aZ!cDwf!q)+5E5=(dn-x%-5VEPc*AkfvZAUOO%w>7k_c`8QIg5DHlFD}Not8_I&fog9)%i7GnbyWLjaz>ivf1!vX6r>!e6gB*(aHFt+ww)Xw_aQ&Z@`;*SjG6) z{~I|S)3D@GA5Vog#+Tl7g)f%D`Wlr}#!z4TaQ9%ezbqCj>l_>yDBC(um2DpEkCb(^ z_je2qmbH%z5B9eY_YMw}4M#@?wuFba^n_20jKs=1VndqfA6-&59O)klcZ~G*b%ncn zqh&f&(uAbSufzG~>uE_sy>Y7+bsa;uYd+dL-hHURJ zZnc+n_eT4-wMQdmW1iTLHa_^Y?ig&3b{%|bS2wjbw3apePxprZ;wxQ|t-YO*SXtAC zC2N}wKI_M+fAA@f>7u*0r%Vs>2dnl6pWd;pon_JfgHvxj|NGxuTl|+1hW74_o^bFf z-WBcL8i~frcwl|dS=~~8G}_f!e(L0wC_qQLk zM#mA&|Ll?Ae;;FdhDHun)i-zbAGG5mbq_~J4_ed54&H@WZ-39hYW6;D_Jeb)*SEDR zcCgyLf5AbkdGF9cJ4VJZsUDoZzLk^e{Dbdg!#YrkMLGu$UhO*v`}+q6l#0blaSIhV z+=Z`gFTq33(#?F*+&9>{1tDBl3=eM~ip0z?xVj?UCdbG?FGw>!8i@=Hn?Z{k&#Co; ztgu-U5^?XUb1)hSclIv;g-bPfriiD#Vg1AfF}O{EV7RNleLkpEO|5MT4-OBFC-%mA z&9vAc6~)8y&FuqSeK?(r7h^t8Ksqh~whu7}ZuQ{!)eM+1xMgkzaBHwT))&U%CX&4- zp$`i|;!Yq=-w?oM1q8ydmJaj5B0^Rj&7i3g;xrd7YiP_8#O)(Z=Lq6Hsit!Uak)y< zczUl9H|#V91aZ+((*=UKyQt|Yf_Nma>7XF4ziAo|>@`joEE1d{I8$(zS#x?dsuMD) zv9_Cyhy3^`r4yck3jp`n45u^4X{2NXozA%_bDgOvhSQxg%{dJiT!vuTSa7;CI2jSs zowJdaUg(@X)tO%AoL%B{2c1TR(>=#&9Bac@`}32UBK{eQ&(3i!%W*mpwnYd3p%|Fxl`)kiKR|w%Djn|@p`v{`532rDTLu0x#MMB zY^On-OYooe@H$hApxLxCX21`F#IxS0S+kMCwn>?utsBB9a84_7rY=OO+hHK4%yrJw z=4I2(GVSRuL+qp!JAOT78ci^_)EUD6V5xI5!8y5fCGD4)vexNMvG@HLQtXGoTq)Vk z2`Tn|TGqhrS8b`HGBhx)S&HlvXru$BrOb5tQqYn{k<&K^ChsZLuFyF&5{?bG4@cm- z;h|_`XfQS$9#;Kb?cvV$&doZSM}=YZ$-ywU2@0JrjISFD4|aElhokKSF;!i^x-s0) zv?5$xw}Ns;BcnrRhGEUUxqnFEo4CR#Ol@gJX(O=}(ZP|SaAQMjn@)-HyYdo}>Kbb| zRIh1j3OAHjtNwNjUs2pr>7sZ%+0iF=~E0lhnQ$vVF4gjjhOc()Ijkzh|K zV@+FKWsM3~;cAMCbz;Z~ceM|tO&=ZG3tkzC( zAPV!76|Jq|hBe`;mYQ&NTT5f29cpWuDiuuI$$wo6-ys%8t87Wq8Len4-N{)k92uZ~ zwCxaDUq?k@C{%p}Q{cQsrVS2YuwkY7m?P4asK}buN^Qc(0Bq8OH>(%!>+Og2!`*%D zJ+Vao)|%Gl1~r7+Dg(n|O4Ut0(vj>8nyq~(jKj8Yv_H)6M1z_8%IR%mGoPHssc`4k zVSe}=H3KjFk~Lw!u(}iIaICi{+&uz|wfE|oT}*@Kfgg;ZPti9Lm0i=;tYGMH8x{g8 z%<8M~K*vb83XcpRN0&5FWka~-$i$rWmFR-#DhUqW*j%k6%{J*84C5p6VRZ8L-l(Ey zpc^M!tG1<~vN6u#aofvkN7QLJg5jaPuMbo7@ci;*6E;*fn^x!>(fw6-4KQ^MNBfl6 zG~C|RrP``%!c`4zwJqV=#)j3aRvkEI#;tB`DIX8cS1q-b(jm>^seN+?8;;(&zeHFY z-7}(nw|Ag-*c^HioT9a|0i%KTt%Ufx#>&=u6&>skYnAknj4Gnri2m(e9afKK1Fo(* zs;#y)+|;euaFW^u+Jh%-*p`NYAB+U(1Ha6E+qJzu8&tW#U|9sL=-I`Pg`o_9eDu+%Vjl@R! z**2!*O6TV+$9Yc=o@#JtxINlKy>t)OqkB?qTdVc_H!{>UxNQJUL7QOA?HwMB?%y#I z)oET=XO7X^yV|#_XgQ|Wq^{Z2(A*HNX>Cv(z7sRoR&$ICa|#G2xng58M+J;i?1WH> zqZD=n;ofdk`UEDRwV9x2wt+!CYhh|vT$qQs4$#BAj6WDaG58Pn_D2RshQk<<%;}6{ z@w~W!7y}io1*1mvB*!7toC;7*S64LL-Z_kW4s`Nncz07(W3AFn&^L^qWI_vfaW;|| zh5Z6n9(wN~3jrnb3PwvADLJ`qqv7;4*Bk4CAIj{B$wBHnJ|Uw|wbr(*udNBs9S_bM z50;My+5d!hL88%H>nhdA00#MiNLLV-T%j>Ehh5B>Ub~>F17|5L0fwVkXKZWV65$<6 zQO|T0y^e^|z2RKizfqeQT@8Ds#5stOy@Pr_fiZ_Mq;nD(>kj4Nb&b{BZiR>7d=VAZ zeuSwAqY#^3w@Ek}8&H(oJ~$vT)?7Z`$00quE!u0Y48^1MItD9@{+_7nigb+hg!>{} zBYkRpZA)vzn$^^;e?+g(Oh@Aiqnf^G`ECX+bY}i3SiL!l!8p-tEyPiGO)E~ zRhUab`1k5HEn+mThRk8qoYuz&Ele)xX^E?&{l}Nq=9&hpw?)uyW-Do_(n@+&sg<8= zE}zUL?&@&Wy1H;>O%2w9dghM}wW9_cC-lmqx}`e2zOr#0+_`_GPgjk-Xw3JUn!^~~ z+1gR89;B&jTC2k=BEv1Zw~bA>kC zxjE6mnD(`w;<_&Eq}T7^@s5Fv;emck@Pp{s@$JH+UOjD7{{)q|@X%vC)aa)DAwvv` zDRNso=Ad328z|ESu{_?qor_mBG|=83k-bA}ThidnCdX2gqnf1#m*x;1#R7x_mpMF{ z`vMNv2|BH1M$S>y35yJK%Oct(S6vPD;b@|Ft6p}s_i>EF<@j!vZ>_+wdK!#wr;X5^ zM=&pP6}tqqrK8>?;WCajn08}6+1yv2s9ak^Q*Dd2!lII`+M!yHM89aLUUih&nYr(< z7UB@Eof9jzgr?HnhU?XVK|CeKS`jlD#@g6$)LOwNSOp8qrWNo$tX*}*FdUepkvScp zE|DmEc%)PN6c%hTb72b$z{F$iI_}ciI2g=i%Z0|3Ss1(tMbk-|k8DbetZ8bfR`mYX z$S{V5YUz8{By0|Z97fH>IMlV)tl`0-A*wU5wKs|_O+Q>u=IL#nn>%#>id!q_Ibri4 zesGO#X{n3+W25FgSwuh%+PJ@cNDkCAGs$f*4lDZR|;9>59*O6t9E?|?oEF#GcO6fQy&`$VEH zZ0(lSD-t6&wA55f-d<^j_D);_kM(kknBXl9dOS&p;!(hw)#0|v)>V3X<#$-a)}y-b zjqUnT8}7OW+WU0ZO_0!9)6|3|XXoJHmfnaOiVb6_lh|>s&7I!-!c}B57iG&Qh^ibK z>g(;)pRZ|YALxm+VqvIP@6Bs4wdv&yjb|!~87?bWMk z?q|Z=I7y0N((3t+v+Gfg$t*YtF!wc(1pe7_Yp7Tt-Sx_V7pLtO*5 zt1v2zyCvKQ5qiC%HxXQ~=*dScSJ_w_#%_*3GKH4LDxUwhB#P7;CM*r`Bo#X2V_?Ct zfnPbFrxP+5hCN5vN%R#^JESiQRnI!EqI4;&IaW@S4C+ z$0a{@=qp;9ThNzAI&@d$`g2_?PK&U+?ZcxLDuxx5wKRu%Xdmte&E+JV1!KMTWh8MC zfnJcP+WrHU6drDEZ62Rz=If4{pk!-J!$o@5x>)06 z-1Y`)CX~7Yej4rVH2GVr>0fn~)oobGhudS=1X^n>bhj7}aiiEh;j|bF8fsqme*wz_0 z9O^mFJd)?xs~JitwW+#twYl}g`5a8v-#d!4S}sI%zvIXR?~U|FqCJs;&h4gISnIjg z^uaOE9LmSnym2mxO@+18ODq@-yV{(Mah$^w0&`|YzvFI!9aV2qp$68J5XgZuQ9={e z23$<*GsU=*2id-G@{sjE_B5m18z|O~mR_pU2ld+DT=c??l26cDn{cpIUD<-?0sDVe7#|zPlW22l z;eMZcG^GzPx?7CYMAF)V}M)axZ{!W9lUMwrk$3JrwzJ}2{-AZV6 zIm1vqvTDKC57E+c3Z}P!ID2gix7J|tk89d6F1j4|yLR8|)tL9%2+&yN9+eD2WY~bj@3Yn1R8P5v*Am*xCyD+Zw=-CpBayYa_;kiL=^_p-q&!+WMAP-&i zh#I#y5BK&Djo^L=&S+)yLLqSe4m=OyNnui*aag9;Sv(zq7jk8rG_`4GOvqJJ-HeA; zT!uu=O5)IK{LBk06g`;e=Me2!oTG3|hmrOHe4m$I08D2Go;v7xZ^ z0<&H!BRPIFp#AWTc^IF;1`pzlY3}x^4F=%O(f08ff4&~FarD`@U9Wl*ErHK@XiHcN zF-jO(7!&jBGZE9iWGsHTIK3pKpw~mM6 z$L6F)JcIIGB=$f?~@Z@!MxVE;rWsP2^j<0E?<@6e8|Amko zADO2RT-uHM8oUx4cQ_8Lhyyfz3WJc?I_|7Y_2YC>9|qtUZEWE^S39KMfblSwhcjb& z$1gf?1v1!y!=1R{3lFAZLy^wj?p|~-G$#iWZCW-YFPu z)zHt+4_pF<7Cdu7J6P)%OuD#uF|2y<;IFL{gIq$s+SS8(S0Wi%R%B!+{zLBdPd_saZIZfV4zqTU*le9X+V=W=Gs( za*RhTIvmz>YJvvxv>8%)vI42*$#I8@4#BOcp4qMq=CiZ|oMbnY<7kG5M^taTN&9hi z93}D=6P{g}`(Lw(;;yK$NpV&xD`qn}adb9g)-r+%!LcV`O++T2@PLbaRYWAUigB- zlf9mFg$uP~FMgF)r8naY$C>uCY!@2GPI&&QpFZhT{DykPF9x(;{K~F4zJB4WPFpFV zs`{QT}V^Mz~YaW6Y=kSFp_(EQ^z#|`timmS`b$nVko-yP$j_l&>nxNuH=$6xr- zTZ@3{3|>f&d)aX#9T&#+i`1vh-<1f3yue6Ml2xY1o zp+|xEBF=R}un8$CpW5IfW3v67+9^fh4*sh8ajE`EE(#(S=q9GUJakESY1=KUu3=M;~MH=0j+- zFXw^@7(h9SPpCD&nv+-$+J;a3G!iic&=+khl&SzuslyjL11A8HRU`Q(G|0D`f^P?C z=0Ago{2PH&R+`^jI%SoV*JO^Vlv9p$Vl(-XA3*K{GtGM1<|`E>jUlOsh)RWsP-X#fF@BGL7{qtH z6Y&Y96yl-g8q2nv{R1?RqdbwLsqJv33W@jvUlgU|wLGLBCUk`$RM+W83x)-wg4+bo z75uiKt~caytYW#33O*3m_?+|=Y@MnU* z5qwwh6G0=@EY~MES@00SrGhI2*9mqCo*;Ot;01!a1aA@iSdfb(+GnX?onV*X9fCg= zd|L1|!4Cz$5S%c)KOB{)^ESdiaJ z&-6OMR>4hz{emY7o-KH(;Prxc3O*?KjNm7N+FR-Yxiu;LinL z6?|9lW5Iob9&D#5KVNXB;C#Uf!6w0@1$zXC1-~hHq2MmTn+5L^d|dDa!QTu1N$?+n z{FNo@l_5A;aE{<&!5YD}f*S?52yPcVQ}80es|9Zn{Gs6Ef-ejHR`3sk?+N}z@MA&# zKq2-0TF`-so%96348dH%0>Np5A;D6?1%ihPRtVM!HVX19^I6UY!Ht4lg2xLE32qfU zS@1N$a|ACGyj1Wi!RrLSFL=A)J%aZOJ|g&};Io1+3jSJv*2FAe+YghXv;SF@xwhj zpI0zPFd!Hd4KLC-Xr+9;4cN=7W`C@3wM?~QE;AMmEf_09fG}r zrwe{d@Y{ly3GNcSUhpQtI|T0)d_eFq!RG{jEBL!A8N2f+q@| zC%9Yi4#7tRKN9>}Fo?Yr%V`qaC^#s1k>DMI4+*|1_?ciP4k;+7TCh#9SMV~yn*^T_ zd{giv!O7TIQO+8{cEM8w&lCKP;7x+}2|gkClHi+y9|?Xb=*HfW<>U#@5S%YqDY!=P zIKeG~+Xc@Syi)KM!5<6$T=4gT9|?Xf=)lm5j;!q3c;HN9}s+2 za0-s)DF0Bw6@p>Ge!*`DULts#-~)os2>wR!J;7q^sVV;m!Q%zb61-dR4}v~?ONizd zj0)Z)c(365g1J*o{#wBk1+NwSso+b3uL~9i&3wlSUMu*#;J*du6`FjT1kVz@UGO=< z*96_uO#X?2g@XKLch;*_Ff6!3@Or^J1YZ?2rknY^f|CS8f(r$!1lI^2E7&WzRq%Ad zoq|^j-YWPb!6yY@5`07OL%}Zuokga8S%Ul(XV$Y=@KC{e!S#Y&f>FU8f)@(z7Q9vP ze!-^%Ul#nM;9kM&XPV_dBlxc1$AbF=J+n-{>4FOcYX#Q}_6Uv&?h^cw;5&k!38sWh zxp{(11=k5~6+Bb$dclVU-xU12VD@ZN-Xg)H1WyvYTJXn$?+bn^m^H`DUnaOraHHTB z!BN2r1$PPFEO?*b6N0Y_zAN~#;66dmA!fPxf-?o@3swrQ7wi-q52LvXU-9KpqcHG(aIJ%Yo6-xR!1@J_)u1V0hv!z=oIj^IMUYQdug zHw$hRJVWqe!RrL?6nseVS;1EY-xK^)&{it-6+A?+O0ZdQqu{9EnSvJ!UMqOJ-~)nB z3I0m(4}u>F{!7qRX6jKSI8U%m@C3mN1$PPFEcl?{GlK63?iKt>Fm@VkO{2|gtFjNr?He-QkO;1`09dD1R|1%e^L1%efVje;8l zy99>>PZ2zqh_%(Xh2BlXn&EDtA0c9G`>N3I5;6Ae6WUV_dLhoGiSXO`#Q9j~34JsX z?_r_8NkpA?34JpWbN1sxzd&59)Sra@oQOFz6EZ1(DiL!=DX|UZN&IqRCeAyFhvDa9 z1v?~tK+eeM#xPtt!P^iKt!C4&DQ z!7l_o@KMGW5+QenV2R*7!KH$S3)Ts)6l@V(FSt>#L-2UP0l{s8CkdV|c($NJK_B=T zOrp^zm@SBItK(r#jmrcp1Xl{K7F;KIlwhY|kKlk{RPa*4D+R9=yixED!Mg?T7ko(Y zDZyt2UlM#p@J+$D1^+DgSHTR!tXGa8pN-QVQw3)WmIy8oTq0N{SSQ#dxK@zQ$|)}_ z*e%Fs=8VTLw`$bSwLs%qlBO>fyh`vI!99Za3qB_Jq~Om5Ul4pt@LfUv06NEouLSKj zlXeN}=U_-L6gnhWEXdzIXTPr#Y!X~6sGpZ1eT&dh!L5S)IdtaVDR_mTevXEC{rn8h z_yFU9j|o00_`KjR1z!`?&)2}upCxC$&jr60#Fqf-c>Y2;(}RMu1P>8hD7aLxLa;_q zKZis9jY3BRdjbV2^EI{B9h>gR$Ox0*=Bz1Ts%Z2G>im#{ZN4ryDDg#tS{~$Ld93AYxsZ=( zOP8~Rh<;{`V@A-Fvx$hpW)uRE{{$lP?IwahhxsZ*f0VEDgT|lE*GH_tkE9ckUyo~` zuOtmQw-YPmo&e;j(%AO?;r0$7KH;r#vlYT8vW8WuzB5tU5sRr(e6FjMk)_tf5`Fg~ zA=%%2 zIjFc?-BElik1EB-{z}`2@%1JhBlu1?c-jB;YZ5pOyxCv*VtDGJlcSKl*fJ@FV7F64RO}XlD8QV@$x=}yb$6jk8&(|=OP?0 zuMY&rH0x!_I|~u<@(QjpFw>UQw$#2&3~ZKdr^;+tQIJ)Kp_IKIDtFTUKb_MqLs$My)~%`CJhKGZNK8>ISaZK59_S--wa zl6UL_<{F3crr~YL%YxyoJk027H!p+2-dMzGx(a}gQbY6#+&jo h@TQI9+(=z_g;K9sLXc(!xrB@78-{+7xB@J`{{uamLmmJC literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/csi/v1/ss.o b/build_mx8qm_b0/ss/csi/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..9bea3bddc7bf301d3d7c2f758826fb6e9fe45fd8 GIT binary patch literal 45928 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 XJT^k5%F9Nam9Go((Y*unWd{Eb|F+Hj literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/db/v1/ss.o b/build_mx8qm_b0/ss/db/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..68e31c2de4215aeaea09b0eea2a36a8b5cf8c629 GIT binary patch literal 62068 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/dblogic/v1/ss.o b/build_mx8qm_b0/ss/dblogic/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..43bf15c13c1746e3ef7a6fff3a75535ad2e725e5 GIT binary patch literal 58984 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/dc/v1/ss.o b/build_mx8qm_b0/ss/dc/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..41b1314b02240176826440b8dd38e02791fde3d7 GIT binary patch literal 58856 zcmdqKd0!*g-)E34s8CkOV3n>+j#QzVEU_3e+X&mD!uvlp)X#mAo;KaO^t>neO_ zw0*8~yXU;MRSD<(_{|SLCS2sXH1oVARfkoTS3QlCITvPM;5$ESN7AkLfBg9hNIbxF zA0w4-wDVl%!?fX& zm3jxH=bJmoCl@wbbjq!E)wU|fxtCPExo6f^*8PevrkV?uIxeZ-Gq!BoZRP=ozjnnJ zqn%gZW==Zu0V8MzulSGfTlAZ;mhMbnW)|4yoLDv@vPvbB7)2*!`H} zk}cNfUdugU^=r^?psS*Ig>&~~F86Mi=XZx06P7Bw<(dyqolfH!&HuUh+Fz=Ge@cIuwdU}tswZ5vlO6T|XM~=Xo zAGrdr!^--Ct;$ciH6Qja+v+&iS>;t)!ZMD#zc9R)-j?}*HO?GoPE3bYraCUY&73&m zwafNQLmeEKFz<;~v#SCsjneFA`Ah5f1j}+e&E4*_rMa|2=;+)U+JZLt(SVly*0;`n zv*f0=+0Tu+M_Yh#hzUEsb%sA#Yfky3j8PxcXeSCuhEMl3i8v>V)No>_0bS=+bqX!qwQ zxPQA~KHF~7qKdcoocW-8_harkd)$4G-+S#BiOKhUVS1gfxpu(P<}S{ zF4|&zKF`R0-Z^Q+^X8Zp|1_F%rDaD~O;#ZzfHXflsEToBA#3Ff{^KL(q~r(8G30Ko z(_B0F0b1f?w8V!WB?dnDNc(YYo8&EXUDmKC&^M>^Lg?(=ZDx+Fq~0w@U$?+jHRiRe zzeseOrHk}jF$~KArTjoAumEUlG+n?^hGDvah2SS@G?Rd%!A}N`1m6b?fX)XN0g;Ds z01#=6GIU+!VFV4^3;@R(E`{R^x5Dv8fN4^Tw~=ckK!1-h#z-_KqrCBkX^t~2bFASo zgDAHYx)wvv66iPq`b{-F<}@SG{I7-nmx!NAz_Bk>`%tZzUEVYM*#^pgq&@F~$hL-V8G@d?_7(>%{(qm}W zz!9OH9>}uJ@96Zl2Vn#4BQ(m3UM${kFpQow zj4p|z1Ihxh!B*BhRmGWGwO)w_8t^P$PIEFkLUIT6UklDw#nc~`F9Q}Eoef8Wd$~qt z0xbL9@nDXGs8y6xix}rTMmy~jvjGWqQxGxvBk)m@(~B5;ol2eXP6Akq&?eU8+!M*N z+#Y0TJ<4u8Eq51K&TW+Ehr{V^&jtSg*xZ_#dmC8^?%A-P%V~G^3{YSl^|;lIn9;c} zK)~&M4W9{bpc$=u(7&CNQmCHwHTtx(Uxhv2!*A?$X7+=KNOU@{b&Q2Ml5WN*;JiNh zUtlKv0us&}GRQZQssD6@Mm&gs!$?VRUgbFyv^NX&b6(@V2W-RpHw+Ta8*R3*)38n; zb(4e1EC+1iye02(NToX6&Mn|M%!E1&ST@6H$D%M-s&_lWZfBSrFY4p^E=7gsBem=M zWEPS(0V=w_&s5>l(JHR*N2+istm^tv$yoW|yM4-%>798PAKj%1vte-W$!L4`GoJvC__l4nBCx1ne9 z3;0+8hO!L0O(OITx@RW*ndSWrzU`jvVPeDkDYHFL5l-(_sIdDWMI?AH^MaV8h-B|g zw830Oqy@PB1U?zXH2;w0!HSSC^f-!FGxF;%ZoM&@GB=a}vz5{_i1 z%8={Q88*BYs_G88SWBmO3|igY=;=dDf|r`On+j-)(_k>>m&`uMTQYV#PXXaee>4jT z+=B_XfbuqAY;Os(&4@{0ZTD7WS`-_D_sd^g!&ElZ*`+) zgfe%=CXS8dSH=v&=tjET|sKw+?aB{0EK! z)u-cT`R}I@`mMxX#Le+d^E3AyON)WTn3<0BVztTkL-sBdmL~l{tuX%lx0w z8;;SEwf<)@hPjWmJgk0$e;n(#%W?-Hxh9Wp@4m{)pr#gKdAp3@ucO#X%*-GUY@Q#(Y0_JkxVkMr7*uPtFU3#ms`&o#IvAZJ0?wpovGThES zd}e@(=N&|DLrmT2B{wgLyg;XCDqw1O@AMu4a0NHI21I>^xuh!j2wjT zCcDR&2^G-aue$hHGmV7dpGd2WGgYfQ{r|=c=N@mWR!=}#tgze3j7NSs9%~Z!JTu`m zX7U>Q#(XoKgyH`iN3(KGx%{hO4fg^w{X|418_9%=ASSBjKj+?Rxo<|3`o9C$eWI1~ zAS4X`bc4~| z#4oJWr$L?O=Q`SbmM-rKzmGlRY@P0E{|=7#=V`yJw<_lZqXl8NlT&bj-6rD5XDaqF_)MlBU5S7y-7*TNF{2VkHb*Gj{K1zJRd-dgr^*7>rlS)J|yvE!2=SWbEIDjj{OWdPr`x;FKHQ1QW1zZ9O)Yw z{VAiLVixZ@(zk(=wg_hN%uZ)cXPQ-| zk+L&+wdV%Z%sUy*k-R4De8d~x+VLO`RfN;~BnJ27wTejaE@a+^DI(d+tzh!uib(Y? zMJ~xlC?eClnYpb~M2`1y^sD5MB1U>Iz{H)rUJ(KBF&q~f6%q6v69Cbqh$8P9B$^d5 z$$Ke@7DbeKZz9pEh-uz?Nwg_qmiH+V?TVP=-3h}ccPL`MHw!MB+^L94?=R8L$ww+; zvG+dop5zURSmv!92ck<6wch#6pj#0QULTquxknLeym_=vuObfj_MwX<_bFn%cN|(E z`6xxScvqoAC-*C&!<$Uq!iwnfe#DpoMf7wOrF zmb_UJTfMhY(JhKN$=ilWCi!SZoaX(ShCfCTXL_F^ajYWF@xDXiI7RI6UPY~sSHwlw z*|Ql=aL_NTVl>u>Ugh`JTTo!c**bg^y48sLRM@iyzCI$|)SjIT_ej~4MrRx|iQ|pg zi{O-nu4beTHltJ{_&yxP3_h2Oz7*_$pV+}Wkew^|5c+^Sc+41dl;GX;_}~N>ATf9% z>X#H;OIHbwMLUcLo{Y>=g5xkMdV^)iEj73b=Lu=SYr#nmJ_Sxj@B%baW^gR>$qJr{ z{C&YUk#lzNPslSTSdTn&gJ(h=fAA56^MWgpc4Y7#=${`v5vdA-Q=#FQ;8*aL@xd(c zi-P|_TOSad0Zk?ZC&5e;gKMGBq~LX^MRBkXGE;)PF?3E1-iv0K7F>uLO%KjMZ=Vr7 z0oIrqyaDTjS;6O#YId*$-gaQH8l%oZ!G7pJCpa4e-Q3`d(EQ-wq4=B^ybPMm4_=G0 zr98;db3yO~$X5g#p;cuth@2M&@5f@HD!3DzMZsQ_xHz~5%~lU>G&QIk3R;;5=|v1hM}%8iU&*-xT~0(l!S#L~bp?f5IBA!JyMH+Jetw*liCs z!sZ>p_0Xp?cpfadCHNysKRS3n>~KtQ3+i=j@MqBQxL_6h{`g=nYIi~~4f$*hE`&8s z4Ze%m(}F7?xh-fThtq?J=zM1cQ{fe71~Xx|Uj&ari<}i4Kzp4XY(d&{g1L~~9?XK1 zof}+$x||oh1Gd@`T!q#-KlnN1F9^1vMi*kIXK_ntCBkyv4SMW75?Wg+sH(R|d+skF z>OD$DS~aLZYQN_H3q__Lr^By6-P9Ac%!?>8^;FG28zxTug$mmbGvi6HRqA;fiG^E4GsNyyyp$$*01M`4Q0^K$ZG zT4QXuzuCy#k;67J9kz4aD{$k?^G8r?(_uNsWuWxT3p8z-&T$>kGV?;A4d>Xt79;bb z)K;C`9`_vczSwuDqAh#e9aQF$%%eyZ-x3E)yfWdnv4L{G^& z(lG}K$Ln#(_Yd=8P{De5v=Pik(1g1n?EBJje2my0^K**jVxfig9R$qaYP6gc+=ePR zf;;f(3=YDb?cioOrYm?f#NEL+;C%_fCE$1rPd)VTIZVeji1K^}NAbB#RWr}~a4(<7 z%%X34&VaM}k|m~sgja~8m?m9_B=jaFuh!7Scxv9 z=qs4cS7@eu4`DOGu!@2R_(q%Q521lg)9o-k+t60NF{Yyy8Q9DvKh-zE^vs8Si!Owe zuUPA6p>2w`pwIY9q719(8FU0+shNE$J3*@9Ec(n1Mp=~MDsm#mH`&adjI5zT!U4@) z8w}r6GnFNHCZOqj)67WQr4*fx2JuZdBaN3*^by8V-;4;ukzyogBd1y<9`PU=#c6nM zrbT9&jw@ILM&u{>4mLdxAvB?>bHMP;H&Zr3RMkLPq&&tVuLqENff;c|M^QC~I$wq9 z<*}mEo$H*?*=zVJ&2%~fyw^57-=a787MhMGlwh+MG{Gv<^LK>&HTdwYHdD5tK-BMW zHr*Q2@d8CD0MT`(XDoWHzX%_`^=4`rGBytA8SFNEjam=O@YI3lYcd@_Fd@ZJsSeX~ z9zsQvFirW6)CsMG1Vb5dL)3`ogyv3IwM**cG|eLR2w!)^h=%F^7qjRwz0A*v)iKre zoPj3x^_q^EVA>b6Ow%`LdR{?D6|pH=grRfX9LW(T^L&lb$G63F+{DyOlOOPHH9gzm zGPbM03X|!}B|8ex~X88#SlC`RjcYBO z3u(vO%}hEp{Ia3wO*+&a5r)xFbO48+J0pyQLy9=!`|gS`j6;h4#r}V{nSKmvhv8yP zQ63F>Pn2iRCVT91}jzIr*J1<2kZs)&M_!;#%3dOjc zN5bZA=M?y*+j*_}T&g5LP~pqrs-Bs&&r_!3DiHQ^v}u9U_p)i9jL@jVFz@+Z(TzK5 z7k&3tO>i`M-t;^SA^&@vBVN!$q*3%O7E`_#O_{rG%U{b{y=1Djfn(x&q`;8-CcyU> z)4@_~<}#_p^u29*CL*=J3d;H3H8V&UdCHLQX+!3id8)Mc&6I;EY35bYi9axNR)Sn& z=CPOgJ~Y#IV5Y6ZnJ}}aq#Ei+V+(|MiYnTzK5@qMZ)DOK?a?aj+dw%BRmJQ zd3T#xCxfuV_;5SVz-Km>2)hu-xf4lpwjp=J+KI6;``nb9zz*EYxThIMNyEAZy(Rm+ zl*bwOVKk1jYfd5>CWo4+55rmlX7>5%UqUMT9VE_zyXdTj#LuI+&Uq7DBm2ViLP#m` z%6*8d+{@8p@bCq#o_$GrZA3i04{>Ikqefio4773f&h!%^;@9m%d^$3Ytw4JKX?CUG z9!c}^KGN7s!w49ZD@kiCye0dWDv>n{gI@Mk>HmymFcS1|3#bf~qS_2MV?mXDO?nZN z(rQb8Dve>iKqFt5zB(d)^nVlQ%GR*XVq@Hpeo91~hpYS4h!Lm~Q(5mb(M=imG7*)0 zaqmQi^*ti8Z%%m!ae@ErEs(Pf`5D$u`dr2wnUz#;e; zu2a-NIlraHsE=I?-NX;B(hX}qoIU%_lqTkJ#!u#s5A|d(+>EWZ}S8XLv1W12IG$2ITDf)4h;VB~JNo z;#{8?)+|g4*$<>291(BZhj|P*-xv?t?w`=Wk0LKKIZwn&hrk+{5hqEd7c){Q;lQm z*a%w9lc8Vsi%QD69=m|-ms74_iaYmCfu2SOe>LSH3cMUIpmUos4g!Bs0#+u&ucv%Q z;Sul*Z2(T#IjT z9{b6dg&>^Xr2!DT^J_sQcppcZ*?%8<7>H!=J0w0WYy*+%y`4_zY`ARpzjFTwVw!gX)+X8CjC>KqEbpfr1o5A-UxTRhe#fk_$G}j!*n0&F{jMMh#4@kJM)lx!n%N6Lt@l4dm$A%14X74>9y4^9xobdm_}}M9?KHfX{5(Ea(CD`M+b6y3B$tpa%RaS+?68c@n72{Lh=X3sjPse=Dfd{1q%O+045a)S3PbY=sf#*vCMfr^m>!6Q_V z!-?IYf=d_-tKcCF9CSP$?xN14{o(g8)?`dBV0HKzTzu$<}xCgYcoH3h)5LjjU(S=XLcfZ zo)Ywv%vH`hXiV4ms2SVa=d<~4m)xdMh-i09MX+K zbE?b~j)bO-mu$JX%~=#-ILxAx&>?abNB1;V(J>fSbE=~Z=Y*DUvyrpJOyP>rbXhLL za|>#bv($7fhY~h5$-V8#$|@`lc4`hHY{V ziR>us)S_u9BWJalIv$ytwvk#inKQx~Gj$pnmMg9385-$OGqs!y7hYBghmD-I(F&y- zo@<%uVW#6fNZ8Z~7F%z6euq#IH?TQPL+3>*b#o-OY5EJ$&vRPLtk<9jmi^~p5XfmY z9b1vuW)7(7k!E5hiqJLfimPe2)Kr(#W2VZvRH`bc*G!dmNW)`c8#(ux)}NR&^D8`( z6Tx|=ex&s{*cIR^M}fptN-P31XNQ@`h~ym@S=taNeh~A+`zD40id+Cs&AGrF#TX^B zEh3T(kV2$M=?f;+=M{HWiO=!XZxIs%u$R;=A(nBV) znapkXA}}HqEc};^*vrjKPQ1y5$R~sV3T*%s4r1EK*=3F-ukb}=n)|Hf--s-dxz#)i zT%|!GMgmH_0v&T-v_>+ba0gdDCGj{|!Fwk=))d zpt}D?b>@VlPrk3}zscc5p()A!TRjg(OTSG@??iq5x2v2im;l5bK1w;YUUw?J`0@c2 zx299^yBsI#{OJU!vpJ|;Z6=7@ZJf#Si_Z}MLPpTSj??bSJ|7k@eXoEbX z43cVCbu9f^2cM^)Io|d>&(d?zVf^n(=^P&X@A(+v)Kz;w{S^=i-t*8o{U7AM2_hK= z`47yF!wMJ;hZy*@mQcIDI?h9Uisk>rlW_o^Qgrln8~(p56Brp?BtBIHPTsdsm(Lvk zpnQV=D^CUFb%|e#F3+G7`u~;92%c9mLu)4e;2Xy%gpuky&t?QNnC}m|5brza1^yqk zXBwVzDviUORS?TB^4q4TVFEbc(_U^p>cac5Gw~;wS&VY}N6-Qu9hcz08WXoa(ac$k zxMcqbOyK?`eVCK#f6M}f(|Z~r-G3uidj1ib%JhHi0+ph3@%cO9|9-EgviSE{KL z&hal|GDWRV`uNB=fcd0wONL8hY{MB!tY ze*9;c8QcsNo`Zb+XPNm2z{LtbWl!I3s+S20zaz0jh^frrLOqTbUP$X+YO1Hgh2OL4 zR|t_r$Gb*|OIU*&g}5yd#4SR2NZg@`WDZ4#PL!bxuWh`_F8+|2R}EfaBg=inOkWSh zlj$zoB9cxu^f`>em)sC})XWVdCYhb@+K7m06h6fCkC{0aFp}N%;h4zfO!=fa@^UuO#Peq06U4ZkH`8i3VmAD*YYU`}g=gf=FgfBUZ$*n_PEv!m2awi^ zxh3!5F=VCPgG3{>T$&q$`$*w$NB;T3Z-LDU{-EV&U_>r>ScjiLJ_V1c;UH}W$}4zO zhkuU&vEVTsKAZfNXP_* ze<3V3R>G-}87JY*Nq7b)VN}H^lJJ)p0S=I`3wD_x;j7_t6D9lz(oT}_1}q3CiB0~B zx)%%oc=WXr34aLvOGM^%_)4kpr@)EIB)kfCE?c1WFGG0pblo=Fpxd3r;#>2K5)@~c z{aM$5Wy8(TdYnjKiAZD__Tvbb@F9S?c_jHF#sl6TB4TNV{Tao67y+>h^T`)6p8bw3 zk@B!M$wIi~4H(6|HIIA|I}#-?i-@_g6QCHM8JPF@$QLo59)}}hNrv4_u^(U>^MQQw zMT|$ymqf%e4f}M8sdM!g^2rx5o zEF@pVc!KRMm70S4Bce+AzygQ)0Y+%Kve(cJ%tF(r$;sb9SM#6N2y-PwreK*1qKFGf zV`?^zzRh>B6vu_8HO!sQKxP_c-nIOc!SJT8=_g>&0<(xm4NJgUfO{I3^kB{+^Gq;K zB9o6P!CXYSdAJgww)EN*k>vt^>d4b}uIz;_xF za8Kv+M~KhlA@C+J+R0p>0_KgD%`@b$z`*)d6u8mK;}K~udQb@WbZ%H6IgJOD?}PC= z?pdw<{f2q7m7-LbeFc5%*Oq!dG77GmhkN$B0Wfc|^0>&H2gY372daACYN@TvLDQgj z25R&xXgH39ZGi8=*iEJ~z+u_|r#NxKfLph~VcGz0OjqB7IX#(eeV8?sN3*qHF2g-f z8DO0@z(z3oaL-qE2x&Xae>Z?+>vjF-zkq&jHd=Yqadr}9%_d7d-?$y&U*gu5Y1Wo0 z??8nfpNt&&V8aYs1z#^@Hyc05ojDR=aBgp7=OX7+a=jbr(-(Z7ze?eU4(U$nPO#gGdLB@QrxolC7eDrjwQpY6g@#4NM?+{bqy&on8OkCgo>#%4>AsZ46IJDAOg~uiwup8pubciwP;*s!6xKL^K&IR#6>FS_QQ8r z@DjR&b(~>sCODnjojcI~-Ao9Md zkDHlvi6RWzqj4`l>Ea(RnOWLD)@lEE*;I$n*7lJ0k5^0|{bMy!)#FxumHzS4bn%aM z%0EKJ+zXKB*@*d@ieWD|=I#V zBzO;lr^P`;J?-$Q6g_PVJk1ZscrGfdx%9B3BOZo^`w+`0vmd8LxX`KKNS>MENd4N8 zwxF&&LD25eZ_cFoE(hZh+|&6cwiz~U9_2p_#sg#ya!d`IBiT(q2IB)V*P|`KoJD35 zO7-BL!6M&)ipEqPn3=1!B4tXET@giAn`+1!g9M{+YmZ)Ssv&DJ7?oryk6xoan(r}m zlBpC~V~*xN^jt8`Qj%0;jX9sp--2;FZtZX(Qw=jSCZPO}l~&V>AUnZ?{^-g|E6(_8 zH8DY(=WV2Zh1sgfe1h(0`S6om+*+%NriYXH0x%9Hb2~iToM`5A^l1m9naqo^0Rppx z%rn6_4fnKgBYE@rjPF*^zap1~QmusXfJ`gl2|$kJ`4Q7#1C-=la8F{zHnpJM+!NitAt*-sI26B8hkAYp#lX3=g~ucDgF>fXnmtCpr=URSZ!#t&9SjM~q0~RWQ z5&=EjUdS*iAp>dWKmm_rV(Uy2v(2O=ou>)0q!DpNB%5Y+2Kgfjk#i{wladi9?~Rq8 zh4@q!h;8b$n0)5tvf%U#(~%NeRtC~0M5@EInM%SQ(gt7Y9IEgvOm)62V?46T&N9d6 zYQ=JFRps1hQq+qI`z5KWCNs~AV<4}QQGFyyzEn-f0EQ8vw3#Ht}B$;lkNv2`VtG8ooN%z3#(GHGVIYktm!3zQY7#fn3q&DC*} zRfjk@LSUs4n}z5(Kei~WJCe**+01VN0~qg047y5BO2oY}amBHqGkhraLYo+-+Sy?H z#k0<@%vyfs&cGgEd=CE?tUdh4GIn>4GP#2R!U2G0@ zKaoRyY!3A?Iq;3>Xf5jZnFIBjiW^lXU@0k8W(dn3Mi9E95e)U{2m<%v|J_K4RF^Jd zWo!{Ecd>{ixJ_dvVJ&Xvv~m|i>v1E35Gi}*uA#D5#+JQr^CG3XblG*WW!I^)YY=T3 zb%aRSb*k)U9YKhcT^Cb!U2NI=ZWyFgmoB?Lw(NRUb`_#cqn;2cyIz%jxQ-x1%C3(o zyFRw;eK#qWc$Tr9KklL0(=v`z*e`q{TaEnKs{n*r9vTg78H$-k!;nNWg6WF6dWgC2 zP`whXB`^c+9}IDA1dk%z7>!`)S2}|5>u3Z+x9SMOZP5sZ?$8m0N1_o3{KTczS{bX> z%3V~e4>z2Ra1w6qg$$jkBM3X95e!|aBM6a-tlY&AbwO76{E15|QWvX8ol=CY3zsBB z6sgNhMScavVsfmxj9QhTfxzPFwk)khvk3!= zJ#80}`NC}pJA_T-4K{)GvW)35wQ2w-?#coM9SP6j-uL*Xg;vH2?L81_p}JV1y+;f! zR39s}ch_e9XT@IBe4%R1V#c1bT9xIt%DGYUQGz;-0CUJg3<4y(Gpk#+>9Ic zWkEm&2`=0tj4k-iV>s0{`e~v# z4+XSH0nC+I#IQiAE9&4%!8gF8l0+tw#^QMm*+iOKnut~>TVn|#_x94l2x>%vTJzope z#|jPie42e`rFAfy5h6l+Yf3fXfP{$9a82>J6S35l zNU7m#7qHZ&mvps+KHOS&hIZpdr3ha}BM^wYN$H*kd34mCyWm02gQiscM z5J5hfF*2;Ax^#UQ98!_>;#HAn+WB3zW?oqIy z`EAMwLsmK*j{3S92iki3yGz62(w64ZjgyVij^6Ip(x%4lrrzGt#=(K!?#6-6-k#Ed z{=uFNp}r06p`%*|!=+8(K1FnIo>e-~+T9mw8tm+93AJ?gm#R>4Ct{B3?rz;sI?&x$ zx~aE+Lur&%+}FEdOL13c&){Y?qY5jkuuJLu0+Lea4g#Slt$o3B5JL#ouo&DXL8v9#Iqkh

25pv?6s&Kr5)% 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 z zbfy-Y8yacFbmp@WEWgX^NEfU_OP6B*X}GD5bj$oG_kWPz{dJ_9Sx363>qr-r)shF( z-Kuo%> zkXb0*$D|9QtUb7PR1iwc?}thkUd}x}_B?ym&gNsF{(|}VCX(N>@w$hvV?r?4wq!$! zz7Tx2@QV|5t___)f;hWB8=mg&15!L|TeRus=r5RV(@1{L>6-W^#Ro%>UlXMZ=eN3L zifco&{POe{G1)=< zep!+HcC<=yZ3>p(VErlDZI8L+*Msk0dV`M3y1owv%g_FXN7DUki~7n3iAZDVPA6Ru z)%jH&Uo;=VVAHkX6nzNK@08Xl?p>}{z7zFl>1=y9r4+^ERL4F78b2#1HBT~FMb)@?rHLhDu literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/vpu/v3/ss.o b/build_mx8qm_b0/ss/vpu/v3/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..79800bdfa7993f56c02ed89ed0a4afb7afaccfc1 GIT binary patch literal 55920 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/common/test.o b/build_mx8qm_b0/test/common/test.o new file mode 100644 index 0000000000000000000000000000000000000000..3e1f8a3bc99966a4a14a68a69ed1df4d7b1c681a GIT binary patch literal 47416 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ddr/test_ddr.o b/build_mx8qm_b0/test/ddr/test_ddr.o new file mode 100644 index 0000000000000000000000000000000000000000..8e1a2be6e69955a8878c92ac7bb725490bbdec3e GIT binary patch literal 38696 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ddr/test_ddr_selfrefresh.o b/build_mx8qm_b0/test/ddr/test_ddr_selfrefresh.o new file mode 100644 index 0000000000000000000000000000000000000000..2ae9bbd674991e27f0fe4300137e51c2fceb36f4 GIT binary patch literal 61220 zcmdqKd3+qj(LdZXv$NWjrCpu&YGv6g%l6vHvL)d|24AucTef5gNd`k4R+0y!Y$Ai*IaI3Wq|_uJjGJ1ZNW=l#9EKf=2o z&30FJRdscBb#-;m?C9jW#(Kjrg!3`PJduQi=>Dy&u@}o^o~RPbME$_v;J|QSWTWQSMi-iJTLX`b}e~q_3v_91Q#{ThBa9!}x2mkp<%vn%>c>fJ+J+D0Y zyZtpe>rwX5EBi(HtNTUdh9eFwx^+$Xh``3eeq+g3{gJY}KK$!@)`vMYzK6t|!@uh% z_D4R{UfwTri(h?PJmkn+s51plfliO?i4XMdKB%OJ9Mam;*&XTa92lI4_e4g9Cv|3E zcwl^>b8z5<&hdef;RTV=&hhb{_;3aK7w_qdtc;ZJnzL&`WNf@MJ|64r?vAUX@~U0H z_&;P`N#&LO{;$=Z`q}H>*ni(CCCy523+t(;@2s_7iL5v8c<^`os;Rpf8%p|f`Va58 zXl>e$rc3=S?=M_GtDZFBjh+34{mVOUTQjTZinYd9(tb2mVi;F0@0XhYC^w<$dz7ZT zl%@j`kK>>*awCqV~{-(SF)#zx?Ka~lZvYDu545s zOZv+wbX?T35Kvb?>~4bk;Z z|F3`l3zZS*fK<61ld)$=ZBZ*l8^yk$*iyrM{)YSp(rb#!DgC)?jM5MHmh_ut>}g3y z*4~^AfrH{uw@Moi{;q0`)X+oXp%&ACPQ_Lat`;*JY1UQ__nNgqL0xmqKSno^(UF}! z@ksZ`&f$ZoDWz73kJnk`0G*Z0`k!?cN$4zz{mDAh6rZTG$vFRKI-C8!(pjV|(lxj} z(k&-W&nIheGA{kd2hB!F^WRR{CW>?9>~YepzeTe5V@8P!X))poIQ)IjeL>;Q)0ip+ z=FI(joA;Ui`!|YN;g0XZLUQ*RGe6vW-^TkI!u|KHpS900!yW1UYxhOW^bT>6veKl+ z@7&nDPqcpbFJ>^@ab*C|$UJ*56J>dKjb(nTK^$A~np) zjzf@|<{=#yZ+LOPc(`$&*!n2a3+j!F4%utIfATEz@At(yBP>|bd78K4n_iRTdWM`e zA>h2Y|C9>OpGT3t)SppVv(H57_3z!dmRv+zZbwc8THYrxBGkO{5ao9|WlHB`a$bvB z8If%1$sNxmW@Xo_JZZPP=6puPnC0dexs$NM6(uRK)$Du z8ee@3nmZgGBxD`laj5jfhjx@AHLcQ)l78xz`I3&v-i_!v>2f<7Hj?Va{g*E$-J?if z+#gy>zxOE87x&+|*n}2HM}52leW<*Y4i(UTfZ zl5-;SFF|w7d+EhO`Y5Xyd70a_vFNNP{_3}_Tj$q1b@QaXD=0%^Royw#Fe3R_#i~Tj zkg7YkHw@@3dbFciyzUpOH0J z@6X7}{;rbX>ixm;lJAOytnCs*L~M@mX-8}<+*Nqz5gVKTc1ljTqowhU{aY?F4))$*+0e7GR6HCH>#|%a&&I#gcwe zy7e{1qqu*))CI8_C+w1Of}&3HNv-|3a${+-rlNk0&ul1|groF-?As;%)?Y-|wQqCoWb+H35?u3fEycA0R}-!+xQ@f+ z{xB|ae+B`(g6m9N-%=I6tLue8JcEzNIK4=SjCZ0!JcE*b3PFCGGxCJ6W=*RAWEtM& z`AAIr@p(d+#{<=x7iuAc)vWf|SA~%H?2G20x-fwJ!q5n6>|-UhZw*3RGiIW^qTo~( znQ3#u(0m5rleM_uMihC@CjKS-V$SlUZ3+WpVhZxh3hrf*FKso{;Pu!8!{bCap2A$> z1MRE=_A$-#I=+1|FN&Yd1fvB3%4iNpkdMo}|01Zzd#o|-2~?ze?5|meV7E8rThoAX zOU8#NoN^d2?62ptTx75lhas0qd`kp;_6`1H0S9x@N&BX>@1s}*D~kc#YWq;(5$4ko zK(|>WGs94beS6^#fR*J*^PGe-%kagqd$5_$o{z@TvVxZ)pXS-cl1tK%{Z~NdJ3yWG z?+iAQy%r*-{X0+QZ^O`}{d>C1PxmALk;F0QpxifAsx#-D=|Y5ji+rn~^9$XAie zyvU7h7rsgw zF`ao4>?LBOpTH^k53r?8>Fj|p@|%hQ9U&o)Au@KLbOF$0zh;WOb$~B0e4q7=kf~JU zu{q3(U

wXv6;;8hU-o&E{b_<~ZBZ8NBgv!F2Y%lIO`cxlFIo^t_A&3St&2z(R1 zy8s1Whw1uuWHT>Sl@+|sM$H3~CKUW8t>v+FYGQiu zB}_8k6GbDCED|ijZ1g=Ky7eNl+kF(zcP?H-Q1cRSS2DQOUiS{!|(-PdVJ@_Ru_;to{ka|mS6~29M1~^r>2A{?>^1UUkq+3kmaFHS; zzu3tTCtFAwYno>+s%%yjoXL)Pd>y8boe$U1p0=4%4iWx64YbdkvI%DI32)+1^_h8u zeBmQ$Y<=boLK)#)j=+HFBmb;$IVaq4rf(B)^1>yv0Szgh<>7^M0S%i|yHK|{yqk5S zs;(+LokJHl)5lS_B77`cm@wspUK4I4v_oOmhEFO6v{Tis55LAi+GXaQ0G!5fA$9aQ zh1nAR3VfLFMAOgiw}&6#%-mz9%?IX|LYlqr1~ZqIzTPPO6}*Y>Ml*+&+-MYTCZAi( zjB|nebF=V29HDQTSwVF8muBIsP?zs^GyO8uzGK34X{}Q47oopm~JEvNojFO98f=v0_nGDN^-K93N|5~_E!GSM!E6{X@)?fN!lS8F~U3 zBK$O+`)OtlN6QmF7t4X~bTf;HzVJS*cD^r~)98?AhfgR0bcPwEde(=}r_5)X3+@Hf z621&#`pz=L?PzgJ_%9r|v(2fTC;j0F%6#W2Xf*r?mUQ2_3fdK(!S>EGvmQlzr-aX^ zhxn42^&+6N!kZ97_|8}DT^l}=o&B<+yD?l%{av7-Z-g)7Jh@OocZHYb0{V)A9tc0r z7A{iIANChMlik0{EF>Vp zUMlKpGgJU*m&l;+WLB~%5*gGq?O($)_W4dSEl$;$bOydl%qbkHnOD&KuQ8{vMb$PZ zq$COnpBJL1c~}zRY?a1|f&t{yJY0e!oHmXjUnq-D!FLAj=w@UjBU2QAo};tSnnrI_ zoJDuA$SNuZ;C}`U`=7J2k45{QM?m7QK*#()vT|-iiTx5wLdE#{iNf*c%?I#vD`y9* z-(&S1WbrF2=WLW@--j_vU!Frw*(>4W(^mxNu>5Q2b^2;m{u!8U`dXEr0^;;KmEQq7 zNnfw>=U^tKZrpvNWdDd$ zGL}ty31nq{#`+^NxvfWu%&ocPD{|ZF+C}DPCE&@eX>1jl$4bDL+upoRWX2?rLE=tp z9(p8+x4DVC+{E2(;+`aNpVi|K_q&M)+{DMZiMJ<-hpp=!;t@CTsGInBH*q{kJZ`<= z5Kp*?cesgnx`}rsi9cse$B4>4pXet3yqowWH}T0y;xAZ7JH)5DiBEGApYA69Vv_hQ z>r#jKY&Y>aZsK#@#OEc6zihqa5MSUXzR*ql6*uukN#aYbEX)Df=gZv0m%E9ta1&pd zB)-~ea)__Vy)tQGdnBMO>{*G+uCoA`T4;_q80 zIm8dS#eUc=_9JewA5Dt=xb;1U_z8E*Pr6%v%H8tQ$(En9_B+HsaJT$JcgxSaTYe$g z@?L8R79^>#7v01!xru-5CjLp1_@`FfA%4Y8{HmMyXKv!xlElBTZg+@ZcN4$iCjOPD*OD0Y?p2SQ3Bew-;sc}?LSFC+V;Cv zuS2}g-SS`DEx+e(`LD^A-?wgXi2v>;{=iMV-%b3FB=LvVFCF54xrzVnCjO6`_#;hR zl$B{2)-1#*C0sH*hSGP5Tr+G1c}nD>;Z=~YM6McX3d#^gzRWDcY5<3DHxaY=V#pvx-2U{k8~H?_mYbz|4*#DB3|XxAQl{L1kWVf519#zJ*?8-jJ1s2)Epu|9$MaGrw-rdy2ID891`Z zyxpcd1VVtAcVtZiW+W~DF$6A|_t^Ay!k1r*Xd?3go9-*imtR242Nk9-|0cwRnUC4@ zPQsr*Hv;Gxo9-sdpFf+J&nirR{`=JWk8FAqk)B^N7tqT#-9uJ-{tJjpGJkG!zDLsY ze@5unHYad-dj7T8&Sd`1=8RmEo_`0SKYKXETGI3X#BunW%{kMNo<9To&CGw=oCKrk zg;7GnuxZw(q!-?XfGyKBvZCnW1?h!@^8xw{n|3Rv6yD2Pzmc^JwOLaN&!!zrF|rvG zi3Np^u{HzS3~FaV;aluwz{u_gD9Q_8U~SOI9s*cfUg)7rxrY6D)-Eo5jkS43)|UYK z78h1gms5@GZ?U$j@NL#kGqS$}&{I`-8ucDBvM)iUSW);_))p99kFj<|p-I}Xu3c03 z5o-&LtRJ&>P2nqSce|k;PLEY%BVoI`AHm!QkO-2L}Dw;QxUG zA1X2!AJA;w^3gaY{DR`gp_K3&3g+NRctpV*t~pPD@w*Y#z!nGL10h3R4xl8+5+2q` zDL8Jj@XsQHeu)DoVboI#*8rAWKd=-R4y8u$uu^j2kjcXTC@Kz;r1}t4Wb;;{U>TzQ z2(V`=FD7eE8ZSi;iojKYqx@-@62S)ei@+9T9Ko)60FIV`Czy@d6gWl#z91}H1U@5y zjNtLGsK8bUWCcf|)WByYkQdxdZpTU>6#NHNABag{daxgUBG4g$NbswO?gO0?m>v8M z_9=mF5||f!j6jzJ76e}+&@F-T;BN@@NMLdBuLOD}P!+VWhY0jZU`22t3^>p)fi=Oy z;qU?j5~vM63|kHyCxP|B0nGKlb_p~F>!Sb$CD0Ol7OplhB!Twe8mK5REP*Y-M_}H8 z5eaM!*26~yMkUY@tf2(QOQ1X01vLla66gW^<0s{Q!fTW{ed5JT3ZX@C-#agJ(f>6yk)VPaciEp&B$G#`>25^aQ|dqu&Ppw&=e=+ZBBQ+`6MLK^r~M z-OyfdbP*kR^aIR|{^(N3GZ4KAn%o^NM6XYX{sMaVT=abO>%{0cA>rqvU1;T`=nLrG z$`70rM&Z!E2HSy0><<~>q zIbV`_y9~5u6ZDpIk*aKjR&%b9`Qo!9u*N@{S@gtaHU=;6K84hW&gVU-@`qu7^B&d2 z=zQK&aypsMpvAnss{B=`HScAWr%TU!P342=QT_!g|2-&cs_sQD26gIgRsH~mcIsI& zAMj1R(EoV|8+;yWnR-#^Oh_;0jm5jf)Qdx(17KLTXa4UnxKl65q|}CGdghm-^{JOC z*f2cvPl1$EFVnE_%p2_%Q!meYL6O_@UnTD=ramTN)1JSN!d#j68exyeJAa86@K+VN z7bje%7t>?vRo2@;uqmB+CM;*_4NClTApW!_IS7H-(|Y_rr}$-HIjt{n0s|*DKds+s zJ~IEh2r6uy8^dUE>FR^zX1WLzv_hde8cu3vIt~ z4AJ`V1=j@wG@_ry$eGc%;CQU)K74zk*TG`!=s1kj8$B9>pB8-&=Io2ELWy7azX`q} zY(9cu;$MNUkk^ns^M4KI74jSTv{V00Fx(J=KPufnL;$g#1ik`+LOB|Egft30p9_E?pUQzl!R2M2X0+iqI3A5CKc%fNF4%Y_5NVA0hDvVXA z#IWuMicKy>S)oG=|E)8??-rOrs7%RcVnj;63Tq23Oca=$QddeUj7})(_Yqo52ulHvC5- z7hVOs3>{?z&PIdiAB{P*#jsYQ&L#p-k2U;XCTbm~aj3({x)L~|WO!moggTWRrtmLC zS!kPK^^=h3=v2Sq|2J}_3$bK{j#GrD&nKi3w`7^KphISiP zKG1E_6h%U(82%5DQ(ZmP$l@WiD8a)qB6OO9eBr~f0EA9gP?i$xi%PK2f+6^&&>4xI zPG2z4y-S47bPB|DrHiwi0^bZN=-CNDXD%4SeaFx_y1?+vRFa?TNN&v({vW_^hR!pr zHi&9d-lC4s#fEm*|Htd=K1J=t`rIh*{w}*hlEA zM)*WPdEqb9My@gnP6ZSSKTI>YT0zspzvd*o#wa`sb&>Fr`GEEqh35mB9p1nRb%T+2 zF`#+jf6{f_sH|y0_*hQIn-o+Yz6298bh9z@N?**zP2&^7Tw9W6ttD1$Qj651N?6SS|0UFd@PJw7I^|9x7I|aTYOB;!C zk5eFyEIpDvzR$>c6%GX+YfEVr75Uvn!O^8#sjml(EV=)6thIr>lONoE?ymfi)0hMv}fdCgd94<&uZu{0xAx{|*8S*Jk6 zF!7#(4@vXb^1BQ3F3nRVzt2W9X`bVt^EA&@vLq|Q{N0cz&9h17eTWe_Q?A4DAy>{DX z_(=BZCx(m-tg>eT!R7vn+WDDbv6Y40M(7R0e*t-o)202&$R!{Or4E0sbQm%UWkbI) z0@o7LDEv9C@=YUj55NsZ;W?lP{np5S4=h^o%mrm5ru6c&@C*j(i7MeV`Hk&-7sP!s zQ7Zfwa*F)Uunt3+$*ElMmB1UwN8ZI(sFViH<2GULgWVTg6!?&JVR|lE$8|C^&Mz{S zU&5RZqb;~3XD+a&y#?ZigP{Kf=Bhbw#vm75mb2MG-*pgl$^AAoA

veg#+NobI6C zd=PYs9Fo4%yac0Fa8=HC9Q4-?g1*O*U3Xv)Oru~=&f5-6I!Am`e@95e3Ro9oLbDV@ zTX3BuGLMEa7Tl0C57klwEg#1~3aS)b5o& za{~G<_#Gv9%Z3%(s_CG|N6vX>^JzKW@E`Q>LWpI^sH-bZ3`72F-T zlsq2#L>{tMsyofIoIU&q=3j7M&R$T-f$}l9lO3S-NE1@6OUhMja|6E;wZbf>v3xHl z50sL{vIL9d`>_ zM{>UA&^+^TG^&Xk;8zMB3;YCFk#`fQNv52t!n~K$?uh`O(1_&EM}tyJY%n=S!aN2J zqu{APF%Tk46Ifg%B$hCL#aZ%<8vA}Y*n(#Rn}{4wMdn^3=~6W9n^VIjRlzS|{)nQ!p4$X0IlDR& z=rlGFxV+$PfByn(-SUa}`)R|-i{M^b>>o;Y1Mmb-qwW2%=yU+S;F<`4cjkNXQ+a|mi!#RykIxtsDi(hybWLhc3c47pYtAo^5BtJiVFT-@NWQ%g9BJ83O<#KdX z%yR9tFP2%Zi}oIw<(g;TDzjM-*uGn4r!)Jo%yNCQpOaZGJNC;m%O%DBmCXKz*>_}? zi-7%s%+lT4CWKD&9L8*>%%#y&%4*D`yd%+j6MSIO*2%-$@s=P>(inZ1JC)hL$t-8L{SmT$gX>SwusDJ3bc|ZYG<+?7kx6`pCUQ0Cu=c@!?z=NEIpJv>VTzrsj{OB7J# z3$Hc&o<-Q;UWeHpuGOKnk%p)g(LuP*Ikv#T#u!XGTyF&EwhY@4r3_QU>zo4oK=McF zC|IA^otULZ_)yT0DDW)k9_td}4MrfBJiMk?_^*L432!v4Qz5lYNs2<@BMkrb$jL2i zxXszZ4)zS=sX)DjU4S3`ity%yyji7xf^Nb`I(q{cneyvPAPJcX{tU;crg*CvAHehk` zMt_3uwCF`(<%^z<<<}ow4P#0d#eaj8g)f-lAA>N1yU^T9-KBIK0U=*}IyznWV{PF2pRlT%DZ-KLCqgy69^X@C3WDycXRo0Xz5t z2D0cDc`E1)egV=JeSIo7Y-z#2quWKd%A+its4lVq-DW+()-#Ik@P8rE`nPrKO;AG7 zcO)khq5`;UDzQ9DuDhjNd~le8o9B3daF11kJotUj|9FDmgPNa@{r!HJ6`I9E2^MFP z#X8KUqKB=E$Rbqqgn#{FDC8~-aM4qm#n;i1qNgQb26qy8M$S%8a5l`S=vfKaN;}U< zz#H68h5SHvBQ1D$Hh>>Wz^4@Qyi`b*Fyn0f1?y$Do>laQ|0`^L8)k3OuXOA5RYkv^ z$_kGfsNdvV4!{?DFM^sk3$6i>0fo?V@a#4uPxCOsFt>B;-m==B#`JNN6)&Z+|InE8ERc#%ppEP`BDbL?%`;4`oftvUYf1x)@B$8D zG)M*55Er|b+31q7!Cg`&OA60Mt;RWxk^Z zxh;#I#${af*X53YPZ_h>GzV!9E(-XJ67Z)0_p%5AKBEjJ4d%qR#4G_rDPSx397MnY zr&tNNLSvtjT3oM-uXc)$M8Q&{)f`6)-0M>XcR7{2P#~7{>*5!kVohUR*zFZd&d{~L zcWMhrRCNKqq$ZX>&kh{PCl2v@P*{y|)zK^QP{Nm3e3T&{FItX#1+K#$0kN?~6`q5F zQ5HT*qN7z|6@rn4xDMY1IU%z!uI1N=VPAY0cFA8y>4~U50oRJF0bGpC1q3bx@BlLR z5%?m2H<9@zF2xEz77~UWr-u#u4Tn_#Eob18tmYy!ivU?|LS_R2vWg=!j7yEtyC|^^ zmt$nCU1}U*ltaIGbkVcaXhXoa1nx(C2%N$c9I<2`%F{4D3w8NQv4n$2cAHg^>6-_B z*5`#cm1C{uIP69<%Ec18BGP{)r704xSvOmYa|>|T>`lpL@6%+@rt(Xr`#z9pEWc7n zdcG`q8pU~F_aDt}g`)w=LsMW|+2|Nd*gzM5rtud#MK1iR*HKvv{Hi}7Q-;ivziIT( zYV;&~X!f6|B>Pc^mssM(xKf-iIYkNfz|TV^)pMt=OpcaT4@3?Fhddv57>Ff@XtLj{ zA~h;%l#_Jd)<~JKb#^t$TU!En(-z4)qH&;(r!`rfDsuBq(5-wDwno)UFMwqPpXHCt zf&nj6vuqy4mz+>@L1?#-y2h|yhX|`Up$uvM zL4=G`a7puDhRmS^X#O!|_!Aw);|!A1aTra8Jqt3pc$^EYGfBoN^c`ewCqN!QMdl@3 zVhNT8sgxxk)i!b*irC*qRisU=Y8b`RI!-`_*0J(gjVKi}8vqp34X(yCw_?u45}@2q zNa?_`h4=_)N-+hhZ~+Qu;Yuoo?2Hn_{vfqe<3Jk4B|CK$GM5uzryfVeJv3x8KqGT$?Abfzu zJOegMe8^JS-%a7UI)q}{s%lv*U%4`~CgSQ;^$u(}jDH%u{r0^zco1$HGJqdJ9`O*5?QNFV_z)8t zqY@7_Vhbj%an%O2SSu+;B}F=ryto$O9c99ZXZ;(F-@NeHx*bKp9+z?bp{Op!RhLo7 zvLZ$WalpsnDxZ&$Fm~B;OLAeX{Ol45vK8~ft@Vchl`F|L)p#VYdmAy21$Z|o@5CjS zj^*_Tj!@4r!yv3a_z=kdz?BSIves(FL&IqF2xqy70Hm1Zs$Pm|rKg)x&KP_x>M7?2 zRj;Zj?2-+rX+zCt9ZIo;o{Pgds*6^LCC8wM)_j2~viWqSY9H!^eB1C91IaB83D*a3 z??*XVeNUIeHOEmzR<9kvYAI^Ok`wSnR)2L!G^cL0AeOw0FRJlERqUt{ zYtYX%!7UEKaU`gUU|`o*A%pkq2!_^679c~;dmY3SGYQ84QSJw!-Mus6A9|%vGU$bs^XgU3tKs_|Ow_aUtb14!#w0Y)o=0!9VMpg6 z@>R^Qy-On1%lv~VFwc=sw26&uhaavD##QXXitYHy1sr5q<0AMpUg@WK8*iNl=ZtH{ z!*=7}ag@Mo>Z{(yzk89#HT4(iO($WK$Se12#+0V(<_N)S<`)caV|*$M1XpBBdgE_q zV-JBVGU9D|&lG~!%wi+GX(kjRuL4laMJccJle|qE;k|gx%mmgS(lIKya;KZ=O~;_m zyoxq^(wq3x3tqX4QPYJCufh%^T^QNMoIvgrD^M8NJT2SEng%UQ6;|M|DThy4KBWQM zOKY~6GG!GoaKy4iu*9A#6R)m-Lehf3VU;fzv?~g56rq{eib?u3W6Bi8(*W9(%#Bu|dSui(Tcb3)pZ@u3-h-ZRLX2=X8g(c@o1; zN|T?$-NuOJizrx4%QvEU^%n&T*|N(82~zZn7bgY*~l@UG9`0L#uPG}ucet(e2B-G%&F8Zcap&Zw|L3ovP`Ix4J_2s>fSFx zFB4;BhOkV!2bcvF?gAV;EJUwV_oD^bMviw)=(4p^VTanTfiS1t%a{5r*6gLSblH-# zPc<+JD&#OPJ?B)MZ-y>hi(t8w4j zDVwKlnR2v!l(d}{wy4O}Qmk|}hS-rc9G2CNaEK5SJlM@7m+FKp7$nDB*XqveDO@ud zCq+}WZe%S_omCe2+D=+yFc{GhG<~|2a4>GOb)^25q~vW_Aqyrs=&AWSn?aLSH_jN zv$iLUyrOPT;nRb_xwz0D zwm=eO@hv|}qJ!g0i4=Z9BGdKuW$rUfQL%^VCYi6?!&DwViKDsY=HV4lP%1wb-rj7O zV1jSq{+6|0!8b)_`nt?l>|v_%l`>z2b&NPn8QPFLQgy||=hWHGVV{|c7rHRiRjF%~o;#lL> zj{z<`qB{eZN2D*a_B@H)%Lxb>`I&@QV!H7F9SqMa_)DLy2}}uRZB5{seEp9&m_#h! zk4s5Z4w=7!OF{0I96a{O!J6DV2gi}d!8=eI#hIo{9!wv{Wr&0=TBfogm=ZoqadAMI zcFTOl9_}x$(&bDamidZ3OjW)z(R~}N*$C-X*Ens-DYc`M@StoLo=f#^Jg2h`=H$+D zIL|;!G&c!JFK!R2(?7-~Y`@whXtD0V#DLj&u#0 z)7k$vB^&Z|XNFYqvV`RB(xiV(mO8z0dJ5AIjN}LMm@KiqO%7x$#@n5*ylpv5F zFTSA&CR}(^6|og1YT|g1Q=hYR%GHt|Qt{KM60umP`zEDaANgSyoX>P*Xf1Pb(HU{f zSK)H(8d>={5#J}_Is+FS$F;bw$K_0RWaa1oHb1(=UR>k2*!H(@-GS>#TrcBtKEFnv zc*n@`_;b}^0MO>mko6uHxgeo zIIxXai&C%_Enir`MQ#fLtfa^tbY z|IX$46DBG3JrFk>4z7#?Yf@t?8je}%KKi#yWZvB4PL zgwol?|1-0&pXUl=h9@P7!$(-09ARs zr)PLvWgTqXxsx$(Oo@X^FYexs#Cu|0LyH07p%W+?yV@A`lt(n71g96s#^6l>KqLYK zV*?5p8)2zmi2lyu?m>86H<^l)P@gVD=O`&~mj%m;%BT|DYgQRN=*#}AW^m|4KsrHS z-bgwnK!n>%H*s*tQS1{a&kgp`8t>GiTZv#WPV*Y-d1TBL}xlvfuK;3!~p|^1SYCj))r5O&}r4cR$?U@$RPxkr8A}49Hy#bnjK_Ck&U0V zc#IMStRkc+qdlgbXPths0mV&)0%zIjSyG3GMDSD1g&s1q{sGp0@b#@A zh9WuT6G#l}KX_u$$Hr$nji09)pRF2Sq8fK`g}}!slCVQ^DM+l`+&nw%4Zt@15j(BW zwyS5&SY_wZQtY`9KEwLsNm5Mf5+kC@EiVutcwSzv?A>oqGVDXpyL5~PG~?=Egp>=s z)`gH16c%-dp|QN>Jn4 zF?dUPC4X5W+mK~6g9Ejs^dj3@K(ux{mkC!{C)?0{_=M48Ta!jFlrnl1&fNQn8a*r+6<+HEjPhdd4tq6P00-&R40{S8 zSg`~**l873@rQ?IDDVR zFA&HQ$C+&;w31(x)jEb>2#`G1(aIRCvEIaFwz7>KY7AE(nPpqM>;_u=(J6&nQ{C6< zM6FGdttlL&bi3JHAHSp=QX=(*$AeJ{8&m4G7Au)hup%Lp#Bh2e`+0PNm1HWvCUkF3 zaP=nL-J25I-bF)0lrz)2(q4*jR>p?4ZVJ?>yuR0Z{`1n~Ti-Sv2mH+E)e3UZspYlq zGL1gi6%8!a(jYUUs72D$mO^AkT++7mB%lSeSeL4yG!v^2EKbV;B$M(mRf~cwk#fm0 zI&Jf?yaN_DY9DMMAv0>gVQdQ>W3#Mugk=bOtiv(SE;@Ok=}(C&_Q|LskC9rYJ>^i_ zD72@{L9b?c7kU>O#`qTArn+E*Vb4Wh^H(JobgV@iY(G@pc#yJ9_Iw5(&)FqR5KGF~ zB6E@LUxB4(A;OG2u%*N+5?^?utLcGv!MBg4>09LLn+{|`kdTSjdQAo^)?FuWkZR9} zASt&C(L|(T#0Qiemr>SI@4| z81^(H8oPgJRNx(xF)$R{+rV*RY+Zb0Vl>v+(AF+%;(QBiN>zPh-Iki>rlwd!WexU3 z*uBMZGqRiPaeyb~ni$jkhq@d=hq^nvWXt%s@SWW;{+IZn(eW`UbNBIMmEEA+J*-eb zoYG=*dwq4Sh^@sfJu%jW{aCEKbG$PZr>U+f)>OTzdR<+s7#)h?PHR_B4F5EJWP%y_ z54K}NBi%i*9U?ZgO(_pj^x&V8OBtXEG`qIBy0tcjfAJb?YmMRGy~djB>tl7B+QGDE zlnvvY3_I!Z*l16DV6?v{j>oZwI(NwpcGvKDd{B&b18qREWJMoF3fu1EMJzTx1ObLc ztan)Mj-iL+r9^@|bBHSc#k-c2|K3#&rT(YZqOC2~&>UL};cD7j8&kVpSKCxApxZ8f zbql;6GlpT=u6N!$yGQykKK!ThJ-QQJ+}Fo?_|M;AL0vKEOBKbT5NKfnhX55zIfO~; za%pf}NIWv>=}r};xeb!^4tDm9rIxqVwzV{fQQS=)9*>dQrRkdH#@blJriOMowiDYX zkG>)uiuFP52N_Uo=wp2YU9tF3jPC)Bb?q4Edsxsdl)x_84bBT^%1mb8)X>rpt8Hr# zv9W=^SnmYX*f}7NJG8bioUzf)iLo9vT9YiZMZ~BG5gXn%(JNvT!$9oT!&Ti7!@m_t zAy{9H`G|SL6PeNe-LcWWuK1y;D2**O5=9wY_ecycl0nBuI|t%|=7bqOCR&@@Y7Sxw zZFQ{;)s4I1^5Jqm*ekS^c$bHMChg3NkJS zd|ca5OF%y(Y zrx+BFbd}n!tS4)1GJxZ;)CL+`HdnW*wFR$vmJ3vC zb3?2m*4SEumd7xOwsns6Od^7N7f?}bUC;Qsme!gP_*yIm@^BMcn{>WO4?jM#6P{YG zk%>0SW7Ul<>#O01^iss7Z|uMouA!!FQuCOSo7*ThoDF=?#1IZJwbe_f1LrPAM#nqj zeN?~n82qo|(0Xef=H!uewXuqFSH8lPuXN=Pb>$bk@=IL#rLO!koP>^XSs54~i61x_ zMfbMB5jsb%e5qY(*<7#Iq}|<}yG6VbLBp8T=i1%lJvA8BrlhZk#mZB`id0^8HT3SW z#^#!hvG&xe#uj=z3=y3I)InE_bI{lTSG?o3#j|3PT>{)Bcpw`?;GmW>cvCsww2#Fy zg2j&i7JX!5JO;1Zg@f0TQ4Rw}s7Eedj7QWmhZblgon7O&TgUm-(pp#Dw6?KM$nhK; z$NxHpxpeo$<4y^t+So`;oiyt>N7UA|C1THs~*gSilJwu*&NW zCzsIV2)d0TS?V$gmqoY?!etLGb6A$-P?gLsPaToA`f4#TjJ0mKr#pgYrO;pW8#_&u#(MG(9 z`v({VtYx*}n3$54vCWM&A}*~D3otw;Ekq7rEIu|Y;7ULOj~m09G}0w-U?1xo8P*tb zO#%O;??Dr>o$&z#7^4g^0&fM_l8K&i7h*KbPf!<;+fjI*6Q}USPPco=GumuN!qX77-Im9 z3A3r$2`U*-s>MM?NJ%$~WA6{Y>KVjTpz1O zY^!6VvC&R+=96M&!Oet>)}W<9Iiolu6Eg~KHjY?J4|d9OQP+lbB&DRW9Z?TeubUs0 zI~Eyy>f!F`9K*=MMz~eLvyff=(lqg)7lujhXWVf-26}i%8^us3{&#dt+F(kXjJD)z z1FPw!F2P+Z4D0yL&Vg~njEsS4c!_~VYYfc>#zw^GaOY5u-bS^xPg)f?jtI)>`#{1) zOD@i|5NyZj-joAVTO_U%DZ(8gou=HYX`v?fQH&1a7S#ZDEHM4fLHas8{MpOaoP7u; z$4GoPnv7v?PQdFhcCP}Q(o}mxQ(dbQ6=Dhv4eU}=kh>;lPXVsdj1XcbJry`%$%7vq z8;?67b_#3kJ(||F%CK9CCd2MA6?Q{R^cpOb&Xcyo9yp8eWLY_8Ek`w_cA&Ni6N&48 zTgv+Htij6L(D0oAIW{uN{anxRj)6EfT|+PcZhN7oon8Ig=&7Wma{LrGXZ_eJO4ZWu z={<77PgUs90eqnHq0UjgyOK_l;7;fr4XO<`h8jKO>N6f6=o3-sVZq}sZnFtyt!RY?Usi2n)Q=$8id~Z#rS}+`zEl6 zVXYe;QH$2#$jGQ%wA410>zd2ybAyBN;^r;6tW;DfXRP*0iLOf}_YNZxg6Efe^?_k| zIHC9@S7et_(Cm~Ur;1NgXx+3fwQx&oZH=a-7v^B8Ti65K&0?h(n6&q7kRBk#XnB0m zyeZa>?T=jb_#Y)OF1yqsFo0-^AtlE!acqGO%2g4wf#c=6n=Utw!=1R9j;Wc_Oj~Ue ze*TY%IkJ5K3lhVV5w*&8B3K!7_M~wdP6}c5=;+`;mwXz$wR54h$f$NepHa;}g2PxE&=fq;lzG_;VTjVO8 zT$xAZS|GiJ%QiqS&4-~F9*G+0-R+EO41S#_Eiq{piLDR!JSqLwTi;lP+(W7v>lhIy zFXuVVmil-^H73oEE0mtA+Q2Y)2n3-o?lt40bJu{3$GJ1Y+{dgR+NNiHVscl?y@wp? zuFkIhNs+R4^EK7*q1F1~1u#n-6_v-1Y^|$Tx@xOQ9=EZZo0>Pd_t)X%7~eLCfIJ1Pkjg+5HUvby0>m(ABg0s3 zVH{YqIna!rusSh3Rxx#=6NzvohDq0+Iw~;ZYIstf79HqC#`-%EG|P==(#vc9h`$() z<1dxrrsnpB`UdQ#F%TG#?Xf{Dkx7LnWx?jDox3iMG6P6Q$<>W@JelLaX~j&$c?-X{ zyMjfWrD0X?$L|~>iC7nE!9t%5d!><3D??oVp%*2;iU(b;Sv^-GWjOHIv9Yc;wQuxU zT-eoPFLV`950BN79{vE6ml4FoHaUwKvh~QQ8K%ElShem>(+VK8}X4`QrAwhG9le9EUe4 z{b;LgXl`pfQiVLp(@}XQ2l*JsGopida@y%d3(G1GTQ?u9@JM)*u>*Xno{dd4*f-Q3 zjO=JcOG_7b9>g23uWM`+o!!Ubw2EfQt)7%c?kX__T^k&TnbNy;J;QKlT?)UghW1xq zUDJ*TKGuon#1erSrsx=tyyMtT@kDu;`)(O?r1EP5k4@Z=U`Em{jY+@cY?~bai$gM) zc&w&zBhH{x`dWD~z3IXu4~BWP_VX$pb9p{>BI0aj=!sHJ9H9slNw1@Zc6bC166c** zuiLO{rf8|Ay1EI^j1BiiAiC^w#4uR=SLJn$b<$*2wnCm`AH*Fu zQFE{;h=mEOcdai!7XB0Kq64qm7XUKr_DxO5B@PYGPp0y~G2OB!%6eTq^A$}nq|F;*T zb$PJrI_luQ2cppD(cgfc+d1x}Q~1dKrWUo;wpJtHNUX2=NVj)vl!uns>o7P=VN%_O zLpM2MDQ;4E!sPlc_kfT|&XCj<|G*VQ4~|}y<$)M6asgdWaHd;*%ZU> zs-2oRFwBEax+b)yRp_dml4xjyDRH5YCwuaoi5%qKOpUQ}McfF|Iwzkqwl!h7slh!U zy%_Ldf!jnO4@$bnco2_Mt1%9qyw5X=-_T)=j*sIYsBdsWuTU~%;&~=*aKhO)$)lCz zBAHz6;UQ}4)^1)GtF3OYP8}dFCvx|u7ZkQD`5dS)-l?L-R13~sLDzPI5d-(}1CzE* zQYGE64>{M}r_?N=OH&7SbY=<%j!O@3Z0$gwp6t%n2Pl}(wauIA+_TyR<4C3(dXz`q z2bv^K&@r>row;&>S2sI{b}3e)&rl9-H}ZZR2TLFKskL}C4ngJSSvkSP){SP3nbyM% z5g$k8;p9-?kP{8_TtF=m6J2~%R&TV|ZQ2~ES-w0Xe<~Q^j|wZwE0;v(#d`*EkkK}uaHMm*3_n<0IX2Qe-aE=7p!SaLSX?$XTGm~$6eYtWWfRzV$e5-~ZGuqRIodVG zB;M7(5)WnXSk_ZER7wtgk+Npg;IwaL7X(jcdcjCNj2bEH4)4f zV-$o>!+2U4Oi9jPqT)BD0A$ov)&oPG8QqPfLC`nrfU1AZ%o(B0%&Yls0lG;W{)84_`f>^C9QlLudKX}fEoxF6- zuG5Oxz|iOfo?yl~Gxkf#Q*zw5z@0gsB&CRqz^Go`Fy%>3N>yzQ?jBAs#F1Oe?)Z)a z_LgzgRh(BO584nGNmnCp({v&z$0;776MZ`x2SG5v;fYbX4oupB=oP``-&0O|w2q|X zM+Kq+1e~~`i{}f_NUV2&XJv2*!y~LiKqbBBv}r zV8eSzuQY?jsqcZ)fUI?Php z33Vh&_A$IU4el8jFchw>>O6y0aKv4^I+KyXp>jKj!_~pvGW?dkaH2U9j4m0|nvy<5 zsY2a9WFYMSfn>&sPZ3AkbsTsa9obP~LH61)Vn@D=)aowLv6}D~*9@jwh zP}kDh+(fEm)S|~i20RBwJ^F-8oq^!KtIJq$_Xwv3c&-C_#OWU&6&Oa2r83-0I2#oi zHo2UQJ^>U%I6$S{(WNBf?{aBsa*xMyeJdWD`!O77%ZEVZV#;Sy7#i>dX~^N7JRD%? zF|rLOP%h7eyJTadJzWF61DH23MEVIiNVEYy_LDNeYd5#IH*ZQUYie7ko6^rt;0Own z9CMuqWa{h*C-tdBdV9v3ekl#mg4VS(G`n;vpT?0!;RM()3`!@TAJ7}lc5JO`dj@eH znZhp7OdD0@obG}i51;U`a$NM`&SN`o!==#GZNia3azTeN9~cmU7`sD0Ndsqr0am6> zROewPV7Lcdt}aQNVmJgJbKpJrR8izZJMvMPO6g#ds~Om%QlDz@ z?23C&t%4PVU`OE*CR&Xie#I122H+$TvMRi*ZzrM5{ejw+s_ zpa;9zsk)<1&5`FBlyjZ~@PM{)M@61Y@Q$v$qXE97ahz`=H79bOYY% zoO_#ykHUuJT`$>MgSrcMkfZvB$~K&0!L5KlpA^GgFSYqiynTZ)0^b`VUm!9$P{2>R z)PT7j_~C%#T$e&aA{k=v^`Qzc)hVWGwc${GYe7Ca$mh)tvO7Fb)z}Cxu9A)NP#$q8 zTJ7z{V-j*d%fK#i#|<^=bdHln?k-_Fo!#<~O*+&R?ebiz2~UV|qbN7qXeI@rWxYDz zV7rq{stq?>n`@feTO@Bemz9HWJ4#3Oa+2%2GoY3ph>uw5gFrsjfYT~{G>&Q2+Ke{{ z*3=vpna3?aJKr-B!DNqA$A=lUGBV|>nNTc0e3i}GK;$&v>1ki|o?)NqImH1jsS!QZIEi(DBQml*p&zyvxDcfI@Ad&yHB>`Fd z{if?<;b)ww?PW=N_CbB{(@xjNlCMll7FhVXW-5KIr2jzz1wZF>eJqjhf++vgN%T`E z(NCR(pW2!w3MSDPNcyUTS*ZFOT`>Fh0~hRWz>?OHEV0D&N&Kfv{+@&x@+Dr$kA)Y6 zC3VO08DhDvrezxP1!B4Yi6v%E!k;PD=xT*OGl?wmBa`qWVqFS;WDZC0l7e46 z34hik{8{4Y6#Q9}@JlA)mx#}%;FnCopFIhGwirmkpFIhm9wqs)L^KH?XHDW}$#>8t zQLGeiPW*+*N=aWn39g(3S4@Hzi=D0#&W_V3!RJnbF9S^fKu?f^`F}?WJVn3wRlSlf z2lM$?sCPc(|94!Z=NgfN`5FK~c%OuGMIizGA^xIC@R}6-sbY(UxhCXb{_tJ(&WH3^ zni3zv*G_`((ezvwaxg#mGI{4i{NGQ4eTlh(cYCA0a1vZK30^-5-aHBJo&--!f=`(Q z>+>VrRB%0)fRJ$ZxJbECIJl{T%sKFpIsOMR29C}{p)!a}JmHvfuBszF z_a0PYAM8|1RvhF>ijRF(g-3DRUg)25s7LNT_Lj8ka6ugG#^nKf%a1*daB*@SQ^@^` z^OK4LpGsoMx|HXX4!#|fTHqctb=)o*$PuzsV2X8$P=?DVbb$TpQ{7;O2q$WZS zBHE3x>l#h=(Jm>r|R@P zrfC0iq$Wad;C3VZoaUKIu@}Y^IP?>J#N_bon*#ap{0>WQzK`G<-i(wEsBM&j|6X zu76p>KVu5{f6El|@6+XfX9_-e538ihVoEufqFnw@2*BUc<#*}w$2EKwe7T9G_QyKq z`>oyfFr9K^VV=trMko6NSoQ~SJiRE>&p6SXkF{T?8BBYy4r-YHwT<;5ole(jM5nWLI!~ty znD*jTtxPfB7Bel!t7w^Go~>bu`C7|#DgKiRQ}A!pX^T$Vb?Sxw%^J05HP_>xZV*PA zuhRmiFpgrT2sG#F^2ItmT&HVv+NM+b8}flk$uzE0#!f8%qE64z>CHO*hEDmGVB$Tk z(;w>e4V}KJ(|tPqmriq_f6~p+X{}C=&}mGk+jaT{ot~@Ht9ANyo!+g}M|Ao_oxZBm zw{-fRPNz_>XkU&e(m5Jt48!tmIvvp||Gy*4&(`UsI=w-scj)v%oj$A6S9JPYo&Hs) z2yi98fKJPFdbm#4>vXeDx9RjtI_1CAqdYh3^m{seN2mP9uB^}Xs5GL}GMyf#({(y+ z*Xdb0y+o({UwP#7fKH#$>B~C(jZXLJG>SEa_)B$)|7#)PR-Ja}bXcb+>hv6)^558z z{%bnDOQ(2$MByL5WIPEXe9EjqnNr;qFOMVO_?E+``?t%TuLaCTg|0Ht)^A9v`Cqv{%C*X@{jPRL_`QhHRVndmh=xP z|M%yd*IB`EBR?hIOzBCZhdu4eOVJgK-R|V;0WA6Zk7O zDdpv9fxU4qF2j#-7aqZ%P+v0Rj;8`fV0~lcs7*cTthv6zlo zI0qNwTHK1cn1^SvL z7=h7vE85?CvVPrh06vOoI2C8(V*C)d<9B!xf5S35;Ileau|D2{Nq9s%BzosU&I+W7nk8jxD9jhd;BjJ)v>C(U9mdW$5?EIT`&b7!c1V`X#d=k?z17E^d@eQ1f^Kc<9!`SX@5e`Q9H!$`oP{~K96!eGn2SH+HTs}vpC*ov$9p~YC{1T7iIlMN) z8*d$q#U#83({Vbk#AA34OJDEhi^e3p8%N+2%)xK*6c&s0^2A^wrr;P%$K{xZ7ci^_ z>xWG+5j$fF4#qKD8}+jj$yqV}D$MU*G{ek0on)`NA=PcVIH!hr@9KeuBF&AFI~(^4^J~aW3X! z`8r;|>evOx<3c=yrEc*0H^6vogBiF1OV#!I$Ke2+fuCYNR<7sukHwZa0-wYTd=*#Y zCd|Xo`d+>&n1~NyDyCs3+TRYe_n#bGfg5lq?!yy!9z*oYUt7Ks*1!P9V-j}5emE4z z;Uvt$Ik*_t;#SPXJUojfq8S%PVGQ1m?Xd@j2E64OVJGZ`gYZ#&0cYYuT#KLM0W7X_ z1#ElOz>e4(AHfMY8`t1IJcXh9*_Y+J0o!6vd>m)tIy{Ua4ZY=SVHZrnaX1~9;s>}E zH{cfBfqU>z9BXa44o>CT3#}et_FB7r)2th^tz#cdNM`Aj@f%EZw+>HD11fIu`Cf+zIq5d?kyZ!-;$F`V)4`C{%;oJBH=HV|G zdb5{58gIoe*c*r7Se%5f;@h|cKg4ag7mwpP3~B1skHTB94R*t!I1VRa7S6^+xEepj z-FOIp#NV-MtT&Fj*bWC`8fIcPF2*h9E&7A%#NV2FOb-(0o2vCQ@l|n(^%@K@?fuid z$#KGo>zK_P=SJcHI9-YFH#MFIiN`X30&yns zOyY&a%ZN7+?<78CDqkM)8B^oEVCq;R^j0sfVru+VF_QLZ;uyS{_7=pgv7@PcUClf6 z`x)8?;xHVAPvAt%z{xn>RKA&}@-3u&39iDmxCuYQFY#;KXDVN@c+YCs0Pn(~_%gnO zn=#kavE2dUi&#O=S z`KH*$)MuIw#CKtD9L)R?rq+9`S{axaPxZKoot4)o27wvm+KOV-D zcp5L5TE2+hlWh4gQ+2ChZLEiluqie(wR|V+V^-B)J|G^7shGz6=S{8mR5Q$RX5&(` zivCD4@u#Nx?Jz4j&SA{M;t6WkcuQdgtc=%VO}xoeo<`V)_I8+z-LWtB$A@t^rkct( z$*kx&lZmrUje8+}f;&tdbMGhq!PNNku~-Xlxw59(D`FV!HHmM)XxiiPPE+~&GQU4Q zNc$wr#(y*a16)JP%eMCVhhc=N@ixVtrk=NhaWp=I zGjTqyG|M{9R#P>0;2!4Z;vqbS`FI8|pq;>B^-E$IycWYT3hQ718{w^ZJGQ}gn2g=A z58jVMa2SrkC-7O!z^OP5OFCMQ5}c19_156VdTVoyz$nzmR<}I{wK?3lEq1|f*bDpM zC>)IwFb$u_DfqUj|6?ohRjKz3tjcu_v z-iJeR1ZLo5oQ`kc5_})m;5yum-{4U^jzx=W{5oz6!LnEpqcH~Kuo=4Nt!Viq;?9_i zz0f_MMg2w+r{Y9>24BZnI3E|_$G8!9;U3J#Gx$5&d$6r%7*<2~ycf0CC2ocZ*d9CM z1E!Ai9>j4t9y2iub8r!Ugd1=V=Hf{_jip0WPy6L-@LCMV#u$suu_fM#9r14LiNo}{0jHtVf-F{#fw-`J4`!{sDcp~h1x8R9dnj573d>_ zyWh}D&t0yrsmI6Ne`=p=gWzMf{J6L7!%F3@kp2q!Rns0D%Gi%V>=hJl8f*MD%p7WmWLf<^xH#gLaS^QYO4 zm*=vVkp#{Di;GG8L0;~nl1qzUu4lpEFLTAorI{|%u^>_K1t*s-9X$6h7YVu+<^L}o z)bZ~U1z*&1#Yuw~DkyN7>sl^NdYO)nJ;wrEn&jWNFPn4k7hI$i95wRh+2u-Zvt{h^d2qSeQiX{4J?R@XkS`jgGGTYL1! zm#o;{&-|$vcamf&-4clFE^(Yby02dyIXX;p_rW%<-ns?X%~h`TV+d^#rr$kUv>XyQR_3ubZrXw%_t6zph=&5L~yr z>c**)t#3u${PmqiKEG}&%}DfyU)MgX*tM$u=E``I-iSCa3& zE9|%C3j1xm!hT<=pKZ&(Ti+k)=WmBI+AeS2;YVH$i%zIt@Z-DueI1WSdfU0S=KGKD zZ-w%`($%}J#B$hVW3s8N2Ik+lxJ!4veuLhy{CT137hE@KkB$TNdCMN(y1MywBMRk9 z>*KvYtBX7N`K~LJZ`ya>=PAo)AF2F&4GZNv+(+;IeiHTb@7gsz!Q(roe0DvV<+Jw> zKVQp2`D*uboB{R(W%BbiFO=`>e(!Ui<~`^T5}ek?t6 zX3m^BbLPyMnX4=L_(e+>Tb8BV%TklnAf?n>XX+B)bPbc#7&Tg{ah`N^ae6-&3nw(p z+N@$~Lc_Gps!*xgcX!S!TmHw-Tep@S=v`dA_~!ZE=O27$=e&|7yFUBR!(;uPXR8;_ zT8#9rH~sbt%{q0`PRrw8GGg;9cQ&nU>|&WU{f)nbfY*{mYZk6vwn7z7 znKC6dAsbt@Al919_7@hag)0}t8q|u^rer2IkVaXdN@g;tOsqN9)7_VhP3YJQFT>ZU z=JoWX+7tcBSZ}g7mDy6LTKc;CV+$b!91B;*2Ko{k6Wu+Dww`2lp-AmWZR*okfPI+UiSnZcKAeUtFyDpSbISmhHlAa=eSl-Bo>d9`{)~ zy?p1cX=>cl@2YXdAD39mcdGenoYCP_U2bWK1(TY0zO>ckGyUAw@9EOZKQAdYxz_7y z>Wj}B-EO!e+j5L9FOa^fAzGhZ-K$HD)<(k{?&xkYxr24`b-%EBZC;(_pPZ4V4b`OC z&#Y}ZRF`gjnk=H#`%SFZh8Ei*OGVEc_Nd*~dtpD*pv>R6t%%Rdj5mfdH3 zFF?`+nbu@=)#*dN$};pl5NO#+2H66<%BMij}IZ3a^+7 zfD8b40(Sz{j%Kggq3}AaNdb6ytvQuSg??`DqzS2qX5L7Ty|%pTI2JzYzlM z6U*>6efX8g@}5S1zInXf50|}2R33#sw9tt{q0_9)lzYp0eJgN%BO+F6_yvlx-&HdQJYWDlX zk-lxj zU8&P$Fk8WwBX#<5^6%0-_T3mQe?(id{JILIqW=28Y>ZR*jUp5@Rxqt9;v1BIn%3MK zz7aO|Pb;FNK==yS(?3l&5eh$u(eh6l!IIL7_-5sAD%uy-E1~Bfp=aoMye&tDwv1Bc zA?PvQKQr(g+q*M_%Cm#4tisn)>|UDihI`Rr|K6Gigy&GLIhqKCm(vDwHBlOV0mJU! zM-!Fd@l<7BO+>>-p&fs-CPs$qSTau&F;#g#S`AqK{R35S_X^_O$ zVQbjZfradWvWCsV;Q0^Il-E+Bqmf$!Hr=l=s`6tnon!fr46LV6ZOEg_nO5QBC?{UP zUV6jVVbuMJU>YTXFg5YFjixQO!C;gZ+KM;6M6lm`3W!MgX&Bdle;{xhsPIE@UH`^1 zrd9YY>b%K_hY-4A`Q>P(%YS#^b1+uK)5?EOxn{12XO#b5GpH5uP0IgMoeqRKR{r~f zvrst{KAt-MOcNy)@wQIozrXBMv{f2@1MmI^be(9pl-mEIkd_!3J`|JP|JbPYP$m}M zgTwOpsEa|24=3P-{$Cf2 z6E3GZ&zHT5I?dtJU@QL%WgmiAP!aEefZu5W3&VF_X;EhlcTCWMegL3~{C7h~9gcoBP`TwlFq(fD4xL6~q-`L40CtFlItKVCV zA|H!}p8)BTy#BRzfSq^tq(8OUS`X!1jo9s9XBV}=B3`E*44^7W1suyzqe+Dv&U1ga z9iaSDr;-zHy&Y&l{HS!&!$I{LnGMdR)U(fy9EGy!&ebeSo3dHXzBEF{E=-|pjuT`H z1Gb*f&CX}g*1yqkE_Ax-&znry5@#m|X|r89fO<=vS+vo24Ce~xP2~BHwS(+_tMf8v z=9RX8JaX5JpxgVeu`B55ORNzOAe#8Ewae+rORW({P|gi@=oIk&!5%S{%H3j@7NWzi z+avDdu-s-B{s5&P*l=BXtG4@D&^yoWniRWlg%Uny_`PYoSG@-X=vsN~%yNh6O7gHO zJ#LT(wSR#O9k=O9da~Ju{?etD3U)Fkjj^1&(Vvlz!*@geaaLdf^mp_WpJ0`dP|j<# z%0x?#y4Ue=^lB_U>H)OH4*R_nJhBV(q{P3k71%~0hturMRyhgfETpr{GgN^yj&p6k zRel1BLMlYK2yCM2sAv3JZT~H(;oQJ+J;9Fd0Ecp-6nUau&e8HZ?{OZSWS5dL;KVtS zC)-sF$m5;Qu}b<+vBNaa5~qzipK4F#61u_}&*{9)c9x^XHO?3g+-Y`%^Q6mpl;d`~ zq0-LNSQGtc7;3X~9osw8E`1Q~ZFRhi5Z|{;p9Zzfsl@idf0k+QD(5id`Oh}>u62&0 z{mwDe&CboRl>b~q{lxKdx%z>j9&jACcb=ghb^bujwwqb=lnQYYv1x6j;f7}8n)Vy| zRhO<(qjvf)w*6jM#W|eazsw#%LOBmnxy$WnC8*6R#MsHC7BfnPc7TWeFZAf0{^M*9 zr|K961ONGU5l3pw*>wLa>>{>k+CJ2+6jg!gRNc#*7-y??PGoc-?e}sCj&a(!j(n!h z{tn(l^rIglp10?&BL ze}o+0ZnT^m=6fgTOs1W;ety?FoN-hf>61)+<7Jd-!7g|$xKFU>iCnj&`P)&Hl$02Bj z4%0*+Jejf&*F-4%3P^Y9bbX znsFhaiSgkpV9rpRCMJb%CDE>lso{r6bZDX>{2LNUO-v8JMxs*_v%(*dSf`0O;pbr3 zP?si}!(-s0p>9nq4A)|uL+drMBzy{uvOyC|!;9GM9!;zW-$VhunrIDg#1Mq~G_fZ9 zTX<0@rHLcL6_{e7v?kVut1tqgqczbHuA>byn&=8QQ@5-pdcxGcXyqb!BM-yj;_aJesCe8^r zllZPCwukqo*2ih$B4w}VFdXlpU)YbKq&TJh-u^BWC_dYy3*el^59oC8T=;r%xn(^2 z6PUAPQyHDnW7#(V?Dc3WyunO`e`37t$DnVx&j>mQT?`+s3+;{QRB6WKp8+LGH<@%Z z8Y}&-NxzTom7ZYu%gKML$=`@EE&aYu`;LOrb{E{d^gL6TM60D2>vZ)G5G~5yw@c~z z_Qja-REAjY^%jgj5bj-hsi|II`<49~OjdcBhl`+(+Sx~9^eeA1>OTPWhb_~C zP%?g4GFZ$(d=RpStt(jzw^3|5Zl z;)U=S-^4r6>4J$Fi1JTd5Bmfro`{^F3jQ2ZHsY~7&5#tdAt_Q|>7E5YgNBiyHH>~5 z{5c#q5|WZ@NQ8x`fiWWGLR3M^NYolmEBIc<+bC~jv=y9;3N@#)R?G@>39t(bR80wd zKT>U#Tm(K$V!LJmT8fOd${%5mEx$(vCqv1|ILq@s>W!N=mVj@K9t*Quy103F(OJLAQLoTDB=3eUCXjMIBR0vFJ@7bUtO;#ye2u{Y( zMW$Qs*p<|bqOtb0+`%iUIR~R3nc-%5N>u1hNO~WYi+5m9yjbhl!c5DvH}ZTe7!`=@ zV+D_ZYLnZ#`&FdbD&fkgd!Q{cFV7ql!`30 z%IOI3UY`nH0uP8RvOHh1K{kUSSZxJQMauaN3=uiRDme`eqJI}5E=1N?o<5ZM$N<)( ztl$o^o)347thGv?1gc4W1HCGeFnZW3I0Jc+Hp_D{E0P_Z>av1$2vjw-9M$!vq8$h* zZNv>ZBU+Q&yJ6KH>66#8YB(bzy{-|J<=jFMeO8$Ayx6!<-QYjyXDQ3`9NV0Zl2KM< zzzSxN(oJm2HKB~e&8|dDgW#)(K9Mb!XEE4)tTQSW*=hx+!UCqNCs?K2x~NIXKB#x1 zp#sir^r@2!RcaJF*(esB+>5vrIVIQAk(0YSHmk^~ZiX6ZY_ZMF2#nT>o|aQ|%;YRi ztC7X+c#wOX(w*S;OxF6?JZ*8(eOvkwFouL|>4IHiOtuar6bGmaX z)Qj9;jd>Q-Eay!ONaRLq^zT5;aSr4Jxyc&+DyU{>C0qEhHTq3Z3!Mun^JcT0E^#;~ zBez&O)-HA4CUvW!4y;+t7H+r7^rBj-R@8jJM()UEtgN}2cD&1~q(j3mTWiL!qd##o zRBO!=X58&&1P-qGJv(uao1qS_*}(b#Q>(m?Yezt>sR_}L_vJDUt+|@^deACm7_j`- zVKpzX*@xT-Yp~NjJI-+JK$MF$2!*^uOG#dIBR;5|O>?3Rb z%_@&sB@eR|kMF3OP6YYLFRhA)(K*ZZ9944%NB?n|WVUrwO*Qp+LKG{o<25%?(_gus zX2olGWRCpW%}{YnywA~&-#bIUZ^y{^z1{l#XK2RnT@Rc4y-(|$d1%k?eH;4ty~peH zY>?_G@PXm8|yEME*WeoTd7(uaO;dDzMx9aiLzR`3zZdK6km{$y2< zP$RSr-!L|eS|fBrZ(1eKlG7UTPkQBBR`f3*_qRrHuMv6MD%+0imAF$!-N>n<{8(&E zQBGD(`}I3c{@dXupXG8@u$&ft$MS4Ip8Zd}RsEo(6cIia!&~%exL=gp0%hL-zppy4 zWGc%J$dz%OjPfuXrC|N0?A54Mb$E64ZD{9 z2h>saTG+ShlJdJ<_Lshfor0q}cG{0)w5l#Ef6Ha(^f3Jz)cqM(cj>_CWWKUI%9hxH zy}zc;Rjk7Tco+AC_KoDeT353B;agSLlppE}_}(`O(25!}%)lh9x~`n(Lfz=?|E-R) zFQbvKFMq&g|Km5YbC0U*x8Zrx2t|!5kpoLm7M+6 zO3Ge@NKkc4$s&}+;$LNmo(6f?NKxI}^r+eU)0OVfZf39N@Z4E)B5U9OHMMgFims%= z_1j)dE#@2NfU@^u-|jAXoHBO)R~fogn;W5mJ?ulTs(xB-QwxstY$S|X=sntnw3kM8 z%@o`G4&QR6$_~+4?k`{Dis;IT7<4e&Kn(FXCQH?W<^3-Eh2O-^orbcX!S=A~;qq%- z_9wrF{T*tgo6udeyHT;~k@DZUb^i5DbxadG5J0MaQBr_~I~K#6>HnZmPE}?1({mmx znM$t3IW9J63}l)<2XVRT@sgF~T9@PEA|aE#hW+`K8TS-<9-htJn>bE8xrOaoI%%$XcuH<>j{4gg|$1ysKNZNp?T=jzHvS(t^srsK1 zA0X!7&2&FkL)jzf;4hU-B*WfA8BC{VqMfSWYX*B5)321QB6B9k%%wM~`}7INif_tZ zOI2U1I1XHTcKsm7PG?gk7ghZwc=2c)-9F^pdAI6Hq*b^X7O#45+)W_7;XeA_`=jm# z5eT<1dVers2Z&I(jl_r5Pl6~7&&D31>Z3{j1EMngEN9DKtN#Qd8h(Z9?yUX*#K`cO z9FLF3dF16xQs8c|+hHvIr?izJ2h&4`_jVf#OWuT65 zj;DDntLl1CYn^N8GPV`F6I6$z@0fe6;SYl9a%M4Ld#wpifa-A$pcJ1q`gu@k=Puf) zz#9D;sD8)Gw*A(~cR_7-9;S`~tNIgA$2xs%A!t?a0=3n7jbX0PiWSC`I>|YW;l0Qj zH4M}?=W<5YkToI(>P)AIE>LVu*aOr#&W9{3v8rc)+Ky1{MK64G1izPyvhP}*--S1^6@P&1fliug(I?fQI0@3+aaL;NSaCuyfE|jgcKE_x^7h5HaYnIPaHQc5~ z_j5BmR?TaeVbLYI(}`Wvg|HfJ$z^yacVydDbbqVlZptXI3sf)+SB)NEdG3PNK58;5 z8a>DgK97_>!bVrQN7$ZZpNh815q2^jc2d#RIeklOxcEd5cFzXB(we_v@#f2qNSU7Y z4C!gF^whM|XO+qwrc&Kb$|{v{C{sZ%0z))y*^Ln8qrB>0ax~Ag%;yGEk#hrH+EKu9 z5jjS&XWOk2EC_AKz&(k?)E!ExH!Xw$vP3E50-SbTmXBPP5LjL%i_OLRLTe05w3O0u zIfwM&p(Ry)Dq?H&B5Mo_Li5q}X?YxD$?-gg1xI=ogkA^7awNto-$E8%NE_mW&%DsF zcsm*|cTOab_Ip1?3%-p=Rv*U^xy+hCp6U~5?#rzazk-S(9-wbVuG_)tewyqGtMXE0 zhE9R@k0OCa?_)g@@S`e_Iq{+c05N}UUWw}K`7F(f$`nfqU1?zNnYHQ^1{ zc|lyFi9q;s7{R$z6Cq_cL9TO|Ck+9Rbaim*1V|d`LFP63euD}p&{yYLy@#^Hk3nmE zX36b}CtQtp=SQ0GhL>ZNaIV*cFFXe^+POjB*((TN0Jm~(jPTIq4;Ntr&1_ZskrT-;`exFAq{!= z2k*RJ3QMcBI-OAoI4Q)nSjxC9v2a>ka$89cKCR> zo%1U_!@S}5Xq{hc!e^}Wq$Uc&Jk&T(>2CPLQI5dVng|$!{6-t3RN0f@9L{e&PqOt= z=a0ct+4{?D<4@8$Nc^2*Du#!sz(Dba}sbJ8W;C zLhb(SX+e33?YtNK6%rL)>0af0piQ7EdPsbz3EY%Fkh*;2xsLn+=kLLPB4Jwmhv;$^ z75lV`1-z9>f%akagU>uKnp$53>uS&n<^IPs65bmD+1X`0Qw8s&(zwr41h!F=9G?{| zoP?ayXfMABm44mKF$_vVhZy<;N+sqNOMcIn}ro=oFdzJf+SQx)*Nj z(+K6xb9C2YLsdGTa!!;ODG{d?VZsR;s>)f*ewA8U;iz*5rnysQ4QEeAI=!UIP1$(o zbswk-)7}I}&yGq%O@u*q!3ciu#dr_?ldd}qx60YikTb&yu3EZmq*2h}GbIH87yy^$p^{a&74Nm7eA@*S$xJiheeh{|_aS(~0 z7$T%Y(PRl__^|z6j=>|=h+Wim5!-##Dvy8&(Ovd+IlVgcc~tfH*z3ov;geAk;^aHR zWwBKC7S{iz6yh9y{0F_de9wsHDdRyUY&+R2n0>D zR`@&^Ii;FF>FkWjwl|^hAiEzW)1~ATDcOuu(_+cf0-z$UJ@3Pt^_<1q6Ze93#?N6e z&<|3wUq9~PWB$yagTY#%`B-lbywbYtENE1xYpl>UE=0+Bc+J8y>B?GFPN`3T{wZFw zxh=C+m)1dZ``o^UR@lHgSg#Fr@S;h0?R5|vKg_2i)48d={Fv|{*@}H`&)yh!{q*i7 zd!U7mHWnR)tRqm9PZ>7N0`V?*PeM7mXf@Cl14yn!Z8g0a#h;=WMLPE&s|h#X*1#1p zS=5uR&|hhxTOsgRyry@ce6SW;!60grzi(Rcd1y$qOwy2 zo#)o0bI}}uwbX+S(ubT;sCvC&(Rmw@M-6@^;^wNRt;nLJ-@B4x$j}YI*=~lfinZ$u>iKZl7xU zx$vi5{zEnY6L_Bi{*y#BI@a`pP))BRi%Q<=*5+JOP4D4t0ct-o$oVO zlxGLdb}cp@EVS6+hDBR!3i7B~pNPYlO&3XLxsr04nK7G#a%%P?sltgu%@!h`nmy!- z63y@dfY$6!uDqOP7rL5p0#dVo7#6MBTI5l)!g_50PhrGTO+6xOipk9L=#$Z1)wB`i z)M4RZC29emK1ph>b8F_bxXRVybg)p1?-&-X#Z}0o>ufi9gRXM}3jR7-sh^0vkiygc zXv-IhA)%V?L^-|Sakrvs`Wdn~M1PSgo}6Kg@{gjN%40a`^z5;i@HweD-jw7G?k%qJ zFM);1&oV4p`PY$06E1TFVziq+5Lvyhte9~WpXUs1!cS37ElwS*BqsFQM*o}KnmH5R z>uOO57HaX3VbNN|kVg~#&g2c6a1sh=!p}q=O*qRn;VjiO4dpapVWUg|)wCC~Xu>Hb z%Qt93qx?dY>+v_`p28`v30F$Zb#Bd^@{hX8Gnnh~H!NED4DuLn&v6B!hfSMB*7dHe zVr{u?$Yy^YH`(6i1ICX*cM8g`+PZb?X4Q0#l)r1r3(B^B5BY|JDb;k5a1^0McmOz1 zRXCVZO;-s=ZH@yh!oiekx=>7wfg%dI0%m6R_B90_KvFR{$^TGLGFox8dztcp2xG z+V>w7nD=-EPb_E-qh-EER$GP5zd|WrBZpfB%^R>GoCi!W!jx3GC#iBf!(O-IRHNbog$E$;nVW!8j}iXuvRBdGMYD@qpqXd9Dk|Cs9N2m7shH!NsG&d#po%{X9u@^EP?v{Qd|s=C z_>7RkDyyi-$h5##R6L}KkY%-0Fu%AOlIx*$NyQNUa6bPml$WwW_9suyzQfsYd4=UE z$!`l!7J341cUZSlbNB|e88$>Zwo#E`ss^H}hFLYkjbiv9gWVgRtBQV6VMnU!Zc_M& zAsLW0GN+GJ86{m4aZ;V`5A+JQ;K0BmhXZ7(YVr~sd`9Z zh}t@9-{G!f)eJAQ$_tvK7tYtctMlcJqg{3He7Ipf@^U?syoUVomb}K(PO#v`=g%MB zsC{VK=_lZ<9X)qG&L~Z$%oI#_3GCd5>SD%tM!pi*weQX|MB`b|WOwam56MIGdks++ z8G9E&)A9li=$zff$FxJut+N^{hP1SgPc>FZU-zw39Q(c!*N*s{W=Ix{4ySOhQY0+3 zg0L1Zull>S;z}gGav8>h2+$IBRugz`Vx5EZ=UZz{0p9a21O=7XimBYnifi$*R4d+x zT!o;Z5`o8{Z&r!5xI^cz5*4-qeqfT^13Gvimz%BwO_F<`ttQEx#BWTJ%eg{GB`@GW zlSH1raEg*E4YXCmmBiEWg61CpcA6yK_2scF#Un^FUgRdS7q)85H><^^lxH926HU4y zp9eK@Hxn;tMnDkV%@{ZnKme~nHOa+mt$sI+OH#vsD?btA^RRH~=FE71)-kjmDt zYj3YjWO{4+QhmwVWTLIRc6RNwhQ`^oM^CTqO{`C4>U+A|$W=dttA2Lfw7SOn?!NY( zfsW+=Z~8j4kJ7vP?3V2R(jIcW<9J-VzOy^iyD5=L*5~}N7i0YG)4DB{$aH-B)LyV` zRm-aSmjBhW;lKDwM{;9#doo+UY|X5LmVNuIpQrw}Pxsa^%0;w)!Uou!$WmA55&8Yn>z-2({=4UD`fjS@S`TR*i+Ya@pyvYNZNoD4ngt$ zE$L*|q`}pZ>@*w$ecd2UekPgh>o-Z48;2XcZ;G2XQHXm5?Ws&M-rhSM6b?t&!s2id z*9$yya32iGcz3oN1Wr8J6mk@BH3^)J zItTMMvG^Oy2mroz; zJio*PRK5ydQ30T!!Dkgz#B2)(vq6qmK=>*vQB>k9-gBI=7d!{dBv#<{P>@X09(d?AB$6n@)Zc7gebG|5zry%Qug2xTWT`X;Jf5 zK-#b01I#Vl--m~7yoGbLLl$DlNflJU1wD5hKj+W`a2;wdf`_!H2jba&{H~hHX5;Bh zGMz$*>E|SlZGlG)S%6KVdkT)a2ck&JIt@!mGm%{cnH8Q&ip-nR3t zL*c84aTscYwARiT9#8i1m+aVKbj)OBpgGhXK)`RDK?@EJSYB8AmFA<6WCzsfNvzAN zG>-Fq{c)D$b$7w?r3>RN2e!0oyAHHLCK_9Zo_>uD5tHNVy4&NK-Z;N18E@a%&qr0E zAaXFkRESRF`V;7QwtHQ?a{&EJbnE3vdI-zK(}{s>(ikRAT~)lVZJ<-d2l|lTA;y~5 z5?^_URO(2@@ze!0ODDQBiUx;&W@!Z6vU2T(M)ew*=)n-}eiu#OPILVQ%O~vEG|g4J zXFz+Z_7UW@_h)*P+tozJx8^p2OjEcn)?*k8V~^iN>dbZ@lN39eNwT|>;l5(Owr{_f ze!;4h(*~1G%1pXMR~yYvtAAAv%m#N(ZdRSCfj-=I#C^-S8C&D}`>ntXYn|7sGO6CU zZcxVvXbImG?GhbruIqOt5GJr*>u7>6bL#-Ka(PRkD(kb+T& zC))dQ@Ze~!Sh;B4viVCFDc${^e*B~xtk%ItoFoSWolV8f)=k2<>BT1YLWj5RYzIa~ zLL;J^Xg?T()Ic9*eqXX9hP%U%j257+8Aok?Jx7_s+|7w%+`;y+KZ7{GDX}5Rdy&$L zF};rA8ICl@Mh|s-Q-_WK-B^UM+eLSCgFh|4dg%g{F-F(!&*-FW6whS)IJXf_FhSyo z6{&WGO=dii>Jttfj^P4>?g-iOO_^@QPlW#7bs5!>Y#Ue??@4Y!SFIMJrpDFKk&LUFW)ECaa0zgOdkQ zDdRF>uD5lidfb4@MQBSBrZ5FP;VkFr%@d&NN$3a(4g6U zVjluU8SnZt-Rst2w+CHQeSOJxx<+yn-nvt5S&>1P;1({035+dKZg-gHB|6iXe);NF zJttPQv@Te}X51#xMjQdNkDcUZk8#l$QAaRtW?(z+w@gqmTc4cH+B%(mSYr^n^mewp zPj9)6jKScYH!>V|<1c2kJ2D${!!6Y?p0sD89rxa|-P}5Iwd1c`zz~~FSn9@_rI%&& zCb!{ccNnb`J=#OzjHwOXh;m$3QYL06u*hWHon40J=Tfp9Yq?%asK03q_qDP;DH95) zjhWS;wdZAev+GP{J@gA!E?=Po_F#}sYcacrKWa;>bK#34RB$UF*S6Hl zsrEhBs&GR_b%rT%GqDxSpc0$A^#ae`415({+S?{xnsdf!dZS@(et<1^PH2c9ymHZE z<0h*X3^^5X&oCH?p)Cx@8IQovJ@Q6;8msdVc#x6h9-kSQQ5_5!{cSz*hM{Dm?gaK8 zy-B!M8 z)4r}Rl6mluPDtjV5(Lbmqean-y~)hFWMBIh(-SJ% zV8Rnt8_Zl2W(L>tJQu*;MV2)acyUJImfZwldZs=X7$-qBPHHav`XHLO_VKc*(L|b9VJTg;dFmCD{8bs~BI6>rBLj(s2yb><;5t6&`O@rtD z!8-2Ek^|$5*6vY6#5vZPdu!o_gcoFX6A4a=ZNB9XZpfT zIJa*~pC(X63&7o%G@eR96wUPGV6v`fKw^+yOL#)$hz_`$AbsvI@`lD^OuU7Q=C9r_ zzHnaaJc%uAKv(!`Z+UBo-8G`z8)kW%3BAF_ez<$LO_T0i2gXf1bpH99Ih>B>5XgyW zcrXuTAma18*U{CHlS%56vo@IA%4$&fUYmQ!`>MtmAAK*YBb#F~aWb8OOuZ*HlQOr* zqOZW~lHBI-Za>eaz3Y12TLV1D>swg+9k@ESVD{{oetsv$Cw&?lrtKMo4hw3##aoIU%g?}KGYhPp>5bECv+3H7#u>=zOV#2ZKlJFeqt7aU$N)_ntMQBKF5At#jG3J~bA$l|^vZZxAy z@y>1@$p*6#(gV3V&H%Da(h;K|Vu7Cq$!C)*mQc;9p*S7791D%~oeMHRd=}o1%Ai<7|%+* zGM0Hed#*~UHXN+-=NlI5bh5p>vl||%Zw@4l(P(^rhGI03+vwN@V-8>{&{fSD3m=r^ z^+$iYp*`2#cED5=rEg$k(A*O_vhi5}&!+uq-BKKC+hr>8-p$ap3LMy9@{~NSyK2nRXF7U=-g06*5*_+zrYDx(1?P#uZcfhS@+rfrLyStsMsgPiVzo2# zlO8$!nOV(GhL+>|g$ow!6`RC;NGqQ}j^RUz*t|?{Y*BAp5|2D|#8zZdydjdxWMjKM zi#+-N&9()P4e-%{UAXYc>aiuEVof7UUwrPHNIs*h$`#J*R-rGuJ9CDV4O;_g&!8k zyFB=*t^CWQ@O7rV%cH;MF__^|BNVo$q2SFUxZ| z(k6}#KI}BUUya8nUwi^8|MsWOKuB`$eh)d?H51qJ+%H5P5EY!Ei2JdCbT`m(C^oa2%vu>LjD($ z?}g74PDZRHLLYt&iS5LQXlEi3{0)*niwOQ^BKY}TCGxit!Ox#xAb*$SXNch2D)cEt z@LfiP-u&KZ;V69Po(TQ!Awu2`BI@y5Po!TUqTU~fkpGV4|BVPfhF9|OzY&mcBoXq* z6CuBj2>COJ;AS!OH}%6}(mO9zn)S8&Bcw z5PXz41;2wK^izV*2)-crlHeZ%Ul)8!@EyU=1p^+)h2Iv?6y;{^v=K5HWr>WYL`F>; zL^Tls5+>65^jDVeE!Zr$N|0Y%V|iSVeoA_i;K_og3;s~>dcnH|e z3a%I2BuIZ@y>kVx5d5*=PX!+nd|vQRf*%R$|MdqsL5?qw|0a+)LvVrM3c(`a1pgxViC~G>$Q>cb|L?_i_7t2ixLoi=!E*%pPf^H!ui&GC&kDXK_`cv+pW$y5 z*uzg~^;es`SdkU@)JW8-f@EE~s1o;bcl*1qQBt9+pir~9~p9%T`hOa`fTCiSl zuHXTJhYGF}91uKF@La(w1>X_;RInZ~g?h~qJWTK!!P^BN6#T8=p9DV=*dn-E@Myu)1aB3*U+@XR7X{xC{Hx#>fGWLcM3i%_>|zwf^Q4{U69*nZ685LkiTWk{ON-81P>HET(C=UK=1@X z{`42?^C!HCHwoS&_;bPE2>xF1FM|IN{Ffkp=RnJ;62!OlHC->r{~yG5_7hws7#BBDStl$>G;{{I^JX7#u!5<0UCAdTI zX~EwMek$n4!GQWj1*Zru7Cb}{|FK8&Z4o?OkpF0w^?xn+f#7g#G?+g{aBsmQ1-A%p z6TDXN5y4jl`75uK6BFE1kpKFC`TS)+;@N^f7Q9dJUBMAJ?2@lmkiT_7`VhgSU{>&Z zf@cd}F8E`?`ve~sd{OXC!H)%Z2^LqH_C^R!7Mv-#NN|;4hv0zVDS{UY-XM6N;I9Q= z5&S^#OTiNC@z~!nf(?T61Xl{S3-$}1EO>$7dx8bnD^gyC;2wgr1@{+>3-TZTlAk}K zN8B!WjUa#2k@=qs`j94FEx1(hJAyX}zARXb0~h)En;66c1y2yXL-2LMVc7VRZ!f{M zf<1zp1s@RnOmHt8^jNQ3@FKyd1ph5qjh_T0-+qE!g8hR0PrNL@UGM?HCj>td{FmT} zk%oVc;1a>C;AMh03f?353&CduUln{$@H0U#&N9@eOmMW|9)hz37YVKuj0^S%ZV^01 z@I1k*1aA@inc(AsFABaX__5$F!D5`bsNV>|$$~Ql7YVKsObDg~zbkl#;GCF|*DknK z@cV+72wpGvkl=3xUl;sX(5^P}DgkY zXA0gb_^jY3f{}4X&Md*zf+q-`EqIIIuLb`s_`cxBf}aU~DTv=r(&G{o3=0ku93faO zI7x7S!9xT)1dkCsRdBoD)q=MPJ}UUE;A?{K3w|!>n_%=S7aSv4D>z?px!@6k-Gbj0 z{DI(=f;S895PVVa4Z*((ejyl~X!M8(juUJU+(&Sg;99|6!D9q35&X5_9|b=U5-6PzQszhH;p(SpYb zo*{UV;B|s`3O+3Ol;F#PZwvliuynF%f0SUe;E{sI2%ajqUGRFrp9nr8_@>}a!Ow^| zLljIg?UWI*)(;b$AUIjDj)-xYE%aQ$`NTq{RuO~v2}_}~f~N{@m-0)Akn>}~UkLt& zh&|}5Lcc?VJ|75vA*l8+`ISV-86)&K!AX)oQ*bd6a*veqgkY!SpDcK(;GI%_kKp~1 z|CHdXMC{Gq7W_c+LsLyV69s1r?oR~&D#1e~|7gJzB!9cmHwfM@_>`2tDENxx|6R~q zYvf0W=;su{y(NF1(1!_bko=>CK3VW0!5gLgHlcqm_@dz3QvO%Le@K3DooRo9;0$6h z{uPPPM+l|_w@UeGf@e$q^@0xzJ|pFC2>q#GQN3wzBoXaQ5ZpuZ7YQCL`CURED|o)( z-GWaDzD$I?Hw532e7nK4S3zWZLeCaFP!P}R>hdnZKFQxEc(LUFSm=iZUlROWu&B|r zHBnrWv_aD`x6@Jb@)+3kXl5Pi6R zO~m|sN$@o(e?#y+!H)z#6a2TJx5>y22$l&B6C5o#R&a`7o#0Hty#*HvE)hIPaJ8UU zp}j)$D_+E~&=rEUf-sBbn{M zIHNp38si)iEG0r8949rNg*inzw-dp)9%Z?52-osaj%^rzs?dB^kAEJlKL;Z{OXRMV z@(v~d3hp0Qum>BrLR+VCG&>X?DI-9Ep}%g*~0vo4cj%{uqv zPY7+SYgBc3veHy=Kge_$cl&^o`V6hG8-o#LzQd+JQmixSL|Ypk(abN!Geh}g0?%=- z!`G#>DyGg?bMS0R5`EX-kb@?wj*nLI*}c44of&-XO4Z>B(Yi!G9=2*5fQm5b|LujN zrh>cVo*bCITSZ&wYT@$;y*nRe@WNJ5`_casAC}^;v`hbUFSlLBkbM0ZTfUC(P~k(U z)Yn41GhVqDW$@K6$hpC*6|c2S$i=z9D~%VH0M(2auK+TZ0C9BYPj%o)0;9(XK+1L7 z{Rz_N;^kg$yVoIuX}8@aAovV{d%5jijg0(uSD@Wa;ntyury!62#oN8yGJZyxFK-s)F&xhRjXNxSitZcyqNmq~cYx2N#AMQ4I|;g-2;4)|_I#wg@4rm$U_iEZY&k@}zyZL+dlZjxh|&vy>= LTj>^}%uW6uZ2BB- literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/drv/test_drv.o b/build_mx8qm_b0/test/drv/test_drv.o new file mode 100644 index 0000000000000000000000000000000000000000..257d5209779d8d37f10feb6f98e16df082b0f2b8 GIT binary patch literal 23584 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/drv/test_dsc.o b/build_mx8qm_b0/test/drv/test_dsc.o new file mode 100644 index 0000000000000000000000000000000000000000..a7b6cf2efe94a5d070d53846013e43613180141d GIT binary patch literal 30696 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 AnE(I) literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/drv/test_lpi2c.o b/build_mx8qm_b0/test/drv/test_lpi2c.o new file mode 100644 index 0000000000000000000000000000000000000000..654ebe713e97bd8b2b65215a4c6a83e3e4633463 GIT binary patch literal 40624 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/drv/test_otp.o b/build_mx8qm_b0/test/drv/test_otp.o new file mode 100644 index 0000000000000000000000000000000000000000..39291d962c0d8923feba32fb88dad52c25953602 GIT binary patch literal 28748 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_audio_pll.o b/build_mx8qm_b0/test/misc/test_audio_pll.o new file mode 100644 index 0000000000000000000000000000000000000000..bb423fe14d25db412d02f89c2bd50a999b22b16c GIT binary patch literal 32792 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_bench.o b/build_mx8qm_b0/test/misc/test_bench.o new file mode 100644 index 0000000000000000000000000000000000000000..4cb5a543ddbaad509a8d6bf1a508a913c867b8f6 GIT binary patch literal 26492 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_memreg.o b/build_mx8qm_b0/test/misc/test_memreg.o new file mode 100644 index 0000000000000000000000000000000000000000..50b8ccfbb6712197211a4bfbfb09d31605012919 GIT binary patch literal 30552 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 b`rvRpn{kyO&n4N1#d5J@l{&`FERy?QlQlri literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_mtemp.o b/build_mx8qm_b0/test/misc/test_mtemp.o new file mode 100644 index 0000000000000000000000000000000000000000..c1bebf289e815ee08aa7b6404f77854910f970a8 GIT binary patch literal 38768 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 Uj~is0XY*YS{bss}NOOb#7qQWCUH||9 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_nmi_ecc.o b/build_mx8qm_b0/test/misc/test_nmi_ecc.o new file mode 100644 index 0000000000000000000000000000000000000000..379f4050667dd3718abb9bdb47112ef48c4e6e28 GIT binary patch literal 32296 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 H%ufDa?K$%F literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_nmi_lockup.o b/build_mx8qm_b0/test/misc/test_nmi_lockup.o new file mode 100644 index 0000000000000000000000000000000000000000..105a985b44fb349b7caefb649ab12d588ed06501 GIT binary patch literal 34532 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
ga-2FZvzr0H(zI}EjauP%{<46NiZ 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_obd.o b/build_mx8qm_b0/test/misc/test_obd.o new file mode 100644 index 0000000000000000000000000000000000000000..3d4288b1627719915e33aded118fe4bf8eaad84c GIT binary patch literal 33964 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

AS^CIof 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_osc24trim.o b/build_mx8qm_b0/test/misc/test_osc24trim.o new file mode 100644 index 0000000000000000000000000000000000000000..819f9e7dfe707e98cf4722df0c04def299e0ad83 GIT binary patch literal 39124 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 M&>f51n18od5s; literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_pd.o b/build_mx8qm_b0/test/misc/test_pd.o new file mode 100644 index 0000000000000000000000000000000000000000..775b164c1a53eed84cd3c8abddec03aee431ac13 GIT binary patch literal 29180 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_pllchar.o b/build_mx8qm_b0/test/misc/test_pllchar.o new file mode 100644 index 0000000000000000000000000000000000000000..bfc10ffbe2438ad0e488abac8a71b2486b4f1883 GIT binary patch literal 35648 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_powerall.o b/build_mx8qm_b0/test/misc/test_powerall.o new file mode 100644 index 0000000000000000000000000000000000000000..d3c41baacfe0ebffd97162135c70bca5df611cc0 GIT binary patch literal 33268 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_profile.o b/build_mx8qm_b0/test/misc/test_profile.o new file mode 100644 index 0000000000000000000000000000000000000000..25900696195ed0346a80d9ad56c6d1d2cb9a698d GIT binary patch literal 43964 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 U&q-qW86bBj?BnOh&dW*uFVYG3F#rGn literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_cci.o b/build_mx8qm_b0/test/ss/test_cci.o new file mode 100644 index 0000000000000000000000000000000000000000..24fd5edea1dff81e10830d33f5c3d63214712c45 GIT binary patch literal 25948 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_csi.o b/build_mx8qm_b0/test/ss/test_csi.o new file mode 100644 index 0000000000000000000000000000000000000000..a58606d9954c5db2cf885217a4413567b783fbdb GIT binary patch literal 33124 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
  • ji?3e^zgGRprxxQQBW;j+Qjvl7RE;H}qgJT#d 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 M^lNqtQRXK98~IhyN&o-= literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_dblogic.o b/build_mx8qm_b0/test/ss/test_dblogic.o new file mode 100644 index 0000000000000000000000000000000000000000..53b4cb930af00a6bac14e42dd2e055779362a42f GIT binary patch literal 25968 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_dma.o b/build_mx8qm_b0/test/ss/test_dma.o new file mode 100644 index 0000000000000000000000000000000000000000..b06d9e3c147caca177770e134cebff89a753ac0f GIT binary patch literal 50200 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

    Q~C!|Dikw%*eWm+d7)0r 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_lsio.o b/build_mx8qm_b0/test/ss/test_lsio.o new file mode 100644 index 0000000000000000000000000000000000000000..8f61af9ad1a7250aa704ee90e5e472c186bcb538 GIT binary patch literal 34068 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_lvds.o b/build_mx8qm_b0/test/ss/test_lvds.o new file mode 100644 index 0000000000000000000000000000000000000000..769c776b7515cf6bf6240a8bf91002ce2e8bae44 GIT binary patch literal 37796 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

    W<8XQF|h{qS0BALbSvi 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 R)OmWoy^yckNkp0x{6CHiaIpXY literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_mcu.o b/build_mx8qm_b0/test/ss/test_mcu.o new file mode 100644 index 0000000000000000000000000000000000000000..b5ee4f54b6e3ac40fb13240f5f293fe25a8147e8 GIT binary patch literal 43204 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_mipi.o b/build_mx8qm_b0/test/ss/test_mipi.o new file mode 100644 index 0000000000000000000000000000000000000000..2d9eb123c8d82124b5c635096432df4bb6ba7d28 GIT binary patch literal 37908 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 Ls_jIi*}?w<&~>5) literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_vpu.o b/build_mx8qm_b0/test/ss/test_vpu.o new file mode 100644 index 0000000000000000000000000000000000000000..5bdabe817688e07eed01b50dfe381cd1cd5b90b6 GIT binary patch literal 36244 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/svc/test_pad.o b/build_mx8qm_b0/test/svc/test_pad.o new file mode 100644 index 0000000000000000000000000000000000000000..2a036557be7fdf268587ad024442b3b6c14db5f8 GIT binary patch literal 38376 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 V3Of3*ZR{o2b}sZdnaFdJ{|n1_jJp5; literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/svc/test_pm.o b/build_mx8qm_b0/test/svc/test_pm.o new file mode 100644 index 0000000000000000000000000000000000000000..64f82b27527fd4787cecd24ed0f9169f0645e280 GIT binary patch literal 44420 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 V1zmku?z+ic4*&21(!|G2{(q(94A}qx literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/svc/test_rm.o b/build_mx8qm_b0/test/svc/test_rm.o new file mode 100644 index 0000000000000000000000000000000000000000..ce939c6f442123592e2bba1eee4d1412b672282a GIT binary patch literal 53116 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 J5M^%i{{UIIGv@#R literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/svc/test_timer.o b/build_mx8qm_b0/test/svc/test_timer.o new file mode 100644 index 0000000000000000000000000000000000000000..bd0c5036593ef1387de94823fe9062347c533229 GIT binary patch literal 49908 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 SNi6Ln_>P8t`?-Z>eE$c^BFuOI literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/sys/test_partnum.o b/build_mx8qm_b0/test/sys/test_partnum.o new file mode 100644 index 0000000000000000000000000000000000000000..ad88f51f373d03fedb3d78d8ebaa11e1f711e757 GIT binary patch literal 50016 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 z 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/sys/test_rpc.o b/build_mx8qm_b0/test/sys/test_rpc.o new file mode 100644 index 0000000000000000000000000000000000000000..2b7b17fa33b18b3ab906adb0a966ecd13074bc53 GIT binary patch literal 32340 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 AN&o-= literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/sys/test_temp.o b/build_mx8qm_b0/test/sys/test_temp.o new file mode 100644 index 0000000000000000000000000000000000000000..49dd3084e449ccdb65292345443b33757476c8a1 GIT binary patch literal 49564 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%0A~M`q78&3mhm|CRiibDtN4*>Nm(=AoNv& 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/sys/test_xrdc.o b/build_mx8qm_b0/test/sys/test_xrdc.o new file mode 100644 index 0000000000000000000000000000000000000000..635850f1ae83ea4075a53194416e7c1345d99028 GIT binary patch literal 35432 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≀_0AD{ddy;uQBrGf(rVN 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/utilities/newlib_stubs.o b/build_mx8qm_b0/utilities/newlib_stubs.o new file mode 100644 index 0000000000000000000000000000000000000000..dc48f75eb33d28ba33828a8ac63379cabeaaebd6 GIT binary patch literal 45556 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 literal 0 HcmV?d00001 diff --git a/makefiles/mx8dxl/Makefile.config b/makefiles/mx8dxl/Makefile.config new file mode 100755 index 0000000..8291c19 --- /dev/null +++ b/makefiles/mx8dxl/Makefile.config @@ -0,0 +1,40 @@ + +# Local settings +LLC := dxl +LUC := DXL +LOPT := -DHAS_SECO -DHAS_V2X +LSOFF := 0x32060000 + +# Determine configs +ifeq ($(MAKECMDGOALS), $(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + DEF_B := evk + ALIAS_B := mek + MAP_B := evk + TEST_B := evk + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), clean-obj-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + LC := $(LLC) + UC := $(LUC) +endif + +#Help text +HELP += \ + "\t$(LLC) : build for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" + diff --git a/makefiles/mx8dxl/Makefile.full b/makefiles/mx8dxl/Makefile.full new file mode 100755 index 0000000..104288d --- /dev/null +++ b/makefiles/mx8dxl/Makefile.full @@ -0,0 +1,214 @@ + +# Local settings +LLC := dxl +LUC := DXL +LOPT := -DHAS_SECO -DHAS_V2X +LSOFF := 0x32060000 + +ifeq ($(MAKECMDGOALS), clean-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), $(LLC)e) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + TEST_B := evk + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), gcov-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + TEST_B := evk + COVERAGE := 1 + SIMUCFG := serial + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), $(LLC)m4) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) -DM4_BOOT + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-api-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8DXL Die" + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-hw-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8DXL Die" + LC := $(LLC) + UC := $(LUC) + EXP := hw_ + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8DXL Die" + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), obj-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + B ?= mek + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), cppcheck-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), cppcheck-dump-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), info-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), memmap-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), export-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + B ?= evk + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + DL ?= 0 + TL ?= 0 + EM ?= 1 + TEST_B := evk + ifneq ($(UPPER_R),A0) + ifneq ($(UPPER_R),A1) + $(error Invalid revision) + endif + endif +endif + +#Help text +HELP += \ + "\tclean-$(LLC) : remove all build files for the i.MX8$(LUC) build\n" \ + "\t$(LLC)e : build for i.MX8$(LUC) die simulation, output in build_mx8$(LLC)\n" \ + "\tdox-api-$(LLC) : generate API docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tdox-hw-$(LLC) : generate HW docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tdox-$(LLC) : generate docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tcppcheck-$(LLC) : run cppcheck to do static code analysis for i.MX8$(LUC) die\n" \ + "\tinfo-$(LLC) : display info for i.MX8$(LUC) die port\n" \ + "\texport-$(LLC) : export files for i.MX8$(LUC) die customer package\n" + diff --git a/makefiles/mx8dxl/Makefile.rules b/makefiles/mx8dxl/Makefile.rules new file mode 100755 index 0000000..08227e5 --- /dev/null +++ b/makefiles/mx8dxl/Makefile.rules @@ -0,0 +1,143 @@ + +# Local settings +LLC := dxl + +# Build rules + +ifeq ($(Z),1) + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex $(OUT)/scfw_tests.hex + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +$(LLC)m4 : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +endif + +else + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin + @echo "done." + +endif + +endif + +$(LLC)e : $(OUT)/ $(OUT)/sc + @echo "done." + +gcov-$(LLC) : $(GCOV_OUT) + $(AT)-mkdir $(OUT)/gcov + $(AT)-mv *.gcov $(OUT)/gcov + @echo "done." + +clean-$(LLC) : scrub + $(AT)-rm -rf $(OUT)/ + +clean-obj-$(LLC) : + $(AT)xargs -a bin/pkit_keep -I % rm -rf $(OUT)/%/ + $(AT)-rm -f $(OUT)/scfw*.* + +dox-api-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) API $(SRC)/main/rpc.h $(DOX_SOC) $(DOX_API) doc/protocol.md $(SRC)/config/$(CONFIG)/pads.h + $(DOXYGEN) doc/dox/api.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_api_$(LC)_$(LOWER_R).tar.gz sc_fw_api_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)sed -i -f doc/dox/refman.sed $(OUT)/docs/latex/refman.tex + $(AT)cd $(OUT)/docs/latex && $(MAKE) + $(AT)-mkdir -p $(DOC)/pdf + $(AT)cp $(OUT)/docs/latex/refman.pdf $(DOC)/pdf/sc_fw_api_$(LC)_$(LOWER_R).pdf + +dox-hw-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_SOC) + $(AT)sed -i -f doc/dox/clocks.sed doc/clocks.md + $(DOXYGEN) doc/dox/hw.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_hw_$(LC)_$(LOWER_R).tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)-mkdir -p $(DOC)/xml + $(AT)mv $(OUT)/docs/xml $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/xml/sc_fw_hw_$(LC)_$(LOWER_R).xml.tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/xml + +dox-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_ADD) doc/protocol.md + $(DOXYGEN) doc/dox/full.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_$(LC)_$(LOWER_R).tar.gz sc_fw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) $(OUT)/docs/html + +cppcheck-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --error-exitcode=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus --enable=warning,performance,style --inline-suppr --suppress=unreadVariable --suppress=unusedStructMember --suppress=redundantAssignment --template='{file}:{line}: ({id}) {message}' -i$(SRC)/test -i$(SRC)/CMSIS -i$(SRC)/drivers/common -i$(SRC)/drivers/lpi2c -i$(SRC)/drivers/lpuart -i$(SRC)/drivers/wdog32 -I$(SRC) $(SRC) 2>&1 | tee -a log.txt + +cppcheck-dump-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --dump --max-configs=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus -i$(SRC)/test -i$(SRC)/CMSIS -I$(SRC) $(SRC) + +obj-$(LLC) : $(LLC) + $(AT)$(OBJDUMP) -h $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .data $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .bss $(OUT)/scfw.elf + +info-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h + $(AT)perl bin/perl/pll_info.pl $(SRC)/config/$(CONFIG)/soc.h $(SS) + +memmap-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt + $(AT)perl bin/perl/memmap.pl $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt $(SS) + +export-$(LLC) : clean dxl $(TPROTOH) $(EOBJS) + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp -f doc/EULA.txt scfw_export_$(CONFIG)_$(LOWER_R)/COPYING + $(AT)cp -f doc/SCR-imx-scfw-porting-kit.txt scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)cp bin/dcd.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/retention.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/platform + $(AT)cp -f Makefile scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)sed -i -f bin/export.sed scfw_export_$(CONFIG)_$(LOWER_R)/Makefile + $(AT)cp -rf $(OUT) scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/scfw*.* + $(AT)xargs -a bin/pkit_keep -I % rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/% + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R) -name "*.d" -type f -delete + $(AT)find platform -name "*.h" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.bom" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.ld" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "Makefile" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.c" -type f -exec md5sum {} + > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.h" -type f -exec md5sum {} + >> scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)grep -v platform/board/ scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)-sort -k 2 scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp -o scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)find makefiles -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R)/platform/board -name "*dcd*.h" -type f -exec rm {} + + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/dox + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/export + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/full + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/$(CONFIG)/*.full + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules + $(AT)perl bin/perl/makefile_rules2.pl bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules2 + $(AT)tar --exclude=*.bak -czf ../scfw_export_$(CONFIG)_$(LOWER_R).tar.gz scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R) + diff --git a/makefiles/mx8qm/Makefile.config b/makefiles/mx8qm/Makefile.config new file mode 100755 index 0000000..84a607c --- /dev/null +++ b/makefiles/mx8qm/Makefile.config @@ -0,0 +1,36 @@ + +# Local settings +LLC := qm +LUC := QM +LOPT := -DHAS_SECO +LSOFF := 0x32060000 + +# Determine configs +ifeq ($(MAKECMDGOALS), $(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + DEF_B := val + TEST_B := mek + ifneq ($(UPPER_R),B0) + $(error Invalid revision) + endif +endif +ifeq ($(MAKECMDGOALS), clean-obj-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + LC := $(LLC) + UC := $(LUC) +endif + +#Help text +HELP += \ + "\t$(LLC) : build for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" + diff --git a/makefiles/mx8qm/Makefile.rules b/makefiles/mx8qm/Makefile.rules new file mode 100755 index 0000000..937a6e0 --- /dev/null +++ b/makefiles/mx8qm/Makefile.rules @@ -0,0 +1,143 @@ + +# Local settings +LLC := qm + +# Build rules + +ifeq ($(Z),1) + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex $(OUT)/scfw_tests.hex + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +$(LLC)m4 : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +endif + +else + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin + @echo "done." +endif + +endif + +$(LLC)e : $(OUT)/ $(OUT)/sc + @echo "done." + +gcov-$(LLC) : $(GCOV_OUT) + $(AT)-mkdir $(OUT)/gcov + $(AT)-mv *.gcov $(OUT)/gcov + @echo "done." + +clean-$(LLC) : scrub + $(AT)-rm -rf $(OUT)/ + +clean-obj-$(LLC) : + $(AT)xargs -a bin/pkit_keep -I % rm -rf $(OUT)/%/ + $(AT)-rm -f $(OUT)/scfw*.* + +dox-api-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) API $(SRC)/main/rpc.h $(DOX_SOC) $(DOX_API) doc/protocol.md $(SRC)/config/$(CONFIG)/pads.h + $(DOXYGEN) doc/dox/api.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_api_$(LC)_$(LOWER_R).tar.gz sc_fw_api_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)sed -i -f doc/dox/refman.sed $(OUT)/docs/latex/refman.tex + $(AT)cd $(OUT)/docs/latex && $(MAKE) + $(AT)-mkdir -p $(DOC)/pdf + $(AT)cp $(OUT)/docs/latex/refman.pdf $(DOC)/pdf/sc_fw_api_$(LC)_$(LOWER_R).pdf + +dox-hw-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_SOC) + $(AT)sed -i -f doc/dox/clocks.sed doc/clocks.md + $(DOXYGEN) doc/dox/hw.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_hw_$(LC)_$(LOWER_R).tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)-mkdir -p $(DOC)/xml + $(AT)mv $(OUT)/docs/xml $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/xml/sc_fw_hw_$(LC)_$(LOWER_R).xml.tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/xml + +dox-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_ADD) doc/protocol.md + $(DOXYGEN) doc/dox/full.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_$(LC)_$(LOWER_R).tar.gz sc_fw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) $(OUT)/docs/html + +cppcheck-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --error-exitcode=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus --enable=warning,performance,style --inline-suppr --suppress=unreadVariable --suppress=unusedStructMember --suppress=redundantAssignment --template='{file}:{line}: ({id}) {message}' -i$(SRC)/test -i$(SRC)/CMSIS -i$(SRC)/drivers/common -i$(SRC)/drivers/lpi2c -i$(SRC)/drivers/lpuart -i$(SRC)/drivers/wdog32 -I$(SRC) $(SRC) 2>&1 | tee -a log.txt + +cppcheck-dump-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --dump --max-configs=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus -i$(SRC)/test -i$(SRC)/CMSIS -i$(SRC)/drivers/common -i$(SRC)/drivers/lpi2c -i$(SRC)/drivers/lpuart -i$(SRC)/drivers/wdog32 -I$(SRC) $(SRC) + +obj-$(LLC) : $(LLC) + $(AT)$(OBJDUMP) -h $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .data $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .bss $(OUT)/scfw.elf + +info-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h + $(AT)perl bin/perl/pll_info.pl $(SRC)/config/$(CONFIG)/soc.h $(SS) + +memmap-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt + $(AT)perl bin/perl/memmap.pl $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt $(SS) + +export-$(LLC) : clean qm $(TPROTOH) $(EOBJS) + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp -f doc/EULA.txt scfw_export_$(CONFIG)_$(LOWER_R)/COPYING + $(AT)cp -f doc/SCR-imx-scfw-porting-kit.txt scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)cp bin/dcd.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/retention.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/platform + $(AT)cp -f Makefile scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)sed -i -f bin/export.sed scfw_export_$(CONFIG)_$(LOWER_R)/Makefile + $(AT)cp -rf $(OUT) scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/scfw*.* + $(AT)xargs -a bin/pkit_keep -I % rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/% + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R) -name "*.d" -type f -delete + $(AT)find platform -name "*.h" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.bom" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.ld" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "Makefile" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find makefiles -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.c" -type f -exec md5sum {} + > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.h" -type f -exec md5sum {} + >> scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)grep -v platform/board/ scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)-sort -k 2 scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp -o scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)find makefiles -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R)/platform/board -name "*dcd*.h" -type f -exec rm {} + + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/dox + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/export + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/full + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/$(CONFIG)/*.full + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules + $(AT)perl bin/perl/makefile_rules2.pl bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules2 + $(AT)tar --exclude=*.bak -czf ../scfw_export_$(CONFIG)_$(LOWER_R).tar.gz scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R) + diff --git a/makefiles/mx8qx/Makefile.config b/makefiles/mx8qx/Makefile.config new file mode 100755 index 0000000..3e2f423 --- /dev/null +++ b/makefiles/mx8qx/Makefile.config @@ -0,0 +1,38 @@ + +# Local settings +LLC := qx +LUC := QX +LOPT := -DHAS_SECO +LSOFF := 0x32060000 + +# Determine configs +ifeq ($(MAKECMDGOALS), $(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + DEF_B := val + TEST_B := mek + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), clean-obj-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + LC := $(LLC) + UC := $(LUC) +endif + +#Help text +HELP += \ + "\t$(LLC) : build for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" + diff --git a/makefiles/mx8qx/Makefile.full b/makefiles/mx8qx/Makefile.full new file mode 100755 index 0000000..53e993f --- /dev/null +++ b/makefiles/mx8qx/Makefile.full @@ -0,0 +1,212 @@ + +# Local settings +LLC := qx +LUC := QX +LOPT := -DHAS_SECO +LSOFF := 0x32060000 + +ifeq ($(MAKECMDGOALS), clean-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), $(LLC)e) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + TEST_B := mek + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), gcov-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + TEST_B := mek + COVERAGE := 1 + SIMUCFG := secondary + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), $(LLC)m4) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) -DM4_BOOT + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-api-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8QXP Die" + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-hw-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8QXP Die" + LC := $(LLC) + UC := $(LUC) + EXP := hw_ + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), dox-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + PROJ := "i.MX8QXP Die" + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), obj-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), cppcheck-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), cppcheck-dump-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), info-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), memmap-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := SIMU + OPT := $(LOPT) + LC := $(LLC) + UC := $(LUC) + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif +ifeq ($(MAKECMDGOALS), export-$(LLC)) + CONFIG := mx8$(LLC) + DEVICE := MX8$(LUC) + OUT := build_mx8$(LLC) + HW := REAL + OPT := $(LOPT) + SREC_OFFSET := $(LSOFF) + LC := $(LLC) + UC := $(LUC) + DL ?= 0 + TL ?= 0 + EM ?= 1 + TEST_B := mek + ifneq ($(UPPER_R),B0) + ifneq ($(UPPER_R),C0) + $(error Invalid revision) + endif + endif +endif + +#Help text +HELP += \ + "\tclean-$(LLC) : remove all build files for the i.MX8$(LUC) build\n" \ + "\t$(LLC)e : build for i.MX8$(LUC) die simulation, output in build_mx8$(LLC)\n" \ + "\tdox-api-$(LLC) : generate API docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tdox-hw-$(LLC) : generate HW docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tdox-$(LLC) : generate docs for i.MX8$(LUC) die, output in build_mx8$(LLC)\n" \ + "\tcppcheck-$(LLC) : run cppcheck to do static code analysis for i.MX8$(LUC) die\n" \ + "\tinfo-$(LLC) : display info for i.MX8$(LUC) die port\n" \ + "\texport-$(LLC) : export files for i.MX8$(LUC) die customer package\n" + diff --git a/makefiles/mx8qx/Makefile.rules b/makefiles/mx8qx/Makefile.rules new file mode 100755 index 0000000..f14f595 --- /dev/null +++ b/makefiles/mx8qx/Makefile.rules @@ -0,0 +1,144 @@ + +# Local settings +LLC := qx + +# Build rules + +ifeq ($(Z),1) + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex $(OUT)/scfw_tests.hex + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +$(LLC)m4 : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw.hex $(OUT)/scfw_tcm.hex + @echo "done." + +endif + +else + +ifeq ($(LOWER_T),all) + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin $(OUT)/scfw_tests.bin + @echo "done." + +else + +$(LLC) : $(OUT)/ $(OUT)/scfw_tcm.bin + @echo "done." + +endif + +endif + +$(LLC)e : $(OUT)/ $(OUT)/sc + @echo "done." + +gcov-$(LLC) : $(GCOV_OUT) + $(AT)-mkdir $(OUT)/gcov + $(AT)-mv *.gcov $(OUT)/gcov + @echo "done." + +clean-$(LLC) : scrub + $(AT)-rm -rf $(OUT)/ + +clean-obj-$(LLC) : + $(AT)xargs -a bin/pkit_keep -I % rm -rf $(OUT)/%/ + $(AT)-rm -f $(OUT)/scfw*.* + +dox-api-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) API $(SRC)/main/rpc.h $(DOX_SOC) $(DOX_API) doc/protocol.md $(SRC)/config/$(CONFIG)/pads.h + $(DOXYGEN) doc/dox/api.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_api_$(LC)_$(LOWER_R).tar.gz sc_fw_api_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_api_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)sed -i -f doc/dox/refman.sed $(OUT)/docs/latex/refman.tex + $(AT)cd $(OUT)/docs/latex && $(MAKE) + $(AT)-mkdir -p $(DOC)/pdf + $(AT)cp $(OUT)/docs/latex/refman.pdf $(DOC)/pdf/sc_fw_api_$(LC)_$(LOWER_R).pdf + +dox-hw-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_SOC) + $(AT)sed -i -f doc/dox/clocks.sed doc/clocks.md + $(DOXYGEN) doc/dox/hw.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_hw_$(LC)_$(LOWER_R).tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/html + $(AT)-mkdir -p $(DOC)/xml + $(AT)mv $(OUT)/docs/xml $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/xml/sc_fw_hw_$(LC)_$(LOWER_R).xml.tar.gz sc_fw_hw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_hw_$(LC)_$(LOWER_R) $(OUT)/docs/xml + +dox-$(LLC) : clean $(OUT)/ ${INFH} ${CONFIGH} ${RPCH} ${RPCC} ${MD} doc/protocol.md $(SRC)/main/rpc.h + $(AT)perl bin/perl/addendum_cfg.pl doc/dox/addendum.cfg $(DOX_OUT) $(PROJ) $(UPPER_R) $(SRC)/main/rpc.h $(DOX_ADD) doc/protocol.md + $(DOXYGEN) doc/dox/full.cfg + $(AT)rm -f doc/dox/addendum.cfg + $(AT)-mkdir -p $(DOC)/html + $(AT)mv $(OUT)/docs/html $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) + $(AT)tar --directory=$(OUT)/docs -czf $(DOC)/html/sc_fw_$(LC)_$(LOWER_R).tar.gz sc_fw_$(LC)_$(LOWER_R) + $(AT)mv $(OUT)/docs/sc_fw_$(LC)_$(LOWER_R) $(OUT)/docs/html + +cppcheck-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --error-exitcode=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus --enable=warning,performance,style --inline-suppr --suppress=unreadVariable --suppress=unusedStructMember --suppress=redundantAssignment --template='{file}:{line}: ({id}) {message}' -i$(SRC)/test -i$(SRC)/CMSIS -i$(SRC)/drivers/common -i$(SRC)/drivers/lpi2c -i$(SRC)/drivers/lpuart -i$(SRC)/drivers/wdog32 -I$(SRC) $(SRC) 2>&1 | tee -a log.txt + +cppcheck-dump-$(LLC) : $(LLC)e + $(AT)$(CPPCHECK) --dump --max-configs=1 -q -j 4 --std=c99 -UDSC_VERIFICATION -UNO_DEVICE_ACCESS -USIMU -UDOX -UDOXYGEN -U__cplusplus -i$(SRC)/test -i$(SRC)/CMSIS -I$(SRC) $(SRC) + +obj-$(LLC) : $(LLC) + $(AT)$(OBJDUMP) -h $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .data $(OUT)/scfw.elf + $(AT)$(OBJDUMP) -t -j .bss $(OUT)/scfw.elf + +info-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h + $(AT)perl bin/perl/pll_info.pl $(SRC)/config/$(CONFIG)/soc.h $(SS) + +memmap-$(LLC) : $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt + $(AT)perl bin/perl/memmap.pl $(SRC)/config/$(CONFIG)/soc.h $(SRC)/devices/$(DEVICE)/memmap.txt $(SS) + +export-$(LLC) : clean qx $(TPROTOH) $(EOBJS) + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp -f doc/EULA.txt scfw_export_$(CONFIG)_$(LOWER_R)/COPYING + $(AT)cp -f doc/SCR-imx-scfw-porting-kit.txt scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)cp bin/dcd.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/retention.sed scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)cp bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/bin + $(AT)mkdir -p scfw_export_$(CONFIG)_$(LOWER_R)/platform + $(AT)cp -f Makefile scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)sed -i -f bin/export.sed scfw_export_$(CONFIG)_$(LOWER_R)/Makefile + $(AT)cp -rf $(OUT) scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/scfw*.* + $(AT)xargs -a bin/pkit_keep -I % rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/$(OUT)/% + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R) -name "*.d" -type f -delete + $(AT)find platform -name "*.h" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.bom" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "*.ld" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find platform -name "Makefile" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find makefiles -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.c" -type f -exec md5sum {} + > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)xargs -a bin/pkit_keep -I % find platform/% -name "*.h" -type f -exec md5sum {} + >> scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)grep -v platform/board/ scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST > scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)-sort -k 2 scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp -o scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/MANIFEST.tmp + $(AT)find makefiles -name "*" -type f -exec cp --parents -ft scfw_export_$(CONFIG)_$(LOWER_R) {} + + $(AT)find scfw_export_$(CONFIG)_$(LOWER_R)/platform/board -name "*dcd*.h" -type f -exec rm {} + + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/dox + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/export + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/full + $(AT)rm -f scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/$(CONFIG)/*.full + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.config + $(AT)mv scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules.unused scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules + $(AT)perl bin/perl/makefile_rules2.pl bin/pkit_keep scfw_export_$(CONFIG)_$(LOWER_R)/makefiles/obj/Makefile.rules2 + $(AT)tar --exclude=*.bak -czf ../scfw_export_$(CONFIG)_$(LOWER_R).tar.gz scfw_export_$(CONFIG)_$(LOWER_R) + $(AT)rm -rf scfw_export_$(CONFIG)_$(LOWER_R) + diff --git a/makefiles/obj/Makefile.config b/makefiles/obj/Makefile.config new file mode 100755 index 0000000..8b13789 --- /dev/null +++ b/makefiles/obj/Makefile.config @@ -0,0 +1 @@ + diff --git a/makefiles/obj/Makefile.rules b/makefiles/obj/Makefile.rules new file mode 100755 index 0000000..efec6cd --- /dev/null +++ b/makefiles/obj/Makefile.rules @@ -0,0 +1,26 @@ + +# Build rules + +clean : + $(AT)-rm -f log.txt + $(AT)${MAKE} --no-print-directory clean-obj-qm R=B0 + $(AT)${MAKE} --no-print-directory clean-obj-qx R=B0 + $(AT)${MAKE} --no-print-directory clean-obj-qx R=C0 + $(AT)${MAKE} --no-print-directory clean-obj-dxl R=A0 + +scrub : + $(AT)-rm -f sc_fw.tar.gz + $(AT)-rm -f scfw_export_*.tar.gz + $(AT)-rm -f out.txt + $(AT)-rm -f *.stackdump + $(AT)-rm -f doc/resources.md + $(AT)-rm -f doc/clocks.md + $(AT)-rm -f doc/controls.md + $(AT)-rm -f doc/pad.md + $(AT)-rm -f doc/memmap.md + $(AT)-rm -f doc/protocol.md + $(AT)-find platform/board -name *dcd*.h -exec rm {} \; + $(AT)-find platform/board -name *_retention.h -exec rm {} \; + $(AT)-find platform/board -name *_parser.h -exec rm {} \; + $(AT)-find platform -name *.dump -exec rm {} \; + diff --git a/makefiles/obj/Makefile.rules2 b/makefiles/obj/Makefile.rules2 new file mode 100644 index 0000000..d47d8c2 --- /dev/null +++ b/makefiles/obj/Makefile.rules2 @@ -0,0 +1,15 @@ + +# Pkit build rules + +$(OUT)/board/%.o : $(SRC)/board/%.c ${INCH} ${INFH} ${CONFIGH} ${BIH} ${DCDH} + @echo "Compiling $<" + $(AT)${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@ + +$(OUT)/drivers/pmic/%.o : $(SRC)/drivers/pmic/%.c ${INCH} ${INFH} ${CONFIGH} ${BIH} ${DCDH} + @echo "Compiling $<" + $(AT)${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@ + +$(OUT)/svc/%.o : $(SRC)/svc/%.c ${INCH} ${INFH} ${CONFIGH} ${BIH} ${DCDH} + @echo "Compiling $<" + $(AT)${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@ + diff --git a/platform/CMSIS/Include/Core_A/cmsis_armcc.h b/platform/CMSIS/Include/Core_A/cmsis_armcc.h new file mode 100755 index 0000000..7c4c948 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_armcc.h @@ -0,0 +1,544 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if (defined (__TARGET_ARCH_7_A ) && (__TARGET_ARCH_7_A == 1)) + #define __ARM_ARCH_7A__ 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __forceinline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP __nop + +/** + \brief Wait For Interrupt + */ +#define __WFI __wfi + +/** + \brief Wait For Event + */ +#define __WFE __wfe + +/** + \brief Send Event + */ +#define __SEV __sev + +/** + \brief Instruction Synchronization Barrier + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + +/** + \brief Rotate Right in unsigned value (32 bit) + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + +/** + \brief Reverse bit order of value + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + +/* ########################### Core Function Access ########################### */ + +/** + \brief Get FPSCR (Floating Point Status/Control) + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + +/** + \brief Set FPSCR (Floating Point Status/Control) + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + +/** \brief Get CPSR (Current Program Status Register) + \return CPSR Register value + */ +__STATIC_INLINE uint32_t __get_CPSR(void) +{ + register uint32_t __regCPSR __ASM("cpsr"); + return(__regCPSR); +} + + +/** \brief Set CPSR (Current Program Status Register) + \param [in] cpsr CPSR value to set + */ +__STATIC_INLINE void __set_CPSR(uint32_t cpsr) +{ + register uint32_t __regCPSR __ASM("cpsr"); + __regCPSR = cpsr; +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_INLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_INLINE __ASM void __set_mode(uint32_t mode) +{ + MOV r1, lr + MSR CPSR_C, r0 + BX r1 +} + +/** \brief Get Stack Pointer + \return Stack Pointer + */ +__STATIC_INLINE __ASM uint32_t __get_SP(void) +{ + MOV r0, sp + BX lr +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_INLINE __ASM void __set_SP(uint32_t stack) +{ + MOV sp, r0 + BX lr +} + + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYSStack Pointer + */ +__STATIC_INLINE __ASM uint32_t __get_SP_usr(void) +{ + ARM + PRESERVE8 + + MRS R1, CPSR + CPS #0x1F ;no effect in USR mode + MOV R0, SP + MSR CPSR_c, R1 ;no effect in USR mode + ISB + BX LR +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_INLINE __ASM void __set_SP_usr(uint32_t topOfProcStack) +{ + ARM + PRESERVE8 + + MRS R1, CPSR + CPS #0x1F ;no effect in USR mode + MOV SP, R0 + MSR CPSR_c, R1 ;no effect in USR mode + ISB + BX LR +} + +/** \brief Get FPEXC (Floating Point Exception Control Register) + \return Floating Point Exception Control Register value + */ +__STATIC_INLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpexc __ASM("fpexc"); + return(__regfpexc); +#else + return(0); +#endif +} + +/** \brief Set FPEXC (Floating Point Exception Control Register) + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_INLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpexc __ASM("fpexc"); + __regfpexc = (fpexc); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) do { register uint32_t tmp __ASM("cp" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2); (Rt) = tmp; } while(0) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) do { register uint32_t tmp __ASM("cp" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2); tmp = (Rt); } while(0) +#define __get_CP64(cp, op1, Rt, CRm) \ + do { \ + uint32_t ltmp, htmp; \ + __ASM volatile("MRRC p" # cp ", " # op1 ", ltmp, htmp, c" # CRm); \ + (Rt) = ((((uint64_t)htmp) << 32U) | ((uint64_t)ltmp)); \ + } while(0) + +#define __set_CP64(cp, op1, Rt, CRm) \ + do { \ + const uint64_t tmp = (Rt); \ + const uint32_t ltmp = (uint32_t)(tmp); \ + const uint32_t htmp = (uint32_t)(tmp >> 32U); \ + __ASM volatile("MCRR p" # cp ", " # op1 ", ltmp, htmp, c" # CRm); \ + } while(0) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE __ASM void __FPU_Enable(void) +{ + ARM + + //Permit access to VFP/NEON, registers by modifying CPACR + MRC p15,0,R1,c1,c0,2 + ORR R1,R1,#0x00F00000 + MCR p15,0,R1,c1,c0,2 + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + ISB + + //Enable VFP/NEON + VMRS R1,FPEXC + ORR R1,R1,#0x40000000 + VMSR FPEXC,R1 + + //Initialise VFP/NEON registers to 0 + MOV R2,#0 + + //Initialise D16 registers to 0 + VMOV D0, R2,R2 + VMOV D1, R2,R2 + VMOV D2, R2,R2 + VMOV D3, R2,R2 + VMOV D4, R2,R2 + VMOV D5, R2,R2 + VMOV D6, R2,R2 + VMOV D7, R2,R2 + VMOV D8, R2,R2 + VMOV D9, R2,R2 + VMOV D10,R2,R2 + VMOV D11,R2,R2 + VMOV D12,R2,R2 + VMOV D13,R2,R2 + VMOV D14,R2,R2 + VMOV D15,R2,R2 + + IF {TARGET_FEATURE_EXTENSION_REGISTER_COUNT} == 32 + //Initialise D32 registers to 0 + VMOV D16,R2,R2 + VMOV D17,R2,R2 + VMOV D18,R2,R2 + VMOV D19,R2,R2 + VMOV D20,R2,R2 + VMOV D21,R2,R2 + VMOV D22,R2,R2 + VMOV D23,R2,R2 + VMOV D24,R2,R2 + VMOV D25,R2,R2 + VMOV D26,R2,R2 + VMOV D27,R2,R2 + VMOV D28,R2,R2 + VMOV D29,R2,R2 + VMOV D30,R2,R2 + VMOV D31,R2,R2 + ENDIF + + //Initialise FPSCR to a known state + VMRS R2,FPSCR + LDR R3,=0x00086060 //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + AND R2,R2,R3 + VMSR FPSCR,R2 + + BX LR +} + +#endif /* __CMSIS_ARMCC_H */ diff --git a/platform/CMSIS/Include/Core_A/cmsis_armclang.h b/platform/CMSIS/Include/Core_A/cmsis_armclang.h new file mode 100755 index 0000000..5883364 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_armclang.h @@ -0,0 +1,503 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __attribute__((always_inline)) +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + */ +#define __WFI __builtin_arm_wfi + +/** + \brief Wait For Event + */ +#define __WFE __builtin_arm_wfe + +/** + \brief Send Event + */ +#define __SEV __builtin_arm_sev + +/** + \brief Instruction Synchronization Barrier + */ +#define __ISB() do {\ + __schedule_barrier();\ + __builtin_arm_isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + */ +#define __DSB() do {\ + __schedule_barrier();\ + __builtin_arm_dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + */ +#define __DMB() do {\ + __schedule_barrier();\ + __builtin_arm_dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + +/** + \brief Reverse bit order of value + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/* ########################### Core Function Access ########################### */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#define __get_FPSCR __builtin_arm_get_fpscr + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#define __set_FPSCR __builtin_arm_set_fpscr + +/** \brief Get CPSR Register + \return CPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPSR(void) +{ + uint32_t result; + __ASM volatile("MRS %0, cpsr" : "=r" (result) ); + return(result); +} + +/** \brief Set CPSR Register + \param [in] cpsr CPSR value to set + */ +__STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr) +{ +__ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory"); +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_FORCEINLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_FORCEINLINE void __set_mode(uint32_t mode) +{ + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); +} + +/** \brief Get Stack Pointer + \return Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP() +{ + uint32_t result; + __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory"); + return result; +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP(uint32_t stack) +{ + __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory"); +} + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYS Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP_usr() +{ + uint32_t cpsr; + uint32_t result; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV %1, sp \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr), "=r"(result) : "r"(cpsr) : "memory" + ); + return result; +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV sp, %1 \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr) : "r" (topOfProcStack), "r"(cpsr) : "memory" + ); +} + +/** \brief Get FPEXC + \return Floating Point Exception Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory"); + return(result); +#else + return(0); +#endif +} + +/** \brief Set FPEXC + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) +#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) +#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#if __ARM_NEON == 1 + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " LDR R3,=0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 " + ); +} + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/platform/CMSIS/Include/Core_A/cmsis_compiler.h b/platform/CMSIS/Include/Core_A/cmsis_compiler.h new file mode 100755 index 0000000..b00c6ba --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_compiler.h @@ -0,0 +1,201 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include "cmsis_iccarm.h" + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef CMSIS_DEPRECATED + #warning No compiler specific solution for CMSIS_DEPRECATED. CMSIS_DEPRECATED is ignored. + #define CMSIS_DEPRECATED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __UNALIGNED_UINT32 + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/platform/CMSIS/Include/Core_A/cmsis_cp15.h b/platform/CMSIS/Include/Core_A/cmsis_cp15.h new file mode 100755 index 0000000..891bec2 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_cp15.h @@ -0,0 +1,514 @@ +/**************************************************************************//** + * @file cmsis_cp15.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.1 + * @date 07. Sep 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_CP15_H +#define __CMSIS_CP15_H + +/** \brief Get ACTLR + \return Auxiliary Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_ACTLR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 1); + return(result); +} + +/** \brief Set ACTLR + \param [in] actlr Auxiliary Control value to set + */ +__STATIC_FORCEINLINE void __set_ACTLR(uint32_t actlr) +{ + __set_CP(15, 0, actlr, 1, 0, 1); +} + +/** \brief Get CPACR + \return Coprocessor Access Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPACR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 2); + return result; +} + +/** \brief Set CPACR + \param [in] cpacr Coprocessor Access Control value to set + */ +__STATIC_FORCEINLINE void __set_CPACR(uint32_t cpacr) +{ + __set_CP(15, 0, cpacr, 1, 0, 2); +} + +/** \brief Get DFSR + \return Data Fault Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_DFSR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 5, 0, 0); + return result; +} + +/** \brief Set DFSR + \param [in] dfsr Data Fault Status value to set + */ +__STATIC_FORCEINLINE void __set_DFSR(uint32_t dfsr) +{ + __set_CP(15, 0, dfsr, 5, 0, 0); +} + +/** \brief Get IFSR + \return Instruction Fault Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IFSR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 5, 0, 1); + return result; +} + +/** \brief Set IFSR + \param [in] ifsr Instruction Fault Status value to set + */ +__STATIC_FORCEINLINE void __set_IFSR(uint32_t ifsr) +{ + __set_CP(15, 0, ifsr, 5, 0, 1); +} + +/** \brief Get ISR + \return Interrupt Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_ISR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 1, 0); + return result; +} + +/** \brief Get CBAR + \return Configuration Base Address register value + */ +__STATIC_FORCEINLINE uint32_t __get_CBAR(void) +{ + uint32_t result; + __get_CP(15, 4, result, 15, 0, 0); + return result; +} + +/** \brief Get TTBR0 + + This function returns the value of the Translation Table Base Register 0. + + \return Translation Table Base Register 0 value + */ +__STATIC_FORCEINLINE uint32_t __get_TTBR0(void) +{ + uint32_t result; + __get_CP(15, 0, result, 2, 0, 0); + return result; +} + +/** \brief Set TTBR0 + + This function assigns the given value to the Translation Table Base Register 0. + + \param [in] ttbr0 Translation Table Base Register 0 value to set + */ +__STATIC_FORCEINLINE void __set_TTBR0(uint32_t ttbr0) +{ + __set_CP(15, 0, ttbr0, 2, 0, 0); +} + +/** \brief Get DACR + + This function returns the value of the Domain Access Control Register. + + \return Domain Access Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_DACR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 3, 0, 0); + return result; +} + +/** \brief Set DACR + + This function assigns the given value to the Domain Access Control Register. + + \param [in] dacr Domain Access Control Register value to set + */ +__STATIC_FORCEINLINE void __set_DACR(uint32_t dacr) +{ + __set_CP(15, 0, dacr, 3, 0, 0); +} + +/** \brief Set SCTLR + + This function assigns the given value to the System Control Register. + + \param [in] sctlr System Control Register value to set + */ +__STATIC_FORCEINLINE void __set_SCTLR(uint32_t sctlr) +{ + __set_CP(15, 0, sctlr, 1, 0, 0); +} + +/** \brief Get SCTLR + \return System Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_SCTLR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 0); + return result; +} + +/** \brief Set ACTRL + \param [in] actrl Auxiliary Control Register value to set + */ +__STATIC_FORCEINLINE void __set_ACTRL(uint32_t actrl) +{ + __set_CP(15, 0, actrl, 1, 0, 1); +} + +/** \brief Get ACTRL + \return Auxiliary Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_ACTRL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 1); + return result; +} + +/** \brief Get MPIDR + + This function returns the value of the Multiprocessor Affinity Register. + + \return Multiprocessor Affinity Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MPIDR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 0, 0, 5); + return result; +} + +/** \brief Get VBAR + + This function returns the value of the Vector Base Address Register. + + \return Vector Base Address Register + */ +__STATIC_FORCEINLINE uint32_t __get_VBAR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 0, 0); + return result; +} + +/** \brief Set VBAR + + This function assigns the given value to the Vector Base Address Register. + + \param [in] vbar Vector Base Address Register value to set + */ +__STATIC_FORCEINLINE void __set_VBAR(uint32_t vbar) +{ + __set_CP(15, 0, vbar, 12, 0, 0); +} + +/** \brief Get MVBAR + + This function returns the value of the Monitor Vector Base Address Register. + + \return Monitor Vector Base Address Register + */ +__STATIC_FORCEINLINE uint32_t __get_MVBAR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 0, 1); + return result; +} + +/** \brief Set MVBAR + + This function assigns the given value to the Monitor Vector Base Address Register. + + \param [in] mvbar Monitor Vector Base Address Register value to set + */ +__STATIC_FORCEINLINE void __set_MVBAR(uint32_t mvbar) +{ + __set_CP(15, 0, mvbar, 12, 0, 1); +} + +#if (defined(__CORTEX_A) && (__CORTEX_A == 7U) && \ + defined(__TIM_PRESENT) && (__TIM_PRESENT == 1U)) || \ + defined(DOXYGEN) + +/** \brief Set CNTFRQ + + This function assigns the given value to PL1 Physical Timer Counter Frequency Register (CNTFRQ). + + \param [in] value CNTFRQ Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTFRQ(uint32_t value) +{ + __set_CP(15, 0, value, 14, 0, 0); +} + +/** \brief Get CNTFRQ + + This function returns the value of the PL1 Physical Timer Counter Frequency Register (CNTFRQ). + + \return CNTFRQ Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTFRQ(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 0 , 0); + return result; +} + +/** \brief Set CNTP_TVAL + + This function assigns the given value to PL1 Physical Timer Value Register (CNTP_TVAL). + + \param [in] value CNTP_TVAL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_TVAL(uint32_t value) +{ + __set_CP(15, 0, value, 14, 2, 0); +} + +/** \brief Get CNTP_TVAL + + This function returns the value of the PL1 Physical Timer Value Register (CNTP_TVAL). + + \return CNTP_TVAL Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTP_TVAL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 2, 0); + return result; +} + +/** \brief Get CNTPCT + + This function returns the value of the 64 bits PL1 Physical Count Register (CNTPCT). + + \return CNTPCT Register value + */ +__STATIC_FORCEINLINE uint64_t __get_CNTPCT(void) +{ + uint64_t result; + __get_CP64(15, 0, result, 14); + return result; +} + +/** \brief Set CNTP_CVAL + + This function assigns the given value to 64bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + + \param [in] value CNTP_CVAL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_CVAL(uint64_t value) +{ + __set_CP64(15, 2, value, 14); +} + +/** \brief Get CNTP_CVAL + + This function returns the value of the 64 bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + + \return CNTP_CVAL Register value + */ +__STATIC_FORCEINLINE uint64_t __get_CNTP_CVAL(void) +{ + uint64_t result; + __get_CP64(15, 2, result, 14); + return result; +} + +/** \brief Set CNTP_CTL + + This function assigns the given value to PL1 Physical Timer Control Register (CNTP_CTL). + + \param [in] value CNTP_CTL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_CTL(uint32_t value) +{ + __set_CP(15, 0, value, 14, 2, 1); +} + +/** \brief Get CNTP_CTL register + \return CNTP_CTL Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTP_CTL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 2, 1); + return result; +} + +#endif + +/** \brief Set TLBIALL + + TLB Invalidate All + */ +__STATIC_FORCEINLINE void __set_TLBIALL(uint32_t value) +{ + __set_CP(15, 0, value, 8, 7, 0); +} + +/** \brief Set BPIALL. + + Branch Predictor Invalidate All + */ +__STATIC_FORCEINLINE void __set_BPIALL(uint32_t value) +{ + __set_CP(15, 0, value, 7, 5, 6); +} + +/** \brief Set ICIALLU + + Instruction Cache Invalidate All + */ +__STATIC_FORCEINLINE void __set_ICIALLU(uint32_t value) +{ + __set_CP(15, 0, value, 7, 5, 0); +} + +/** \brief Set DCCMVAC + + Data cache clean + */ +__STATIC_FORCEINLINE void __set_DCCMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 10, 1); +} + +/** \brief Set DCIMVAC + + Data cache invalidate + */ +__STATIC_FORCEINLINE void __set_DCIMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 6, 1); +} + +/** \brief Set DCCIMVAC + + Data cache clean and invalidate + */ +__STATIC_FORCEINLINE void __set_DCCIMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 14, 1); +} + +/** \brief Set CSSELR + */ +__STATIC_FORCEINLINE void __set_CSSELR(uint32_t value) +{ +// __ASM volatile("MCR p15, 2, %0, c0, c0, 0" : : "r"(value) : "memory"); + __set_CP(15, 2, value, 0, 0, 0); +} + +/** \brief Get CSSELR + \return CSSELR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CSSELR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 2, %0, c0, c0, 0" : "=r"(result) : : "memory"); + __get_CP(15, 2, result, 0, 0, 0); + return result; +} + +/** \brief Set CCSIDR + \deprecated CCSIDR itself is read-only. Use __set_CSSELR to select cache level instead. + */ +CMSIS_DEPRECATED +__STATIC_FORCEINLINE void __set_CCSIDR(uint32_t value) +{ + __set_CSSELR(value); +} + +/** \brief Get CCSIDR + \return CCSIDR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CCSIDR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 1, %0, c0, c0, 0" : "=r"(result) : : "memory"); + __get_CP(15, 1, result, 0, 0, 0); + return result; +} + +/** \brief Get CLIDR + \return CLIDR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CLIDR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 1, %0, c0, c0, 1" : "=r"(result) : : "memory"); + __get_CP(15, 1, result, 0, 0, 1); + return result; +} + +/** \brief Set DCISW + */ +__STATIC_FORCEINLINE void __set_DCISW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c6, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 6, 2); +} + +/** \brief Set DCCSW + */ +__STATIC_FORCEINLINE void __set_DCCSW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c10, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 10, 2); +} + +/** \brief Set DCCISW + */ +__STATIC_FORCEINLINE void __set_DCCISW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c14, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 14, 2); +} + +#endif diff --git a/platform/CMSIS/Include/Core_A/cmsis_gcc.h b/platform/CMSIS/Include/Core_A/cmsis_gcc.h new file mode 100755 index 0000000..5ac93d1 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_gcc.h @@ -0,0 +1,675 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.1 + * @date 07. Sep 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __attribute__((always_inline)) +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + */ +#define __WFI() __ASM volatile ("wfi") + +/** + \brief Wait For Event + */ +#define __WFE() __ASM volatile ("wfe") + +/** + \brief Send Event + */ +#define __SEV() __ASM volatile ("sev") + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + __ASM volatile("rev16 %0, %1" : "=r" (result) : "r" (value)); + return result; +} +#endif + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +/* ########################### Core Function Access ########################### */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value +*/ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #if __has_builtin(__builtin_arm_get_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); + #else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); + #endif + #else + return(0U); + #endif +} + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set +*/ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #if __has_builtin(__builtin_arm_set_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); + #else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + #endif + #else + (void)fpscr; + #endif +} + +/** \brief Get CPSR Register + \return CPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPSR(void) +{ + uint32_t result; + __ASM volatile("MRS %0, cpsr" : "=r" (result) ); + return(result); +} + +/** \brief Set CPSR Register + \param [in] cpsr CPSR value to set + */ +__STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr) +{ +__ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory"); +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_FORCEINLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_FORCEINLINE void __set_mode(uint32_t mode) +{ + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); +} + +/** \brief Get Stack Pointer + \return Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP(void) +{ + uint32_t result; + __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory"); + return result; +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP(uint32_t stack) +{ + __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory"); +} + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYS Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP_usr(void) +{ + uint32_t cpsr = __get_CPSR(); + uint32_t result; + __ASM volatile( + "CPS #0x1F \n" + "MOV %0, sp " : "=r"(result) : : "memory" + ); + __set_CPSR(cpsr); + __ISB(); + return result; +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr = __get_CPSR(); + __ASM volatile( + "CPS #0x1F \n" + "MOV sp, %0 " : : "r" (topOfProcStack) : "memory" + ); + __set_CPSR(cpsr); + __ISB(); +} + +/** \brief Get FPEXC + \return Floating Point Exception Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + +/** \brief Set FPEXC + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) +#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) +#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#if (defined(__ARM_NEON) && (__ARM_NEON == 1)) + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " LDR R3,=0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 " + ); +} + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/platform/CMSIS/Include/Core_A/cmsis_iccarm.h b/platform/CMSIS/Include/Core_A/cmsis_iccarm.h new file mode 100755 index 0000000..a441e2d --- /dev/null +++ b/platform/CMSIS/Include/Core_A/cmsis_iccarm.h @@ -0,0 +1,559 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.5 + * @date 10. January 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#pragma language=extended + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_7A__ +/* Macro already defined */ +#else + #if defined(__ARM7A__) + #define __ARM_ARCH_7A__ 1 + #endif +#endif + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif + +#ifndef __UNALIGNED_UINT16_READ + #pragma language=save + #pragma language=extended + __IAR_FT uint16_t __iar_uint16_read(void const *ptr) + { + return *(__packed uint16_t*)(ptr); + } + #pragma language=restore + #define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE + #pragma language=save + #pragma language=extended + __IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) + { + *(__packed uint16_t*)(ptr) = val;; + } + #pragma language=restore + #define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ + #pragma language=save + #pragma language=extended + __IAR_FT uint32_t __iar_uint32_read(void const *ptr) + { + return *(__packed uint32_t*)(ptr); + } + #pragma language=restore + #define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE + #pragma language=save + #pragma language=extended + __IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) + { + *(__packed uint32_t*)(ptr) = val;; + } + #pragma language=restore + #define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#if 0 +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma language=save + #pragma language=extended + __packed struct __iar_u32 { uint32_t v; }; + #pragma language=restore + #define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __enable_irq __iar_builtin_enable_interrupt + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + #if __FPU_PRESENT + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #else + #define __get_FPSCR() ( 0 ) + #endif + + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", VALUE)) + + #define __get_CPSR() (__arm_rsr("CPSR")) + #define __get_mode() (__get_CPSR() & 0x1FU) + + #define __set_CPSR(VALUE) (__arm_wsr("CPSR", (VALUE))) + #define __set_mode(VALUE) (__arm_wsr("CPSR_c", (VALUE))) + + + #define __get_FPEXC() (__arm_rsr("FPEXC")) + #define __set_FPEXC(VALUE) (__arm_wsr("FPEXC", VALUE)) + + #define __get_CP(cp, op1, RT, CRn, CRm, op2) \ + ((RT) = __arm_rsr("p" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2)) + + #define __set_CP(cp, op1, RT, CRn, CRm, op2) \ + (__arm_wsr("p" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2, (RT))) + + #define __get_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) + + #define __set_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + + #include "cmsis_cp15.h" + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #define __SSAT __iar_builtin_SSAT + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #define __USAT __iar_builtin_USAT + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if !__FPU_PRESENT + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if !__FPU_PRESENT + #define __get_FPSCR() (0) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + __IAR_FT void __set_mode(uint32_t mode) + { + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); + } + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + __IAR_FT uint32_t __get_FPEXC(void) + { + #if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory"); + return(result); + #else + return(0); + #endif + } + + __IAR_FT void __set_FPEXC(uint32_t fpexc) + { + #if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); + #endif + } + + + #define __get_CP(cp, op1, Rt, CRn, CRm, op2) \ + __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) + #define __set_CP(cp, op1, Rt, CRn, CRm, op2) \ + __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) + #define __get_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) + #define __set_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + + #include "cmsis_cp15.h" + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + + +__IAR_FT uint32_t __get_SP_usr(void) +{ + uint32_t cpsr; + uint32_t result; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV %1, sp \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr), "=r"(result) : "r"(cpsr) : "memory" + ); + return result; +} + +__IAR_FT void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV sp, %1 \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr) : "r" (topOfProcStack), "r"(cpsr) : "memory" + ); +} + +#define __get_mode() (__get_CPSR() & 0x1FU) + +__STATIC_INLINE +void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#ifdef __ARM_ADVANCED_SIMD__ + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " MOV32 R3,#0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 \n"); +} + + + +#undef __IAR_FT +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/platform/CMSIS/Include/Core_A/core_ca.h b/platform/CMSIS/Include/Core_A/core_ca.h new file mode 100755 index 0000000..c7c4b51 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/core_ca.h @@ -0,0 +1,2616 @@ +/**************************************************************************//** + * @file core_ca.h + * @brief CMSIS Cortex-A Core Peripheral Access Layer Header File + * @version V1.00 + * @date 22. Feb 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CA_H_GENERIC +#define __CORE_CA_H_GENERIC + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ + +/* CMSIS CA definitions */ +#define __CA_CMSIS_VERSION_MAIN (1U) /*!< \brief [31:16] CMSIS-Core(A) main version */ +#define __CA_CMSIS_VERSION_SUB (1U) /*!< \brief [15:0] CMSIS-Core(A) sub version */ +#define __CA_CMSIS_VERSION ((__CA_CMSIS_VERSION_MAIN << 16U) | \ + __CA_CMSIS_VERSION_SUB ) /*!< \brief CMSIS-Core(A) version number */ + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TMS470__ ) + #if defined __TI_VFP_SUPPORT__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CA_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CA_H_DEPENDANT +#define __CORE_CA_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + + /* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CA_REV + #define __CA_REV 0x0000U + #warning "__CA_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __GIC_PRESENT + #define __GIC_PRESENT 1U + #warning "__GIC_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __TIM_PRESENT + #define __TIM_PRESENT 1U + #warning "__TIM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __L2C_PRESENT + #define __L2C_PRESENT 0U + #warning "__L2C_PRESENT not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +#ifdef __cplusplus + #define __I volatile /*!< \brief Defines 'read only' permissions */ +#else + #define __I volatile const /*!< \brief Defines 'read only' permissions */ +#endif +#define __O volatile /*!< \brief Defines 'write only' permissions */ +#define __IO volatile /*!< \brief Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*!< \brief Defines 'read only' structure member permissions */ +#define __OM volatile /*!< \brief Defines 'write only' structure member permissions */ +#define __IOM volatile /*!< \brief Defines 'read / write' structure member permissions */ +#define RESERVED(N, T) T RESERVED##N; // placeholder struct members used for "reserved" areas + + /******************************************************************************* + * Register Abstraction + Core Register contain: + - CPSR + - CP15 Registers + - L2C-310 Cache Controller + - Generic Interrupt Controller Distributor + - Generic Interrupt Controller Interface + ******************************************************************************/ + +/* Core Register CPSR */ +typedef union +{ + struct + { + uint32_t M:5; /*!< \brief bit: 0.. 4 Mode field */ + uint32_t T:1; /*!< \brief bit: 5 Thumb execution state bit */ + uint32_t F:1; /*!< \brief bit: 6 FIQ mask bit */ + uint32_t I:1; /*!< \brief bit: 7 IRQ mask bit */ + uint32_t A:1; /*!< \brief bit: 8 Asynchronous abort mask bit */ + uint32_t E:1; /*!< \brief bit: 9 Endianness execution state bit */ + uint32_t IT1:6; /*!< \brief bit: 10..15 If-Then execution state bits 2-7 */ + uint32_t GE:4; /*!< \brief bit: 16..19 Greater than or Equal flags */ + RESERVED(0:4, uint32_t) + uint32_t J:1; /*!< \brief bit: 24 Jazelle bit */ + uint32_t IT0:2; /*!< \brief bit: 25..26 If-Then execution state bits 0-1 */ + uint32_t Q:1; /*!< \brief bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< \brief bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< \brief bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< \brief bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< \brief bit: 31 Negative condition code flag */ + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CPSR_Type; + + + +/* CPSR Register Definitions */ +#define CPSR_N_Pos 31U /*!< \brief CPSR: N Position */ +#define CPSR_N_Msk (1UL << CPSR_N_Pos) /*!< \brief CPSR: N Mask */ + +#define CPSR_Z_Pos 30U /*!< \brief CPSR: Z Position */ +#define CPSR_Z_Msk (1UL << CPSR_Z_Pos) /*!< \brief CPSR: Z Mask */ + +#define CPSR_C_Pos 29U /*!< \brief CPSR: C Position */ +#define CPSR_C_Msk (1UL << CPSR_C_Pos) /*!< \brief CPSR: C Mask */ + +#define CPSR_V_Pos 28U /*!< \brief CPSR: V Position */ +#define CPSR_V_Msk (1UL << CPSR_V_Pos) /*!< \brief CPSR: V Mask */ + +#define CPSR_Q_Pos 27U /*!< \brief CPSR: Q Position */ +#define CPSR_Q_Msk (1UL << CPSR_Q_Pos) /*!< \brief CPSR: Q Mask */ + +#define CPSR_IT0_Pos 25U /*!< \brief CPSR: IT0 Position */ +#define CPSR_IT0_Msk (3UL << CPSR_IT0_Pos) /*!< \brief CPSR: IT0 Mask */ + +#define CPSR_J_Pos 24U /*!< \brief CPSR: J Position */ +#define CPSR_J_Msk (1UL << CPSR_J_Pos) /*!< \brief CPSR: J Mask */ + +#define CPSR_GE_Pos 16U /*!< \brief CPSR: GE Position */ +#define CPSR_GE_Msk (0xFUL << CPSR_GE_Pos) /*!< \brief CPSR: GE Mask */ + +#define CPSR_IT1_Pos 10U /*!< \brief CPSR: IT1 Position */ +#define CPSR_IT1_Msk (0x3FUL << CPSR_IT1_Pos) /*!< \brief CPSR: IT1 Mask */ + +#define CPSR_E_Pos 9U /*!< \brief CPSR: E Position */ +#define CPSR_E_Msk (1UL << CPSR_E_Pos) /*!< \brief CPSR: E Mask */ + +#define CPSR_A_Pos 8U /*!< \brief CPSR: A Position */ +#define CPSR_A_Msk (1UL << CPSR_A_Pos) /*!< \brief CPSR: A Mask */ + +#define CPSR_I_Pos 7U /*!< \brief CPSR: I Position */ +#define CPSR_I_Msk (1UL << CPSR_I_Pos) /*!< \brief CPSR: I Mask */ + +#define CPSR_F_Pos 6U /*!< \brief CPSR: F Position */ +#define CPSR_F_Msk (1UL << CPSR_F_Pos) /*!< \brief CPSR: F Mask */ + +#define CPSR_T_Pos 5U /*!< \brief CPSR: T Position */ +#define CPSR_T_Msk (1UL << CPSR_T_Pos) /*!< \brief CPSR: T Mask */ + +#define CPSR_M_Pos 0U /*!< \brief CPSR: M Position */ +#define CPSR_M_Msk (0x1FUL << CPSR_M_Pos) /*!< \brief CPSR: M Mask */ + +#define CPSR_M_USR 0x10U /*!< \brief CPSR: M User mode (PL0) */ +#define CPSR_M_FIQ 0x11U /*!< \brief CPSR: M Fast Interrupt mode (PL1) */ +#define CPSR_M_IRQ 0x12U /*!< \brief CPSR: M Interrupt mode (PL1) */ +#define CPSR_M_SVC 0x13U /*!< \brief CPSR: M Supervisor mode (PL1) */ +#define CPSR_M_MON 0x16U /*!< \brief CPSR: M Monitor mode (PL1) */ +#define CPSR_M_ABT 0x17U /*!< \brief CPSR: M Abort mode (PL1) */ +#define CPSR_M_HYP 0x1AU /*!< \brief CPSR: M Hypervisor mode (PL2) */ +#define CPSR_M_UND 0x1BU /*!< \brief CPSR: M Undefined mode (PL1) */ +#define CPSR_M_SYS 0x1FU /*!< \brief CPSR: M System mode (PL1) */ + +/* CP15 Register SCTLR */ +typedef union +{ + struct + { + uint32_t M:1; /*!< \brief bit: 0 MMU enable */ + uint32_t A:1; /*!< \brief bit: 1 Alignment check enable */ + uint32_t C:1; /*!< \brief bit: 2 Cache enable */ + RESERVED(0:2, uint32_t) + uint32_t CP15BEN:1; /*!< \brief bit: 5 CP15 barrier enable */ + RESERVED(1:1, uint32_t) + uint32_t B:1; /*!< \brief bit: 7 Endianness model */ + RESERVED(2:2, uint32_t) + uint32_t SW:1; /*!< \brief bit: 10 SWP and SWPB enable */ + uint32_t Z:1; /*!< \brief bit: 11 Branch prediction enable */ + uint32_t I:1; /*!< \brief bit: 12 Instruction cache enable */ + uint32_t V:1; /*!< \brief bit: 13 Vectors bit */ + uint32_t RR:1; /*!< \brief bit: 14 Round Robin select */ + RESERVED(3:2, uint32_t) + uint32_t HA:1; /*!< \brief bit: 17 Hardware Access flag enable */ + RESERVED(4:1, uint32_t) + uint32_t WXN:1; /*!< \brief bit: 19 Write permission implies XN */ + uint32_t UWXN:1; /*!< \brief bit: 20 Unprivileged write permission implies PL1 XN */ + uint32_t FI:1; /*!< \brief bit: 21 Fast interrupts configuration enable */ + uint32_t U:1; /*!< \brief bit: 22 Alignment model */ + RESERVED(5:1, uint32_t) + uint32_t VE:1; /*!< \brief bit: 24 Interrupt Vectors Enable */ + uint32_t EE:1; /*!< \brief bit: 25 Exception Endianness */ + RESERVED(6:1, uint32_t) + uint32_t NMFI:1; /*!< \brief bit: 27 Non-maskable FIQ (NMFI) support */ + uint32_t TRE:1; /*!< \brief bit: 28 TEX remap enable. */ + uint32_t AFE:1; /*!< \brief bit: 29 Access flag enable */ + uint32_t TE:1; /*!< \brief bit: 30 Thumb Exception enable */ + RESERVED(7:1, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} SCTLR_Type; + +#define SCTLR_TE_Pos 30U /*!< \brief SCTLR: TE Position */ +#define SCTLR_TE_Msk (1UL << SCTLR_TE_Pos) /*!< \brief SCTLR: TE Mask */ + +#define SCTLR_AFE_Pos 29U /*!< \brief SCTLR: AFE Position */ +#define SCTLR_AFE_Msk (1UL << SCTLR_AFE_Pos) /*!< \brief SCTLR: AFE Mask */ + +#define SCTLR_TRE_Pos 28U /*!< \brief SCTLR: TRE Position */ +#define SCTLR_TRE_Msk (1UL << SCTLR_TRE_Pos) /*!< \brief SCTLR: TRE Mask */ + +#define SCTLR_NMFI_Pos 27U /*!< \brief SCTLR: NMFI Position */ +#define SCTLR_NMFI_Msk (1UL << SCTLR_NMFI_Pos) /*!< \brief SCTLR: NMFI Mask */ + +#define SCTLR_EE_Pos 25U /*!< \brief SCTLR: EE Position */ +#define SCTLR_EE_Msk (1UL << SCTLR_EE_Pos) /*!< \brief SCTLR: EE Mask */ + +#define SCTLR_VE_Pos 24U /*!< \brief SCTLR: VE Position */ +#define SCTLR_VE_Msk (1UL << SCTLR_VE_Pos) /*!< \brief SCTLR: VE Mask */ + +#define SCTLR_U_Pos 22U /*!< \brief SCTLR: U Position */ +#define SCTLR_U_Msk (1UL << SCTLR_U_Pos) /*!< \brief SCTLR: U Mask */ + +#define SCTLR_FI_Pos 21U /*!< \brief SCTLR: FI Position */ +#define SCTLR_FI_Msk (1UL << SCTLR_FI_Pos) /*!< \brief SCTLR: FI Mask */ + +#define SCTLR_UWXN_Pos 20U /*!< \brief SCTLR: UWXN Position */ +#define SCTLR_UWXN_Msk (1UL << SCTLR_UWXN_Pos) /*!< \brief SCTLR: UWXN Mask */ + +#define SCTLR_WXN_Pos 19U /*!< \brief SCTLR: WXN Position */ +#define SCTLR_WXN_Msk (1UL << SCTLR_WXN_Pos) /*!< \brief SCTLR: WXN Mask */ + +#define SCTLR_HA_Pos 17U /*!< \brief SCTLR: HA Position */ +#define SCTLR_HA_Msk (1UL << SCTLR_HA_Pos) /*!< \brief SCTLR: HA Mask */ + +#define SCTLR_RR_Pos 14U /*!< \brief SCTLR: RR Position */ +#define SCTLR_RR_Msk (1UL << SCTLR_RR_Pos) /*!< \brief SCTLR: RR Mask */ + +#define SCTLR_V_Pos 13U /*!< \brief SCTLR: V Position */ +#define SCTLR_V_Msk (1UL << SCTLR_V_Pos) /*!< \brief SCTLR: V Mask */ + +#define SCTLR_I_Pos 12U /*!< \brief SCTLR: I Position */ +#define SCTLR_I_Msk (1UL << SCTLR_I_Pos) /*!< \brief SCTLR: I Mask */ + +#define SCTLR_Z_Pos 11U /*!< \brief SCTLR: Z Position */ +#define SCTLR_Z_Msk (1UL << SCTLR_Z_Pos) /*!< \brief SCTLR: Z Mask */ + +#define SCTLR_SW_Pos 10U /*!< \brief SCTLR: SW Position */ +#define SCTLR_SW_Msk (1UL << SCTLR_SW_Pos) /*!< \brief SCTLR: SW Mask */ + +#define SCTLR_B_Pos 7U /*!< \brief SCTLR: B Position */ +#define SCTLR_B_Msk (1UL << SCTLR_B_Pos) /*!< \brief SCTLR: B Mask */ + +#define SCTLR_CP15BEN_Pos 5U /*!< \brief SCTLR: CP15BEN Position */ +#define SCTLR_CP15BEN_Msk (1UL << SCTLR_CP15BEN_Pos) /*!< \brief SCTLR: CP15BEN Mask */ + +#define SCTLR_C_Pos 2U /*!< \brief SCTLR: C Position */ +#define SCTLR_C_Msk (1UL << SCTLR_C_Pos) /*!< \brief SCTLR: C Mask */ + +#define SCTLR_A_Pos 1U /*!< \brief SCTLR: A Position */ +#define SCTLR_A_Msk (1UL << SCTLR_A_Pos) /*!< \brief SCTLR: A Mask */ + +#define SCTLR_M_Pos 0U /*!< \brief SCTLR: M Position */ +#define SCTLR_M_Msk (1UL << SCTLR_M_Pos) /*!< \brief SCTLR: M Mask */ + +/* CP15 Register ACTLR */ +typedef union +{ +#if __CORTEX_A == 5 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A5 */ + struct + { + uint32_t FW:1; /*!< \brief bit: 0 Cache and TLB maintenance broadcast */ + RESERVED(0:5, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + uint32_t EXCL:1; /*!< \brief bit: 7 Exclusive L1/L2 cache control */ + RESERVED(1:2, uint32_t) + uint32_t DODMBS:1; /*!< \brief bit: 10 Disable optimized data memory barrier behavior */ + uint32_t DWBST:1; /*!< \brief bit: 11 AXI data write bursts to Normal memory */ + uint32_t RADIS:1; /*!< \brief bit: 12 L1 Data Cache read-allocate mode disable */ + uint32_t L1PCTL:2; /*!< \brief bit:13..14 L1 Data prefetch control */ + uint32_t BP:2; /*!< \brief bit:16..15 Branch prediction policy */ + uint32_t RSDIS:1; /*!< \brief bit: 17 Disable return stack operation */ + uint32_t BTDIS:1; /*!< \brief bit: 18 Disable indirect Branch Target Address Cache (BTAC) */ + RESERVED(3:9, uint32_t) + uint32_t DBDI:1; /*!< \brief bit: 28 Disable branch dual issue */ + RESERVED(7:3, uint32_t) + } b; +#endif +#if __CORTEX_A == 7 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A7 */ + struct + { + RESERVED(0:6, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + RESERVED(1:3, uint32_t) + uint32_t DODMBS:1; /*!< \brief bit: 10 Disable optimized data memory barrier behavior */ + uint32_t L2RADIS:1; /*!< \brief bit: 11 L2 Data Cache read-allocate mode disable */ + uint32_t L1RADIS:1; /*!< \brief bit: 12 L1 Data Cache read-allocate mode disable */ + uint32_t L1PCTL:2; /*!< \brief bit:13..14 L1 Data prefetch control */ + uint32_t DDVM:1; /*!< \brief bit: 15 Disable Distributed Virtual Memory (DVM) transactions */ + RESERVED(3:12, uint32_t) + uint32_t DDI:1; /*!< \brief bit: 28 Disable dual issue */ + RESERVED(7:3, uint32_t) + } b; +#endif +#if __CORTEX_A == 9 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A9 */ + struct + { + uint32_t FW:1; /*!< \brief bit: 0 Cache and TLB maintenance broadcast */ + RESERVED(0:1, uint32_t) + uint32_t L1PE:1; /*!< \brief bit: 2 Dside prefetch */ + uint32_t WFLZM:1; /*!< \brief bit: 3 Cache and TLB maintenance broadcast */ + RESERVED(1:2, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + uint32_t EXCL:1; /*!< \brief bit: 7 Exclusive L1/L2 cache control */ + uint32_t AOW:1; /*!< \brief bit: 8 Enable allocation in one cache way only */ + uint32_t PARITY:1; /*!< \brief bit: 9 Support for parity checking, if implemented */ + RESERVED(7:22, uint32_t) + } b; +#endif + uint32_t w; /*!< \brief Type used for word access */ +} ACTLR_Type; + +#define ACTLR_DDI_Pos 28U /*!< \brief ACTLR: DDI Position */ +#define ACTLR_DDI_Msk (1UL << ACTLR_DDI_Pos) /*!< \brief ACTLR: DDI Mask */ + +#define ACTLR_DBDI_Pos 28U /*!< \brief ACTLR: DBDI Position */ +#define ACTLR_DBDI_Msk (1UL << ACTLR_DBDI_Pos) /*!< \brief ACTLR: DBDI Mask */ + +#define ACTLR_BTDIS_Pos 18U /*!< \brief ACTLR: BTDIS Position */ +#define ACTLR_BTDIS_Msk (1UL << ACTLR_BTDIS_Pos) /*!< \brief ACTLR: BTDIS Mask */ + +#define ACTLR_RSDIS_Pos 17U /*!< \brief ACTLR: RSDIS Position */ +#define ACTLR_RSDIS_Msk (1UL << ACTLR_RSDIS_Pos) /*!< \brief ACTLR: RSDIS Mask */ + +#define ACTLR_BP_Pos 15U /*!< \brief ACTLR: BP Position */ +#define ACTLR_BP_Msk (3UL << ACTLR_BP_Pos) /*!< \brief ACTLR: BP Mask */ + +#define ACTLR_DDVM_Pos 15U /*!< \brief ACTLR: DDVM Position */ +#define ACTLR_DDVM_Msk (1UL << ACTLR_DDVM_Pos) /*!< \brief ACTLR: DDVM Mask */ + +#define ACTLR_L1PCTL_Pos 13U /*!< \brief ACTLR: L1PCTL Position */ +#define ACTLR_L1PCTL_Msk (3UL << ACTLR_L1PCTL_Pos) /*!< \brief ACTLR: L1PCTL Mask */ + +#define ACTLR_RADIS_Pos 12U /*!< \brief ACTLR: RADIS Position */ +#define ACTLR_RADIS_Msk (1UL << ACTLR_RADIS_Pos) /*!< \brief ACTLR: RADIS Mask */ + +#define ACTLR_L1RADIS_Pos 12U /*!< \brief ACTLR: L1RADIS Position */ +#define ACTLR_L1RADIS_Msk (1UL << ACTLR_L1RADIS_Pos) /*!< \brief ACTLR: L1RADIS Mask */ + +#define ACTLR_DWBST_Pos 11U /*!< \brief ACTLR: DWBST Position */ +#define ACTLR_DWBST_Msk (1UL << ACTLR_DWBST_Pos) /*!< \brief ACTLR: DWBST Mask */ + +#define ACTLR_L2RADIS_Pos 11U /*!< \brief ACTLR: L2RADIS Position */ +#define ACTLR_L2RADIS_Msk (1UL << ACTLR_L2RADIS_Pos) /*!< \brief ACTLR: L2RADIS Mask */ + +#define ACTLR_DODMBS_Pos 10U /*!< \brief ACTLR: DODMBS Position */ +#define ACTLR_DODMBS_Msk (1UL << ACTLR_DODMBS_Pos) /*!< \brief ACTLR: DODMBS Mask */ + +#define ACTLR_PARITY_Pos 9U /*!< \brief ACTLR: PARITY Position */ +#define ACTLR_PARITY_Msk (1UL << ACTLR_PARITY_Pos) /*!< \brief ACTLR: PARITY Mask */ + +#define ACTLR_AOW_Pos 8U /*!< \brief ACTLR: AOW Position */ +#define ACTLR_AOW_Msk (1UL << ACTLR_AOW_Pos) /*!< \brief ACTLR: AOW Mask */ + +#define ACTLR_EXCL_Pos 7U /*!< \brief ACTLR: EXCL Position */ +#define ACTLR_EXCL_Msk (1UL << ACTLR_EXCL_Pos) /*!< \brief ACTLR: EXCL Mask */ + +#define ACTLR_SMP_Pos 6U /*!< \brief ACTLR: SMP Position */ +#define ACTLR_SMP_Msk (1UL << ACTLR_SMP_Pos) /*!< \brief ACTLR: SMP Mask */ + +#define ACTLR_WFLZM_Pos 3U /*!< \brief ACTLR: WFLZM Position */ +#define ACTLR_WFLZM_Msk (1UL << ACTLR_WFLZM_Pos) /*!< \brief ACTLR: WFLZM Mask */ + +#define ACTLR_L1PE_Pos 2U /*!< \brief ACTLR: L1PE Position */ +#define ACTLR_L1PE_Msk (1UL << ACTLR_L1PE_Pos) /*!< \brief ACTLR: L1PE Mask */ + +#define ACTLR_FW_Pos 0U /*!< \brief ACTLR: FW Position */ +#define ACTLR_FW_Msk (1UL << ACTLR_FW_Pos) /*!< \brief ACTLR: FW Mask */ + +/* CP15 Register CPACR */ +typedef union +{ + struct + { + uint32_t CP0:2; /*!< \brief bit: 0..1 Access rights for coprocessor 0 */ + uint32_t CP1:2; /*!< \brief bit: 2..3 Access rights for coprocessor 1 */ + uint32_t CP2:2; /*!< \brief bit: 4..5 Access rights for coprocessor 2 */ + uint32_t CP3:2; /*!< \brief bit: 6..7 Access rights for coprocessor 3 */ + uint32_t CP4:2; /*!< \brief bit: 8..9 Access rights for coprocessor 4 */ + uint32_t CP5:2; /*!< \brief bit:10..11 Access rights for coprocessor 5 */ + uint32_t CP6:2; /*!< \brief bit:12..13 Access rights for coprocessor 6 */ + uint32_t CP7:2; /*!< \brief bit:14..15 Access rights for coprocessor 7 */ + uint32_t CP8:2; /*!< \brief bit:16..17 Access rights for coprocessor 8 */ + uint32_t CP9:2; /*!< \brief bit:18..19 Access rights for coprocessor 9 */ + uint32_t CP10:2; /*!< \brief bit:20..21 Access rights for coprocessor 10 */ + uint32_t CP11:2; /*!< \brief bit:22..23 Access rights for coprocessor 11 */ + uint32_t CP12:2; /*!< \brief bit:24..25 Access rights for coprocessor 11 */ + uint32_t CP13:2; /*!< \brief bit:26..27 Access rights for coprocessor 11 */ + uint32_t TRCDIS:1; /*!< \brief bit: 28 Disable CP14 access to trace registers */ + RESERVED(0:1, uint32_t) + uint32_t D32DIS:1; /*!< \brief bit: 30 Disable use of registers D16-D31 of the VFP register file */ + uint32_t ASEDIS:1; /*!< \brief bit: 31 Disable Advanced SIMD Functionality */ + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CPACR_Type; + +#define CPACR_ASEDIS_Pos 31U /*!< \brief CPACR: ASEDIS Position */ +#define CPACR_ASEDIS_Msk (1UL << CPACR_ASEDIS_Pos) /*!< \brief CPACR: ASEDIS Mask */ + +#define CPACR_D32DIS_Pos 30U /*!< \brief CPACR: D32DIS Position */ +#define CPACR_D32DIS_Msk (1UL << CPACR_D32DIS_Pos) /*!< \brief CPACR: D32DIS Mask */ + +#define CPACR_TRCDIS_Pos 28U /*!< \brief CPACR: D32DIS Position */ +#define CPACR_TRCDIS_Msk (1UL << CPACR_D32DIS_Pos) /*!< \brief CPACR: D32DIS Mask */ + +#define CPACR_CP_Pos_(n) (n*2U) /*!< \brief CPACR: CPn Position */ +#define CPACR_CP_Msk_(n) (3UL << CPACR_CP_Pos_(n)) /*!< \brief CPACR: CPn Mask */ + +#define CPACR_CP_NA 0U /*!< \brief CPACR CPn field: Access denied. */ +#define CPACR_CP_PL1 1U /*!< \brief CPACR CPn field: Accessible from PL1 only. */ +#define CPACR_CP_FA 3U /*!< \brief CPACR CPn field: Full access. */ + +/* CP15 Register DFSR */ +typedef union +{ + struct + { + uint32_t FS0:4; /*!< \brief bit: 0.. 3 Fault Status bits bit 0-3 */ + uint32_t Domain:4; /*!< \brief bit: 4.. 7 Fault on which domain */ + RESERVED(0:1, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + uint32_t FS1:1; /*!< \brief bit: 10 Fault Status bits bit 4 */ + uint32_t WnR:1; /*!< \brief bit: 11 Write not Read bit */ + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + uint32_t CM:1; /*!< \brief bit: 13 Cache maintenance fault */ + RESERVED(1:18, uint32_t) + } s; /*!< \brief Structure used for bit access in short format */ + struct + { + uint32_t STATUS:5; /*!< \brief bit: 0.. 5 Fault Status bits */ + RESERVED(0:3, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + RESERVED(1:1, uint32_t) + uint32_t WnR:1; /*!< \brief bit: 11 Write not Read bit */ + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + uint32_t CM:1; /*!< \brief bit: 13 Cache maintenance fault */ + RESERVED(2:18, uint32_t) + } l; /*!< \brief Structure used for bit access in long format */ + uint32_t w; /*!< \brief Type used for word access */ +} DFSR_Type; + +#define DFSR_CM_Pos 13U /*!< \brief DFSR: CM Position */ +#define DFSR_CM_Msk (1UL << DFSR_CM_Pos) /*!< \brief DFSR: CM Mask */ + +#define DFSR_Ext_Pos 12U /*!< \brief DFSR: Ext Position */ +#define DFSR_Ext_Msk (1UL << DFSR_Ext_Pos) /*!< \brief DFSR: Ext Mask */ + +#define DFSR_WnR_Pos 11U /*!< \brief DFSR: WnR Position */ +#define DFSR_WnR_Msk (1UL << DFSR_WnR_Pos) /*!< \brief DFSR: WnR Mask */ + +#define DFSR_FS1_Pos 10U /*!< \brief DFSR: FS1 Position */ +#define DFSR_FS1_Msk (1UL << DFSR_FS1_Pos) /*!< \brief DFSR: FS1 Mask */ + +#define DFSR_LPAE_Pos 9U /*!< \brief DFSR: LPAE Position */ +#define DFSR_LPAE_Msk (1UL << DFSR_LPAE_Pos) /*!< \brief DFSR: LPAE Mask */ + +#define DFSR_Domain_Pos 4U /*!< \brief DFSR: Domain Position */ +#define DFSR_Domain_Msk (0xFUL << DFSR_Domain_Pos) /*!< \brief DFSR: Domain Mask */ + +#define DFSR_FS0_Pos 0U /*!< \brief DFSR: FS0 Position */ +#define DFSR_FS0_Msk (0xFUL << DFSR_FS0_Pos) /*!< \brief DFSR: FS0 Mask */ + +#define DFSR_STATUS_Pos 0U /*!< \brief DFSR: STATUS Position */ +#define DFSR_STATUS_Msk (0x3FUL << DFSR_STATUS_Pos) /*!< \brief DFSR: STATUS Mask */ + +/* CP15 Register IFSR */ +typedef union +{ + struct + { + uint32_t FS0:4; /*!< \brief bit: 0.. 3 Fault Status bits bit 0-3 */ + RESERVED(0:5, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + uint32_t FS1:1; /*!< \brief bit: 10 Fault Status bits bit 4 */ + RESERVED(1:1, uint32_t) + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + RESERVED(2:19, uint32_t) + } s; /*!< \brief Structure used for bit access in short format */ + struct + { + uint32_t STATUS:6; /*!< \brief bit: 0.. 5 Fault Status bits */ + RESERVED(0:3, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + RESERVED(1:2, uint32_t) + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + RESERVED(2:19, uint32_t) + } l; /*!< \brief Structure used for bit access in long format */ + uint32_t w; /*!< \brief Type used for word access */ +} IFSR_Type; + +#define IFSR_ExT_Pos 12U /*!< \brief IFSR: ExT Position */ +#define IFSR_ExT_Msk (1UL << IFSR_ExT_Pos) /*!< \brief IFSR: ExT Mask */ + +#define IFSR_FS1_Pos 10U /*!< \brief IFSR: FS1 Position */ +#define IFSR_FS1_Msk (1UL << IFSR_FS1_Pos) /*!< \brief IFSR: FS1 Mask */ + +#define IFSR_LPAE_Pos 9U /*!< \brief IFSR: LPAE Position */ +#define IFSR_LPAE_Msk (0x1UL << IFSR_LPAE_Pos) /*!< \brief IFSR: LPAE Mask */ + +#define IFSR_FS0_Pos 0U /*!< \brief IFSR: FS0 Position */ +#define IFSR_FS0_Msk (0xFUL << IFSR_FS0_Pos) /*!< \brief IFSR: FS0 Mask */ + +#define IFSR_STATUS_Pos 0U /*!< \brief IFSR: STATUS Position */ +#define IFSR_STATUS_Msk (0x3FUL << IFSR_STATUS_Pos) /*!< \brief IFSR: STATUS Mask */ + +/* CP15 Register ISR */ +typedef union +{ + struct + { + RESERVED(0:6, uint32_t) + uint32_t F:1; /*!< \brief bit: 6 FIQ pending bit */ + uint32_t I:1; /*!< \brief bit: 7 IRQ pending bit */ + uint32_t A:1; /*!< \brief bit: 8 External abort pending bit */ + RESERVED(1:23, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} ISR_Type; + +#define ISR_A_Pos 13U /*!< \brief ISR: A Position */ +#define ISR_A_Msk (1UL << ISR_A_Pos) /*!< \brief ISR: A Mask */ + +#define ISR_I_Pos 12U /*!< \brief ISR: I Position */ +#define ISR_I_Msk (1UL << ISR_I_Pos) /*!< \brief ISR: I Mask */ + +#define ISR_F_Pos 11U /*!< \brief ISR: F Position */ +#define ISR_F_Msk (1UL << ISR_F_Pos) /*!< \brief ISR: F Mask */ + +/* DACR Register */ +#define DACR_D_Pos_(n) (2U*n) /*!< \brief DACR: Dn Position */ +#define DACR_D_Msk_(n) (3UL << DACR_D_Pos_(n)) /*!< \brief DACR: Dn Mask */ +#define DACR_Dn_NOACCESS 0U /*!< \brief DACR Dn field: No access */ +#define DACR_Dn_CLIENT 1U /*!< \brief DACR Dn field: Client */ +#define DACR_Dn_MANAGER 3U /*!< \brief DACR Dn field: Manager */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param [in] field Name of the register bit field. + \param [in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param [in] field Name of the register bit field. + \param [in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + + +/** + \brief Union type to access the L2C_310 Cache Controller. +*/ +#if (__L2C_PRESENT == 1U) || defined(DOXYGEN) +typedef struct +{ + __IM uint32_t CACHE_ID; /*!< \brief Offset: 0x0000 (R/ ) Cache ID Register */ + __IM uint32_t CACHE_TYPE; /*!< \brief Offset: 0x0004 (R/ ) Cache Type Register */ + RESERVED(0[0x3e], uint32_t) + __IOM uint32_t CONTROL; /*!< \brief Offset: 0x0100 (R/W) Control Register */ + __IOM uint32_t AUX_CNT; /*!< \brief Offset: 0x0104 (R/W) Auxiliary Control */ + RESERVED(1[0x3e], uint32_t) + __IOM uint32_t EVENT_CONTROL; /*!< \brief Offset: 0x0200 (R/W) Event Counter Control */ + __IOM uint32_t EVENT_COUNTER1_CONF; /*!< \brief Offset: 0x0204 (R/W) Event Counter 1 Configuration */ + __IOM uint32_t EVENT_COUNTER0_CONF; /*!< \brief Offset: 0x0208 (R/W) Event Counter 1 Configuration */ + RESERVED(2[0x2], uint32_t) + __IOM uint32_t INTERRUPT_MASK; /*!< \brief Offset: 0x0214 (R/W) Interrupt Mask */ + __IM uint32_t MASKED_INT_STATUS; /*!< \brief Offset: 0x0218 (R/ ) Masked Interrupt Status */ + __IM uint32_t RAW_INT_STATUS; /*!< \brief Offset: 0x021c (R/ ) Raw Interrupt Status */ + __OM uint32_t INTERRUPT_CLEAR; /*!< \brief Offset: 0x0220 ( /W) Interrupt Clear */ + RESERVED(3[0x143], uint32_t) + __IOM uint32_t CACHE_SYNC; /*!< \brief Offset: 0x0730 (R/W) Cache Sync */ + RESERVED(4[0xf], uint32_t) + __IOM uint32_t INV_LINE_PA; /*!< \brief Offset: 0x0770 (R/W) Invalidate Line By PA */ + RESERVED(6[2], uint32_t) + __IOM uint32_t INV_WAY; /*!< \brief Offset: 0x077c (R/W) Invalidate by Way */ + RESERVED(5[0xc], uint32_t) + __IOM uint32_t CLEAN_LINE_PA; /*!< \brief Offset: 0x07b0 (R/W) Clean Line by PA */ + RESERVED(7[1], uint32_t) + __IOM uint32_t CLEAN_LINE_INDEX_WAY; /*!< \brief Offset: 0x07b8 (R/W) Clean Line by Index/Way */ + __IOM uint32_t CLEAN_WAY; /*!< \brief Offset: 0x07bc (R/W) Clean by Way */ + RESERVED(8[0xc], uint32_t) + __IOM uint32_t CLEAN_INV_LINE_PA; /*!< \brief Offset: 0x07f0 (R/W) Clean and Invalidate Line by PA */ + RESERVED(9[1], uint32_t) + __IOM uint32_t CLEAN_INV_LINE_INDEX_WAY; /*!< \brief Offset: 0x07f8 (R/W) Clean and Invalidate Line by Index/Way */ + __IOM uint32_t CLEAN_INV_WAY; /*!< \brief Offset: 0x07fc (R/W) Clean and Invalidate by Way */ + RESERVED(10[0x40], uint32_t) + __IOM uint32_t DATA_LOCK_0_WAY; /*!< \brief Offset: 0x0900 (R/W) Data Lockdown 0 by Way */ + __IOM uint32_t INST_LOCK_0_WAY; /*!< \brief Offset: 0x0904 (R/W) Instruction Lockdown 0 by Way */ + __IOM uint32_t DATA_LOCK_1_WAY; /*!< \brief Offset: 0x0908 (R/W) Data Lockdown 1 by Way */ + __IOM uint32_t INST_LOCK_1_WAY; /*!< \brief Offset: 0x090c (R/W) Instruction Lockdown 1 by Way */ + __IOM uint32_t DATA_LOCK_2_WAY; /*!< \brief Offset: 0x0910 (R/W) Data Lockdown 2 by Way */ + __IOM uint32_t INST_LOCK_2_WAY; /*!< \brief Offset: 0x0914 (R/W) Instruction Lockdown 2 by Way */ + __IOM uint32_t DATA_LOCK_3_WAY; /*!< \brief Offset: 0x0918 (R/W) Data Lockdown 3 by Way */ + __IOM uint32_t INST_LOCK_3_WAY; /*!< \brief Offset: 0x091c (R/W) Instruction Lockdown 3 by Way */ + __IOM uint32_t DATA_LOCK_4_WAY; /*!< \brief Offset: 0x0920 (R/W) Data Lockdown 4 by Way */ + __IOM uint32_t INST_LOCK_4_WAY; /*!< \brief Offset: 0x0924 (R/W) Instruction Lockdown 4 by Way */ + __IOM uint32_t DATA_LOCK_5_WAY; /*!< \brief Offset: 0x0928 (R/W) Data Lockdown 5 by Way */ + __IOM uint32_t INST_LOCK_5_WAY; /*!< \brief Offset: 0x092c (R/W) Instruction Lockdown 5 by Way */ + __IOM uint32_t DATA_LOCK_6_WAY; /*!< \brief Offset: 0x0930 (R/W) Data Lockdown 5 by Way */ + __IOM uint32_t INST_LOCK_6_WAY; /*!< \brief Offset: 0x0934 (R/W) Instruction Lockdown 5 by Way */ + __IOM uint32_t DATA_LOCK_7_WAY; /*!< \brief Offset: 0x0938 (R/W) Data Lockdown 6 by Way */ + __IOM uint32_t INST_LOCK_7_WAY; /*!< \brief Offset: 0x093c (R/W) Instruction Lockdown 6 by Way */ + RESERVED(11[0x4], uint32_t) + __IOM uint32_t LOCK_LINE_EN; /*!< \brief Offset: 0x0950 (R/W) Lockdown by Line Enable */ + __IOM uint32_t UNLOCK_ALL_BY_WAY; /*!< \brief Offset: 0x0954 (R/W) Unlock All Lines by Way */ + RESERVED(12[0xaa], uint32_t) + __IOM uint32_t ADDRESS_FILTER_START; /*!< \brief Offset: 0x0c00 (R/W) Address Filtering Start */ + __IOM uint32_t ADDRESS_FILTER_END; /*!< \brief Offset: 0x0c04 (R/W) Address Filtering End */ + RESERVED(13[0xce], uint32_t) + __IOM uint32_t DEBUG_CONTROL; /*!< \brief Offset: 0x0f40 (R/W) Debug Control Register */ +} L2C_310_TypeDef; + +#define L2C_310 ((L2C_310_TypeDef *)L2C_310_BASE) /*!< \brief L2C_310 register set access pointer */ +#endif + +#if (__GIC_PRESENT == 1U) || defined(DOXYGEN) + +/** \brief Structure type to access the Generic Interrupt Controller Distributor (GICD) +*/ +typedef struct +{ + __IOM uint32_t CTLR; /*!< \brief Offset: 0x000 (R/W) Distributor Control Register */ + __IM uint32_t TYPER; /*!< \brief Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IM uint32_t IIDR; /*!< \brief Offset: 0x008 (R/ ) Distributor Implementer Identification Register */ + RESERVED(0, uint32_t) + __IOM uint32_t STATUSR; /*!< \brief Offset: 0x010 (R/W) Error Reporting Status Register, optional */ + RESERVED(1[11], uint32_t) + __OM uint32_t SETSPI_NSR; /*!< \brief Offset: 0x040 ( /W) Set SPI Register */ + RESERVED(2, uint32_t) + __OM uint32_t CLRSPI_NSR; /*!< \brief Offset: 0x048 ( /W) Clear SPI Register */ + RESERVED(3, uint32_t) + __OM uint32_t SETSPI_SR; /*!< \brief Offset: 0x050 ( /W) Set SPI, Secure Register */ + RESERVED(4, uint32_t) + __OM uint32_t CLRSPI_SR; /*!< \brief Offset: 0x058 ( /W) Clear SPI, Secure Register */ + RESERVED(5[9], uint32_t) + __IOM uint32_t IGROUPR[32]; /*!< \brief Offset: 0x080 (R/W) Interrupt Group Registers */ + __IOM uint32_t ISENABLER[32]; /*!< \brief Offset: 0x100 (R/W) Interrupt Set-Enable Registers */ + __IOM uint32_t ICENABLER[32]; /*!< \brief Offset: 0x180 (R/W) Interrupt Clear-Enable Registers */ + __IOM uint32_t ISPENDR[32]; /*!< \brief Offset: 0x200 (R/W) Interrupt Set-Pending Registers */ + __IOM uint32_t ICPENDR[32]; /*!< \brief Offset: 0x280 (R/W) Interrupt Clear-Pending Registers */ + __IOM uint32_t ISACTIVER[32]; /*!< \brief Offset: 0x300 (R/W) Interrupt Set-Active Registers */ + __IOM uint32_t ICACTIVER[32]; /*!< \brief Offset: 0x380 (R/W) Interrupt Clear-Active Registers */ + __IOM uint32_t IPRIORITYR[255]; /*!< \brief Offset: 0x400 (R/W) Interrupt Priority Registers */ + RESERVED(6, uint32_t) + __IOM uint32_t ITARGETSR[255]; /*!< \brief Offset: 0x800 (R/W) Interrupt Targets Registers */ + RESERVED(7, uint32_t) + __IOM uint32_t ICFGR[64]; /*!< \brief Offset: 0xC00 (R/W) Interrupt Configuration Registers */ + __IOM uint32_t IGRPMODR[32]; /*!< \brief Offset: 0xD00 (R/W) Interrupt Group Modifier Registers */ + RESERVED(8[32], uint32_t) + __IOM uint32_t NSACR[64]; /*!< \brief Offset: 0xE00 (R/W) Non-secure Access Control Registers */ + __OM uint32_t SGIR; /*!< \brief Offset: 0xF00 ( /W) Software Generated Interrupt Register */ + RESERVED(9[3], uint32_t) + __IOM uint32_t CPENDSGIR[4]; /*!< \brief Offset: 0xF10 (R/W) SGI Clear-Pending Registers */ + __IOM uint32_t SPENDSGIR[4]; /*!< \brief Offset: 0xF20 (R/W) SGI Set-Pending Registers */ + RESERVED(10[5236], uint32_t) + __IOM uint64_t IROUTER[988]; /*!< \brief Offset: 0x6100(R/W) Interrupt Routing Registers */ +} GICDistributor_Type; + +#define GICDistributor ((GICDistributor_Type *) GIC_DISTRIBUTOR_BASE ) /*!< \brief GIC Distributor register set access pointer */ + +/** \brief Structure type to access the Generic Interrupt Controller Interface (GICC) +*/ +typedef struct +{ + __IOM uint32_t CTLR; /*!< \brief Offset: 0x000 (R/W) CPU Interface Control Register */ + __IOM uint32_t PMR; /*!< \brief Offset: 0x004 (R/W) Interrupt Priority Mask Register */ + __IOM uint32_t BPR; /*!< \brief Offset: 0x008 (R/W) Binary Point Register */ + __IM uint32_t IAR; /*!< \brief Offset: 0x00C (R/ ) Interrupt Acknowledge Register */ + __OM uint32_t EOIR; /*!< \brief Offset: 0x010 ( /W) End Of Interrupt Register */ + __IM uint32_t RPR; /*!< \brief Offset: 0x014 (R/ ) Running Priority Register */ + __IM uint32_t HPPIR; /*!< \brief Offset: 0x018 (R/ ) Highest Priority Pending Interrupt Register */ + __IOM uint32_t ABPR; /*!< \brief Offset: 0x01C (R/W) Aliased Binary Point Register */ + __IM uint32_t AIAR; /*!< \brief Offset: 0x020 (R/ ) Aliased Interrupt Acknowledge Register */ + __OM uint32_t AEOIR; /*!< \brief Offset: 0x024 ( /W) Aliased End Of Interrupt Register */ + __IM uint32_t AHPPIR; /*!< \brief Offset: 0x028 (R/ ) Aliased Highest Priority Pending Interrupt Register */ + __IOM uint32_t STATUSR; /*!< \brief Offset: 0x02C (R/W) Error Reporting Status Register, optional */ + RESERVED(1[40], uint32_t) + __IOM uint32_t APR[4]; /*!< \brief Offset: 0x0D0 (R/W) Active Priority Register */ + __IOM uint32_t NSAPR[4]; /*!< \brief Offset: 0x0E0 (R/W) Non-secure Active Priority Register */ + RESERVED(2[3], uint32_t) + __IM uint32_t IIDR; /*!< \brief Offset: 0x0FC (R/ ) CPU Interface Identification Register */ + RESERVED(3[960], uint32_t) + __OM uint32_t DIR; /*!< \brief Offset: 0x1000( /W) Deactivate Interrupt Register */ +} GICInterface_Type; + +#define GICInterface ((GICInterface_Type *) GIC_INTERFACE_BASE ) /*!< \brief GIC Interface register set access pointer */ +#endif + +#if (__TIM_PRESENT == 1U) || defined(DOXYGEN) +#if ((__CORTEX_A == 5U) || (__CORTEX_A == 9U)) || defined(DOXYGEN) +/** \brief Structure type to access the Private Timer +*/ +typedef struct +{ + __IOM uint32_t LOAD; //!< \brief Offset: 0x000 (R/W) Private Timer Load Register + __IOM uint32_t COUNTER; //!< \brief Offset: 0x004 (R/W) Private Timer Counter Register + __IOM uint32_t CONTROL; //!< \brief Offset: 0x008 (R/W) Private Timer Control Register + __IOM uint32_t ISR; //!< \brief Offset: 0x00C (R/W) Private Timer Interrupt Status Register + RESERVED(0[4], uint32_t) + __IOM uint32_t WLOAD; //!< \brief Offset: 0x020 (R/W) Watchdog Load Register + __IOM uint32_t WCOUNTER; //!< \brief Offset: 0x024 (R/W) Watchdog Counter Register + __IOM uint32_t WCONTROL; //!< \brief Offset: 0x028 (R/W) Watchdog Control Register + __IOM uint32_t WISR; //!< \brief Offset: 0x02C (R/W) Watchdog Interrupt Status Register + __IOM uint32_t WRESET; //!< \brief Offset: 0x030 (R/W) Watchdog Reset Status Register + __OM uint32_t WDISABLE; //!< \brief Offset: 0x034 ( /W) Watchdog Disable Register +} Timer_Type; +#define PTIM ((Timer_Type *) TIMER_BASE ) /*!< \brief Timer register struct */ +#endif +#endif + + /******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - L1 Cache Functions + - L2C-310 Cache Controller Functions + - PL1 Timer Functions + - GIC Functions + - MMU Functions + ******************************************************************************/ + +/* ########################## L1 Cache functions ################################# */ + +/** \brief Enable Caches by setting I and C bits in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_EnableCaches(void) { + __set_SCTLR( __get_SCTLR() | SCTLR_I_Msk | SCTLR_C_Msk); + __ISB(); +} + +/** \brief Disable Caches by clearing I and C bits in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_DisableCaches(void) { + __set_SCTLR( __get_SCTLR() & (~SCTLR_I_Msk) & (~SCTLR_C_Msk)); + __ISB(); +} + +/** \brief Enable Branch Prediction by setting Z bit in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_EnableBTAC(void) { + __set_SCTLR( __get_SCTLR() | SCTLR_Z_Msk); + __ISB(); +} + +/** \brief Disable Branch Prediction by clearing Z bit in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_DisableBTAC(void) { + __set_SCTLR( __get_SCTLR() & (~SCTLR_Z_Msk)); + __ISB(); +} + +/** \brief Invalidate entire branch predictor array +*/ +__STATIC_FORCEINLINE void L1C_InvalidateBTAC(void) { + __set_BPIALL(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new state +} + +/** \brief Invalidate the whole instruction cache +*/ +__STATIC_FORCEINLINE void L1C_InvalidateICacheAll(void) { + __set_ICIALLU(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new I cache state +} + +/** \brief Clean data cache line by address. +* \param [in] va Pointer to data to clear the cache for. +*/ +__STATIC_FORCEINLINE void L1C_CleanDCacheMVA(void *va) { + __set_DCCMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Invalidate data cache line by address. +* \param [in] va Pointer to data to invalidate the cache for. +*/ +__STATIC_FORCEINLINE void L1C_InvalidateDCacheMVA(void *va) { + __set_DCIMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Clean and Invalidate data cache by address. +* \param [in] va Pointer to data to invalidate the cache for. +*/ +__STATIC_FORCEINLINE void L1C_CleanInvalidateDCacheMVA(void *va) { + __set_DCCIMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Calculate log2 rounded up +* - log(0) => 0 +* - log(1) => 0 +* - log(2) => 1 +* - log(3) => 2 +* - log(4) => 2 +* - log(5) => 3 +* : : +* - log(16) => 4 +* - log(32) => 5 +* : : +* \param [in] n input value parameter +* \return log2(n) +*/ +__STATIC_FORCEINLINE uint8_t __log2_up(uint32_t n) +{ + if (n < 2U) { + return 0U; + } + uint8_t log = 0U; + uint32_t t = n; + while(t > 1U) + { + log++; + t >>= 1U; + } + if (n & 1U) { log++; } + return log; +} + +/** \brief Apply cache maintenance to given cache level. +* \param [in] level cache level to be maintained +* \param [in] maint 0 - invalidate, 1 - clean, otherwise - invalidate and clean +*/ +__STATIC_FORCEINLINE void __L1C_MaintainDCacheSetWay(uint32_t level, uint32_t maint) +{ + uint32_t Dummy; + uint32_t ccsidr; + uint32_t num_sets; + uint32_t num_ways; + uint32_t shift_way; + uint32_t log2_linesize; + int32_t log2_num_ways; + + Dummy = level << 1U; + /* set csselr, select ccsidr register */ + __set_CSSELR(Dummy); + /* get current ccsidr register */ + ccsidr = __get_CCSIDR(); + num_sets = ((ccsidr & 0x0FFFE000U) >> 13U) + 1U; + num_ways = ((ccsidr & 0x00001FF8U) >> 3U) + 1U; + log2_linesize = (ccsidr & 0x00000007U) + 2U + 2U; + log2_num_ways = __log2_up(num_ways); + if ((log2_num_ways < 0) || (log2_num_ways > 32)) { + return; // FATAL ERROR + } + shift_way = 32U - (uint32_t)log2_num_ways; + for(int32_t way = num_ways-1; way >= 0; way--) + { + for(int32_t set = num_sets-1; set >= 0; set--) + { + Dummy = (level << 1U) | (((uint32_t)set) << log2_linesize) | (((uint32_t)way) << shift_way); + switch (maint) + { + case 0U: __set_DCISW(Dummy); break; + case 1U: __set_DCCSW(Dummy); break; + default: __set_DCCISW(Dummy); break; + } + } + } + __DMB(); +} + +/** \brief Clean and Invalidate the entire data or unified cache +* Generic mechanism for cleaning/invalidating the entire data or unified cache to the point of coherency +* \param [in] op 0 - invalidate, 1 - clean, otherwise - invalidate and clean +*/ +__STATIC_FORCEINLINE void L1C_CleanInvalidateCache(uint32_t op) { + uint32_t clidr; + uint32_t cache_type; + clidr = __get_CLIDR(); + for(uint32_t i = 0U; i<7U; i++) + { + cache_type = (clidr >> i*3U) & 0x7UL; + if ((cache_type >= 2U) && (cache_type <= 4U)) + { + __L1C_MaintainDCacheSetWay(i, op); + } + } +} + +/** \brief Clean and Invalidate the entire data or unified cache +* Generic mechanism for cleaning/invalidating the entire data or unified cache to the point of coherency +* \param [in] op 0 - invalidate, 1 - clean, otherwise - invalidate and clean +* \deprecated Use generic L1C_CleanInvalidateCache instead. +*/ +CMSIS_DEPRECATED +__STATIC_FORCEINLINE void __L1C_CleanInvalidateCache(uint32_t op) { + L1C_CleanInvalidateCache(op); +} + +/** \brief Invalidate the whole data cache. +*/ +__STATIC_FORCEINLINE void L1C_InvalidateDCacheAll(void) { + L1C_CleanInvalidateCache(0); +} + +/** \brief Clean the whole data cache. + */ +__STATIC_FORCEINLINE void L1C_CleanDCacheAll(void) { + L1C_CleanInvalidateCache(1); +} + +/** \brief Clean and invalidate the whole data cache. + */ +__STATIC_FORCEINLINE void L1C_CleanInvalidateDCacheAll(void) { + L1C_CleanInvalidateCache(2); +} + +/* ########################## L2 Cache functions ################################# */ +#if (__L2C_PRESENT == 1U) || defined(DOXYGEN) +/** \brief Cache Sync operation by writing CACHE_SYNC register. +*/ +__STATIC_INLINE void L2C_Sync(void) +{ + L2C_310->CACHE_SYNC = 0x0; +} + +/** \brief Read cache controller cache ID from CACHE_ID register. + * \return L2C_310_TypeDef::CACHE_ID + */ +__STATIC_INLINE int L2C_GetID (void) +{ + return L2C_310->CACHE_ID; +} + +/** \brief Read cache controller cache type from CACHE_TYPE register. +* \return L2C_310_TypeDef::CACHE_TYPE +*/ +__STATIC_INLINE int L2C_GetType (void) +{ + return L2C_310->CACHE_TYPE; +} + +/** \brief Invalidate all cache by way +*/ +__STATIC_INLINE void L2C_InvAllByWay (void) +{ + unsigned int assoc; + + if (L2C_310->AUX_CNT & (1U << 16U)) { + assoc = 16U; + } else { + assoc = 8U; + } + + L2C_310->INV_WAY = (1U << assoc) - 1U; + while(L2C_310->INV_WAY & ((1U << assoc) - 1U)); //poll invalidate + + L2C_Sync(); +} + +/** \brief Clean and Invalidate all cache by way +*/ +__STATIC_INLINE void L2C_CleanInvAllByWay (void) +{ + unsigned int assoc; + + if (L2C_310->AUX_CNT & (1U << 16U)) { + assoc = 16U; + } else { + assoc = 8U; + } + + L2C_310->CLEAN_INV_WAY = (1U << assoc) - 1U; + while(L2C_310->CLEAN_INV_WAY & ((1U << assoc) - 1U)); //poll invalidate + + L2C_Sync(); +} + +/** \brief Enable Level 2 Cache +*/ +__STATIC_INLINE void L2C_Enable(void) +{ + L2C_310->CONTROL = 0; + L2C_310->INTERRUPT_CLEAR = 0x000001FFuL; + L2C_310->DEBUG_CONTROL = 0; + L2C_310->DATA_LOCK_0_WAY = 0; + L2C_310->CACHE_SYNC = 0; + L2C_310->CONTROL = 0x01; + L2C_Sync(); +} + +/** \brief Disable Level 2 Cache +*/ +__STATIC_INLINE void L2C_Disable(void) +{ + L2C_310->CONTROL = 0x00; + L2C_Sync(); +} + +/** \brief Invalidate cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_InvPa (void *pa) +{ + L2C_310->INV_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} + +/** \brief Clean cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_CleanPa (void *pa) +{ + L2C_310->CLEAN_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} + +/** \brief Clean and invalidate cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_CleanInvPa (void *pa) +{ + L2C_310->CLEAN_INV_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} +#endif + +/* ########################## GIC functions ###################################### */ +#if (__GIC_PRESENT == 1U) || defined(DOXYGEN) + +/** \brief Enable the interrupt distributor using the GIC's CTLR register. +*/ +__STATIC_INLINE void GIC_EnableDistributor(void) +{ + GICDistributor->CTLR |= 1U; +} + +/** \brief Disable the interrupt distributor using the GIC's CTLR register. +*/ +__STATIC_INLINE void GIC_DisableDistributor(void) +{ + GICDistributor->CTLR &=~1U; +} + +/** \brief Read the GIC's TYPER register. +* \return GICDistributor_Type::TYPER +*/ +__STATIC_INLINE uint32_t GIC_DistributorInfo(void) +{ + return (GICDistributor->TYPER); +} + +/** \brief Reads the GIC's IIDR register. +* \return GICDistributor_Type::IIDR +*/ +__STATIC_INLINE uint32_t GIC_DistributorImplementer(void) +{ + return (GICDistributor->IIDR); +} + +/** \brief Sets the GIC's ITARGETSR register for the given interrupt. +* \param [in] IRQn Interrupt to be configured. +* \param [in] cpu_target CPU interfaces to assign this interrupt to. +*/ +__STATIC_INLINE void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target) +{ + uint32_t mask = GICDistributor->ITARGETSR[IRQn / 4U] & ~(0xFFUL << ((IRQn % 4U) * 8U)); + GICDistributor->ITARGETSR[IRQn / 4U] = mask | ((cpu_target & 0xFFUL) << ((IRQn % 4U) * 8U)); +} + +/** \brief Read the GIC's ITARGETSR register. +* \param [in] IRQn Interrupt to acquire the configuration for. +* \return GICDistributor_Type::ITARGETSR +*/ +__STATIC_INLINE uint32_t GIC_GetTarget(IRQn_Type IRQn) +{ + return (GICDistributor->ITARGETSR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; +} + +/** \brief Enable the CPU's interrupt interface. +*/ +__STATIC_INLINE void GIC_EnableInterface(void) +{ + GICInterface->CTLR |= 1U; //enable interface +} + +/** \brief Disable the CPU's interrupt interface. +*/ +__STATIC_INLINE void GIC_DisableInterface(void) +{ + GICInterface->CTLR &=~1U; //disable distributor +} + +/** \brief Read the CPU's IAR register. +* \return GICInterface_Type::IAR +*/ +__STATIC_INLINE IRQn_Type GIC_AcknowledgePending(void) +{ + return (IRQn_Type)(GICInterface->IAR); +} + +/** \brief Writes the given interrupt number to the CPU's EOIR register. +* \param [in] IRQn The interrupt to be signaled as finished. +*/ +__STATIC_INLINE void GIC_EndInterrupt(IRQn_Type IRQn) +{ + GICInterface->EOIR = IRQn; +} + +/** \brief Enables the given interrupt using GIC's ISENABLER register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_EnableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ISENABLER[IRQn / 32U] = 1U << (IRQn % 32U); +} + +/** \brief Get interrupt enable status using GIC's ISENABLER register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - interrupt is not enabled, 1 - interrupt is enabled. +*/ +__STATIC_INLINE uint32_t GIC_GetEnableIRQ(IRQn_Type IRQn) +{ + return (GICDistributor->ISENABLER[IRQn / 32U] >> (IRQn % 32U)) & 1UL; +} + +/** \brief Disables the given interrupt using GIC's ICENABLER register. +* \param [in] IRQn The interrupt to be disabled. +*/ +__STATIC_INLINE void GIC_DisableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICENABLER[IRQn / 32U] = 1U << (IRQn % 32U); +} + +/** \brief Get interrupt pending status from GIC's ISPENDR register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - interrupt is not pending, 1 - interrupt is pendig. +*/ +__STATIC_INLINE uint32_t GIC_GetPendingIRQ(IRQn_Type IRQn) +{ + uint32_t pend; + + if (IRQn >= 16U) { + pend = (GICDistributor->ISPENDR[IRQn / 32U] >> (IRQn % 32U)) & 1UL; + } else { + // INTID 0-15 Software Generated Interrupt + pend = (GICDistributor->SPENDSGIR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; + // No CPU identification offered + if (pend != 0U) { + pend = 1U; + } else { + pend = 0U; + } + } + + return (pend); +} + +/** \brief Sets the given interrupt as pending using GIC's ISPENDR register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if (IRQn >= 16U) { + GICDistributor->ISPENDR[IRQn / 32U] = 1U << (IRQn % 32U); + } else { + // INTID 0-15 Software Generated Interrupt + GICDistributor->SPENDSGIR[IRQn / 4U] = 1U << ((IRQn % 4U) * 8U); + // Forward the interrupt to the CPU interface that requested it + GICDistributor->SGIR = (IRQn | 0x02000000U); + } +} + +/** \brief Clears the given interrupt from being pending using GIC's ICPENDR register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if (IRQn >= 16U) { + GICDistributor->ICPENDR[IRQn / 32U] = 1U << (IRQn % 32U); + } else { + // INTID 0-15 Software Generated Interrupt + GICDistributor->CPENDSGIR[IRQn / 4U] = 1U << ((IRQn % 4U) * 8U); + } +} + +/** \brief Sets the interrupt configuration using GIC's ICFGR register. +* \param [in] IRQn The interrupt to be configured. +* \param [in] int_config Int_config field value. Bit 0: Reserved (0 - N-N model, 1 - 1-N model for some GIC before v1) +* Bit 1: 0 - level sensitive, 1 - edge triggered +*/ +__STATIC_INLINE void GIC_SetConfiguration(IRQn_Type IRQn, uint32_t int_config) +{ + uint32_t icfgr = GICDistributor->ICFGR[IRQn / 16U]; + uint32_t shift = (IRQn % 16U) << 1U; + + icfgr &= (~(3U << shift)); + icfgr |= ( int_config << shift); + + GICDistributor->ICFGR[IRQn / 16U] = icfgr; +} + +/** \brief Get the interrupt configuration from the GIC's ICFGR register. +* \param [in] IRQn Interrupt to acquire the configuration for. +* \return Int_config field value. Bit 0: Reserved (0 - N-N model, 1 - 1-N model for some GIC before v1) +* Bit 1: 0 - level sensitive, 1 - edge triggered +*/ +__STATIC_INLINE uint32_t GIC_GetConfiguration(IRQn_Type IRQn) +{ + return (GICDistributor->ICFGR[IRQn / 16U] >> ((IRQn % 16U) >> 1U)); +} + +/** \brief Set the priority for the given interrupt in the GIC's IPRIORITYR register. +* \param [in] IRQn The interrupt to be configured. +* \param [in] priority The priority for the interrupt, lower values denote higher priorities. +*/ +__STATIC_INLINE void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + uint32_t mask = GICDistributor->IPRIORITYR[IRQn / 4U] & ~(0xFFUL << ((IRQn % 4U) * 8U)); + GICDistributor->IPRIORITYR[IRQn / 4U] = mask | ((priority & 0xFFUL) << ((IRQn % 4U) * 8U)); +} + +/** \brief Read the current interrupt priority from GIC's IPRIORITYR register. +* \param [in] IRQn The interrupt to be queried. +*/ +__STATIC_INLINE uint32_t GIC_GetPriority(IRQn_Type IRQn) +{ + return (GICDistributor->IPRIORITYR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; +} + +/** \brief Set the interrupt priority mask using CPU's PMR register. +* \param [in] priority Priority mask to be set. +*/ +__STATIC_INLINE void GIC_SetInterfacePriorityMask(uint32_t priority) +{ + GICInterface->PMR = priority & 0xFFUL; //set priority mask +} + +/** \brief Read the current interrupt priority mask from CPU's PMR register. +* \result GICInterface_Type::PMR +*/ +__STATIC_INLINE uint32_t GIC_GetInterfacePriorityMask(void) +{ + return GICInterface->PMR; +} + +/** \brief Configures the group priority and subpriority split point using CPU's BPR register. +* \param [in] binary_point Amount of bits used as subpriority. +*/ +__STATIC_INLINE void GIC_SetBinaryPoint(uint32_t binary_point) +{ + GICInterface->BPR = binary_point & 7U; //set binary point +} + +/** \brief Read the current group priority and subpriority split point from CPU's BPR register. +* \return GICInterface_Type::BPR +*/ +__STATIC_INLINE uint32_t GIC_GetBinaryPoint(void) +{ + return GICInterface->BPR; +} + +/** \brief Get the status for a given interrupt. +* \param [in] IRQn The interrupt to get status for. +* \return 0 - not pending/active, 1 - pending, 2 - active, 3 - pending and active +*/ +__STATIC_INLINE uint32_t GIC_GetIRQStatus(IRQn_Type IRQn) +{ + uint32_t pending, active; + + active = ((GICDistributor->ISACTIVER[IRQn / 32U]) >> (IRQn % 32U)) & 1UL; + pending = ((GICDistributor->ISPENDR[IRQn / 32U]) >> (IRQn % 32U)) & 1UL; + + return ((active<<1U) | pending); +} + +/** \brief Generate a software interrupt using GIC's SGIR register. +* \param [in] IRQn Software interrupt to be generated. +* \param [in] target_list List of CPUs the software interrupt should be forwarded to. +* \param [in] filter_list Filter to be applied to determine interrupt receivers. +*/ +__STATIC_INLINE void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list) +{ + GICDistributor->SGIR = ((filter_list & 3U) << 24U) | ((target_list & 0xFFUL) << 16U) | (IRQn & 0x0FUL); +} + +/** \brief Get the interrupt number of the highest interrupt pending from CPU's HPPIR register. +* \return GICInterface_Type::HPPIR +*/ +__STATIC_INLINE uint32_t GIC_GetHighPendingIRQ(void) +{ + return GICInterface->HPPIR; +} + +/** \brief Provides information about the implementer and revision of the CPU interface. +* \return GICInterface_Type::IIDR +*/ +__STATIC_INLINE uint32_t GIC_GetInterfaceId(void) +{ + return GICInterface->IIDR; +} + +/** \brief Set the interrupt group from the GIC's IGROUPR register. +* \param [in] IRQn The interrupt to be queried. +* \param [in] group Interrupt group number: 0 - Group 0, 1 - Group 1 +*/ +__STATIC_INLINE void GIC_SetGroup(IRQn_Type IRQn, uint32_t group) +{ + uint32_t igroupr = GICDistributor->IGROUPR[IRQn / 32U]; + uint32_t shift = (IRQn % 32U); + + igroupr &= (~(1U << shift)); + igroupr |= ( (group & 1U) << shift); + + GICDistributor->IGROUPR[IRQn / 32U] = igroupr; +} +#define GIC_SetSecurity GIC_SetGroup + +/** \brief Get the interrupt group from the GIC's IGROUPR register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - Group 0, 1 - Group 1 +*/ +__STATIC_INLINE uint32_t GIC_GetGroup(IRQn_Type IRQn) +{ + return (GICDistributor->IGROUPR[IRQn / 32U] >> (IRQn % 32U)) & 1UL; +} +#define GIC_GetSecurity GIC_GetGroup + +/** \brief Initialize the interrupt distributor. +*/ +__STATIC_INLINE void GIC_DistInit(void) +{ + uint32_t i; + uint32_t num_irq = 0U; + uint32_t priority_field; + + //A reset sets all bits in the IGROUPRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableDistributor(); + //Get the maximum number of interrupts that the GIC supports + num_irq = 32U * ((GIC_DistributorInfo() & 0x1FU) + 1U); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an IPRIORITYR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0U, 0xFFU); + priority_field = GIC_GetPriority((IRQn_Type)0U); + + for (i = 32U; i < num_irq; i++) + { + //Disable the SPI interrupt + GIC_DisableIRQ((IRQn_Type)i); + //Set level-sensitive (and N-N model) + GIC_SetConfiguration((IRQn_Type)i, 0U); + //Set priority + GIC_SetPriority((IRQn_Type)i, priority_field/2U); + //Set target list to CPU0 + GIC_SetTarget((IRQn_Type)i, 1U); + } + //Enable distributor + GIC_EnableDistributor(); +} + +/** \brief Initialize the CPU's interrupt interface +*/ +__STATIC_INLINE void GIC_CPUInterfaceInit(void) +{ + uint32_t i; + uint32_t priority_field; + + //A reset sets all bits in the IGROUPRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableInterface(); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an IPRIORITYR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0U, 0xFFU); + priority_field = GIC_GetPriority((IRQn_Type)0U); + + //SGI and PPI + for (i = 0U; i < 32U; i++) + { + if(i > 15U) { + //Set level-sensitive (and N-N model) for PPI + GIC_SetConfiguration((IRQn_Type)i, 0U); + } + //Disable SGI and PPI interrupts + GIC_DisableIRQ((IRQn_Type)i); + //Set priority + GIC_SetPriority((IRQn_Type)i, priority_field/2U); + } + //Enable interface + GIC_EnableInterface(); + //Set binary point to 0 + GIC_SetBinaryPoint(0U); + //Set priority mask + GIC_SetInterfacePriorityMask(0xFFU); +} + +/** \brief Initialize and enable the GIC +*/ +__STATIC_INLINE void GIC_Enable(void) +{ + GIC_DistInit(); + GIC_CPUInterfaceInit(); //per CPU +} +#endif + +/* ########################## Generic Timer functions ############################ */ +#if (__TIM_PRESENT == 1U) || defined(DOXYGEN) + +/* PL1 Physical Timer */ +#if (__CORTEX_A == 7U) || defined(DOXYGEN) + +/** \brief Physical Timer Control register */ +typedef union +{ + struct + { + uint32_t ENABLE:1; /*!< \brief bit: 0 Enables the timer. */ + uint32_t IMASK:1; /*!< \brief bit: 1 Timer output signal mask bit. */ + uint32_t ISTATUS:1; /*!< \brief bit: 2 The status of the timer. */ + RESERVED(0:29, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CNTP_CTL_Type; + +/** \brief Configures the frequency the timer shall run at. +* \param [in] value The timer frequency in Hz. +*/ +__STATIC_INLINE void PL1_SetCounterFrequency(uint32_t value) +{ + __set_CNTFRQ(value); + __ISB(); +} + +/** \brief Sets the reset value of the timer. +* \param [in] value The value the timer is loaded with. +*/ +__STATIC_INLINE void PL1_SetLoadValue(uint32_t value) +{ + __set_CNTP_TVAL(value); + __ISB(); +} + +/** \brief Get the current counter value. +* \return Current counter value. +*/ +__STATIC_INLINE uint32_t PL1_GetCurrentValue(void) +{ + return(__get_CNTP_TVAL()); +} + +/** \brief Get the current physical counter value. +* \return Current physical counter value. +*/ +__STATIC_INLINE uint64_t PL1_GetCurrentPhysicalValue(void) +{ + return(__get_CNTPCT()); +} + +/** \brief Set the physical compare value. +* \param [in] value New physical timer compare value. +*/ +__STATIC_INLINE void PL1_SetPhysicalCompareValue(uint64_t value) +{ + __set_CNTP_CVAL(value); + __ISB(); +} + +/** \brief Get the physical compare value. +* \return Physical compare value. +*/ +__STATIC_INLINE uint64_t PL1_GetPhysicalCompareValue(void) +{ + return(__get_CNTP_CVAL()); +} + +/** \brief Configure the timer by setting the control value. +* \param [in] value New timer control value. +*/ +__STATIC_INLINE void PL1_SetControl(uint32_t value) +{ + __set_CNTP_CTL(value); + __ISB(); +} + +/** \brief Get the control value. +* \return Control value. +*/ +__STATIC_INLINE uint32_t PL1_GetControl(void) +{ + return(__get_CNTP_CTL()); +} +#endif + +/* Private Timer */ +#if ((__CORTEX_A == 5U) || (__CORTEX_A == 9U)) || defined(DOXYGEN) +/** \brief Set the load value to timers LOAD register. +* \param [in] value The load value to be set. +*/ +__STATIC_INLINE void PTIM_SetLoadValue(uint32_t value) +{ + PTIM->LOAD = value; +} + +/** \brief Get the load value from timers LOAD register. +* \return Timer_Type::LOAD +*/ +__STATIC_INLINE uint32_t PTIM_GetLoadValue(void) +{ + return(PTIM->LOAD); +} + +/** \brief Set current counter value from its COUNTER register. +*/ +__STATIC_INLINE void PTIM_SetCurrentValue(uint32_t value) +{ + PTIM->COUNTER = value; +} + +/** \brief Get current counter value from timers COUNTER register. +* \result Timer_Type::COUNTER +*/ +__STATIC_INLINE uint32_t PTIM_GetCurrentValue(void) +{ + return(PTIM->COUNTER); +} + +/** \brief Configure the timer using its CONTROL register. +* \param [in] value The new configuration value to be set. +*/ +__STATIC_INLINE void PTIM_SetControl(uint32_t value) +{ + PTIM->CONTROL = value; +} + +/** ref Timer_Type::CONTROL Get the current timer configuration from its CONTROL register. +* \return Timer_Type::CONTROL +*/ +__STATIC_INLINE uint32_t PTIM_GetControl(void) +{ + return(PTIM->CONTROL); +} + +/** ref Timer_Type::CONTROL Get the event flag in timers ISR register. +* \return 0 - flag is not set, 1- flag is set +*/ +__STATIC_INLINE uint32_t PTIM_GetEventFlag(void) +{ + return (PTIM->ISR & 1UL); +} + +/** ref Timer_Type::CONTROL Clears the event flag in timers ISR register. +*/ +__STATIC_INLINE void PTIM_ClearEventFlag(void) +{ + PTIM->ISR = 1; +} +#endif +#endif + +/* ########################## MMU functions ###################################### */ + +#define SECTION_DESCRIPTOR (0x2) +#define SECTION_MASK (0xFFFFFFFC) + +#define SECTION_TEXCB_MASK (0xFFFF8FF3) +#define SECTION_B_SHIFT (2) +#define SECTION_C_SHIFT (3) +#define SECTION_TEX0_SHIFT (12) +#define SECTION_TEX1_SHIFT (13) +#define SECTION_TEX2_SHIFT (14) + +#define SECTION_XN_MASK (0xFFFFFFEF) +#define SECTION_XN_SHIFT (4) + +#define SECTION_DOMAIN_MASK (0xFFFFFE1F) +#define SECTION_DOMAIN_SHIFT (5) + +#define SECTION_P_MASK (0xFFFFFDFF) +#define SECTION_P_SHIFT (9) + +#define SECTION_AP_MASK (0xFFFF73FF) +#define SECTION_AP_SHIFT (10) +#define SECTION_AP2_SHIFT (15) + +#define SECTION_S_MASK (0xFFFEFFFF) +#define SECTION_S_SHIFT (16) + +#define SECTION_NG_MASK (0xFFFDFFFF) +#define SECTION_NG_SHIFT (17) + +#define SECTION_NS_MASK (0xFFF7FFFF) +#define SECTION_NS_SHIFT (19) + +#define PAGE_L1_DESCRIPTOR (0x1) +#define PAGE_L1_MASK (0xFFFFFFFC) + +#define PAGE_L2_4K_DESC (0x2) +#define PAGE_L2_4K_MASK (0xFFFFFFFD) + +#define PAGE_L2_64K_DESC (0x1) +#define PAGE_L2_64K_MASK (0xFFFFFFFC) + +#define PAGE_4K_TEXCB_MASK (0xFFFFFE33) +#define PAGE_4K_B_SHIFT (2) +#define PAGE_4K_C_SHIFT (3) +#define PAGE_4K_TEX0_SHIFT (6) +#define PAGE_4K_TEX1_SHIFT (7) +#define PAGE_4K_TEX2_SHIFT (8) + +#define PAGE_64K_TEXCB_MASK (0xFFFF8FF3) +#define PAGE_64K_B_SHIFT (2) +#define PAGE_64K_C_SHIFT (3) +#define PAGE_64K_TEX0_SHIFT (12) +#define PAGE_64K_TEX1_SHIFT (13) +#define PAGE_64K_TEX2_SHIFT (14) + +#define PAGE_TEXCB_MASK (0xFFFF8FF3) +#define PAGE_B_SHIFT (2) +#define PAGE_C_SHIFT (3) +#define PAGE_TEX_SHIFT (12) + +#define PAGE_XN_4K_MASK (0xFFFFFFFE) +#define PAGE_XN_4K_SHIFT (0) +#define PAGE_XN_64K_MASK (0xFFFF7FFF) +#define PAGE_XN_64K_SHIFT (15) + +#define PAGE_DOMAIN_MASK (0xFFFFFE1F) +#define PAGE_DOMAIN_SHIFT (5) + +#define PAGE_P_MASK (0xFFFFFDFF) +#define PAGE_P_SHIFT (9) + +#define PAGE_AP_MASK (0xFFFFFDCF) +#define PAGE_AP_SHIFT (4) +#define PAGE_AP2_SHIFT (9) + +#define PAGE_S_MASK (0xFFFFFBFF) +#define PAGE_S_SHIFT (10) + +#define PAGE_NG_MASK (0xFFFFF7FF) +#define PAGE_NG_SHIFT (11) + +#define PAGE_NS_MASK (0xFFFFFFF7) +#define PAGE_NS_SHIFT (3) + +#define OFFSET_1M (0x00100000) +#define OFFSET_64K (0x00010000) +#define OFFSET_4K (0x00001000) + +#define DESCRIPTOR_FAULT (0x00000000) + +/* Attributes enumerations */ + +/* Region size attributes */ +typedef enum +{ + SECTION, + PAGE_4k, + PAGE_64k, +} mmu_region_size_Type; + +/* Region type attributes */ +typedef enum +{ + NORMAL, + DEVICE, + SHARED_DEVICE, + NON_SHARED_DEVICE, + STRONGLY_ORDERED +} mmu_memory_Type; + +/* Region cacheability attributes */ +typedef enum +{ + NON_CACHEABLE, + WB_WA, + WT, + WB_NO_WA, +} mmu_cacheability_Type; + +/* Region parity check attributes */ +typedef enum +{ + ECC_DISABLED, + ECC_ENABLED, +} mmu_ecc_check_Type; + +/* Region execution attributes */ +typedef enum +{ + EXECUTE, + NON_EXECUTE, +} mmu_execute_Type; + +/* Region global attributes */ +typedef enum +{ + GLOBAL, + NON_GLOBAL, +} mmu_global_Type; + +/* Region shareability attributes */ +typedef enum +{ + NON_SHARED, + SHARED, +} mmu_shared_Type; + +/* Region security attributes */ +typedef enum +{ + SECURE, + NON_SECURE, +} mmu_secure_Type; + +/* Region access attributes */ +typedef enum +{ + NO_ACCESS, + RW, + READ, +} mmu_access_Type; + +/* Memory Region definition */ +typedef struct RegionStruct { + mmu_region_size_Type rg_t; + mmu_memory_Type mem_t; + uint8_t domain; + mmu_cacheability_Type inner_norm_t; + mmu_cacheability_Type outer_norm_t; + mmu_ecc_check_Type e_t; + mmu_execute_Type xn_t; + mmu_global_Type g_t; + mmu_secure_Type sec_t; + mmu_access_Type priv_t; + mmu_access_Type user_t; + mmu_shared_Type sh_t; + +} mmu_region_attributes_Type; + +//Following macros define the descriptors and attributes +//Sect_Normal. Outer & inner wb/wa, non-shareable, executable, rw, domain 0 +#define section_normal(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_NC. Outer & inner non-cacheable, non-shareable, executable, rw, domain 0 +#define section_normal_nc(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_Cod. Outer & inner wb/wa, non-shareable, executable, ro, domain 0 +#define section_normal_cod(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_RO. Sect_Normal_Cod, but not executable +#define section_normal_ro(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_RW. Sect_Normal_Cod, but writeable and not executable +#define section_normal_rw(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); +//Sect_SO. Strongly-ordered (therefore shareable), not executable, rw, domain 0, base addr 0 +#define section_so(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Device_RO. Device, non-shareable, non-executable, ro, domain 0, base addr 0 +#define section_device_ro(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Device_RW. Sect_Device_RO, but writeable +#define section_device_rw(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); +//Page_4k_Device_RW. Shared device, not executable, rw, domain 0 +#define page4k_device_rw(descriptor_l1, descriptor_l2, region) region.rg_t = PAGE_4k; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = SHARED_DEVICE; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetPageDescriptor(&descriptor_l1, &descriptor_l2, region); + +//Page_64k_Device_RW. Shared device, not executable, rw, domain 0 +#define page64k_device_rw(descriptor_l1, descriptor_l2, region) region.rg_t = PAGE_64k; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = SHARED_DEVICE; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetPageDescriptor(&descriptor_l1, &descriptor_l2, region); + +/** \brief Set section execution-never attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] xn Section execution-never attribute : EXECUTE , NON_EXECUTE. + + \return 0 +*/ +__STATIC_INLINE int MMU_XNSection(uint32_t *descriptor_l1, mmu_execute_Type xn) +{ + *descriptor_l1 &= SECTION_XN_MASK; + *descriptor_l1 |= ((xn & 0x1) << SECTION_XN_SHIFT); + return 0; +} + +/** \brief Set section domain + + \param [out] descriptor_l1 L1 descriptor. + \param [in] domain Section domain + + \return 0 +*/ +__STATIC_INLINE int MMU_DomainSection(uint32_t *descriptor_l1, uint8_t domain) +{ + *descriptor_l1 &= SECTION_DOMAIN_MASK; + *descriptor_l1 |= ((domain & 0xF) << SECTION_DOMAIN_SHIFT); + return 0; +} + +/** \brief Set section parity check + + \param [out] descriptor_l1 L1 descriptor. + \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED + + \return 0 +*/ +__STATIC_INLINE int MMU_PSection(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit) +{ + *descriptor_l1 &= SECTION_P_MASK; + *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT); + return 0; +} + +/** \brief Set section access privileges + + \param [out] descriptor_l1 L1 descriptor. + \param [in] user User Level Access: NO_ACCESS, RW, READ + \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ + \param [in] afe Access flag enable + + \return 0 +*/ +__STATIC_INLINE int MMU_APSection(uint32_t *descriptor_l1, mmu_access_Type user, mmu_access_Type priv, uint32_t afe) +{ + uint32_t ap = 0; + + if (afe == 0) { //full access + if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; } + else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == READ)) { ap = 0x2; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + else { //Simplified access + if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + *descriptor_l1 &= SECTION_AP_MASK; + *descriptor_l1 |= (ap & 0x3) << SECTION_AP_SHIFT; + *descriptor_l1 |= ((ap & 0x4)>>2) << SECTION_AP2_SHIFT; + + return 0; +} + +/** \brief Set section shareability + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit Section shareability: NON_SHARED, SHARED + + \return 0 +*/ +__STATIC_INLINE int MMU_SharedSection(uint32_t *descriptor_l1, mmu_shared_Type s_bit) +{ + *descriptor_l1 &= SECTION_S_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << SECTION_S_SHIFT); + return 0; +} + +/** \brief Set section Global attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] g_bit Section attribute: GLOBAL, NON_GLOBAL + + \return 0 +*/ +__STATIC_INLINE int MMU_GlobalSection(uint32_t *descriptor_l1, mmu_global_Type g_bit) +{ + *descriptor_l1 &= SECTION_NG_MASK; + *descriptor_l1 |= ((g_bit & 0x1) << SECTION_NG_SHIFT); + return 0; +} + +/** \brief Set section Security attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit Section Security attribute: SECURE, NON_SECURE + + \return 0 +*/ +__STATIC_INLINE int MMU_SecureSection(uint32_t *descriptor_l1, mmu_secure_Type s_bit) +{ + *descriptor_l1 &= SECTION_NS_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << SECTION_NS_SHIFT); + return 0; +} + +/* Page 4k or 64k */ +/** \brief Set 4k/64k page execution-never attribute + + \param [out] descriptor_l2 L2 descriptor. + \param [in] xn Page execution-never attribute : EXECUTE , NON_EXECUTE. + \param [in] page Page size: PAGE_4k, PAGE_64k, + + \return 0 +*/ +__STATIC_INLINE int MMU_XNPage(uint32_t *descriptor_l2, mmu_execute_Type xn, mmu_region_size_Type page) +{ + if (page == PAGE_4k) + { + *descriptor_l2 &= PAGE_XN_4K_MASK; + *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_4K_SHIFT); + } + else + { + *descriptor_l2 &= PAGE_XN_64K_MASK; + *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_64K_SHIFT); + } + return 0; +} + +/** \brief Set 4k/64k page domain + + \param [out] descriptor_l1 L1 descriptor. + \param [in] domain Page domain + + \return 0 +*/ +__STATIC_INLINE int MMU_DomainPage(uint32_t *descriptor_l1, uint8_t domain) +{ + *descriptor_l1 &= PAGE_DOMAIN_MASK; + *descriptor_l1 |= ((domain & 0xf) << PAGE_DOMAIN_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page parity check + + \param [out] descriptor_l1 L1 descriptor. + \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED + + \return 0 +*/ +__STATIC_INLINE int MMU_PPage(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit) +{ + *descriptor_l1 &= SECTION_P_MASK; + *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page access privileges + + \param [out] descriptor_l2 L2 descriptor. + \param [in] user User Level Access: NO_ACCESS, RW, READ + \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ + \param [in] afe Access flag enable + + \return 0 +*/ +__STATIC_INLINE int MMU_APPage(uint32_t *descriptor_l2, mmu_access_Type user, mmu_access_Type priv, uint32_t afe) +{ + uint32_t ap = 0; + + if (afe == 0) { //full access + if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; } + else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == READ)) { ap = 0x2; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x6; } + } + + else { //Simplified access + if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + *descriptor_l2 &= PAGE_AP_MASK; + *descriptor_l2 |= (ap & 0x3) << PAGE_AP_SHIFT; + *descriptor_l2 |= ((ap & 0x4)>>2) << PAGE_AP2_SHIFT; + + return 0; +} + +/** \brief Set 4k/64k page shareability + + \param [out] descriptor_l2 L2 descriptor. + \param [in] s_bit 4k/64k page shareability: NON_SHARED, SHARED + + \return 0 +*/ +__STATIC_INLINE int MMU_SharedPage(uint32_t *descriptor_l2, mmu_shared_Type s_bit) +{ + *descriptor_l2 &= PAGE_S_MASK; + *descriptor_l2 |= ((s_bit & 0x1) << PAGE_S_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page Global attribute + + \param [out] descriptor_l2 L2 descriptor. + \param [in] g_bit 4k/64k page attribute: GLOBAL, NON_GLOBAL + + \return 0 +*/ +__STATIC_INLINE int MMU_GlobalPage(uint32_t *descriptor_l2, mmu_global_Type g_bit) +{ + *descriptor_l2 &= PAGE_NG_MASK; + *descriptor_l2 |= ((g_bit & 0x1) << PAGE_NG_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page Security attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit 4k/64k page Security attribute: SECURE, NON_SECURE + + \return 0 +*/ +__STATIC_INLINE int MMU_SecurePage(uint32_t *descriptor_l1, mmu_secure_Type s_bit) +{ + *descriptor_l1 &= PAGE_NS_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << PAGE_NS_SHIFT); + return 0; +} + +/** \brief Set Section memory attributes + + \param [out] descriptor_l1 L1 descriptor. + \param [in] mem Section memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED + \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + + \return 0 +*/ +__STATIC_INLINE int MMU_MemorySection(uint32_t *descriptor_l1, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner) +{ + *descriptor_l1 &= SECTION_TEXCB_MASK; + + if (STRONGLY_ORDERED == mem) + { + return 0; + } + else if (SHARED_DEVICE == mem) + { + *descriptor_l1 |= (1 << SECTION_B_SHIFT); + } + else if (NON_SHARED_DEVICE == mem) + { + *descriptor_l1 |= (1 << SECTION_TEX1_SHIFT); + } + else if (NORMAL == mem) + { + *descriptor_l1 |= 1 << SECTION_TEX2_SHIFT; + switch(inner) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l1 |= (1 << SECTION_B_SHIFT); + break; + case WT: + *descriptor_l1 |= 1 << SECTION_C_SHIFT; + break; + case WB_NO_WA: + *descriptor_l1 |= (1 << SECTION_B_SHIFT) | (1 << SECTION_C_SHIFT); + break; + } + switch(outer) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT); + break; + case WT: + *descriptor_l1 |= 1 << SECTION_TEX1_SHIFT; + break; + case WB_NO_WA: + *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT) | (1 << SECTION_TEX0_SHIFT); + break; + } + } + return 0; +} + +/** \brief Set 4k/64k page memory attributes + + \param [out] descriptor_l2 L2 descriptor. + \param [in] mem 4k/64k page memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED + \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] page Page size + + \return 0 +*/ +__STATIC_INLINE int MMU_MemoryPage(uint32_t *descriptor_l2, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner, mmu_region_size_Type page) +{ + *descriptor_l2 &= PAGE_4K_TEXCB_MASK; + + if (page == PAGE_64k) + { + //same as section + MMU_MemorySection(descriptor_l2, mem, outer, inner); + } + else + { + if (STRONGLY_ORDERED == mem) + { + return 0; + } + else if (SHARED_DEVICE == mem) + { + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT); + } + else if (NON_SHARED_DEVICE == mem) + { + *descriptor_l2 |= (1 << PAGE_4K_TEX1_SHIFT); + } + else if (NORMAL == mem) + { + *descriptor_l2 |= 1 << PAGE_4K_TEX2_SHIFT; + switch(inner) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT); + break; + case WT: + *descriptor_l2 |= 1 << PAGE_4K_C_SHIFT; + break; + case WB_NO_WA: + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT) | (1 << PAGE_4K_C_SHIFT); + break; + } + switch(outer) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT); + break; + case WT: + *descriptor_l2 |= 1 << PAGE_4K_TEX1_SHIFT; + break; + case WB_NO_WA: + *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT) | (1 << PAGE_4K_TEX0_SHIFT); + break; + } + } + } + + return 0; +} + +/** \brief Create a L1 section descriptor + + \param [out] descriptor L1 descriptor + \param [in] reg Section attributes + + \return 0 +*/ +__STATIC_INLINE int MMU_GetSectionDescriptor(uint32_t *descriptor, mmu_region_attributes_Type reg) +{ + *descriptor = 0; + + MMU_MemorySection(descriptor, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t); + MMU_XNSection(descriptor,reg.xn_t); + MMU_DomainSection(descriptor, reg.domain); + MMU_PSection(descriptor, reg.e_t); + MMU_APSection(descriptor, reg.priv_t, reg.user_t, 1); + MMU_SharedSection(descriptor,reg.sh_t); + MMU_GlobalSection(descriptor,reg.g_t); + MMU_SecureSection(descriptor,reg.sec_t); + *descriptor &= SECTION_MASK; + *descriptor |= SECTION_DESCRIPTOR; + + return 0; +} + + +/** \brief Create a L1 and L2 4k/64k page descriptor + + \param [out] descriptor L1 descriptor + \param [out] descriptor2 L2 descriptor + \param [in] reg 4k/64k page attributes + + \return 0 +*/ +__STATIC_INLINE int MMU_GetPageDescriptor(uint32_t *descriptor, uint32_t *descriptor2, mmu_region_attributes_Type reg) +{ + *descriptor = 0; + *descriptor2 = 0; + + switch (reg.rg_t) + { + case PAGE_4k: + MMU_MemoryPage(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_4k); + MMU_XNPage(descriptor2, reg.xn_t, PAGE_4k); + MMU_DomainPage(descriptor, reg.domain); + MMU_PPage(descriptor, reg.e_t); + MMU_APPage(descriptor2, reg.priv_t, reg.user_t, 1); + MMU_SharedPage(descriptor2,reg.sh_t); + MMU_GlobalPage(descriptor2,reg.g_t); + MMU_SecurePage(descriptor,reg.sec_t); + *descriptor &= PAGE_L1_MASK; + *descriptor |= PAGE_L1_DESCRIPTOR; + *descriptor2 &= PAGE_L2_4K_MASK; + *descriptor2 |= PAGE_L2_4K_DESC; + break; + + case PAGE_64k: + MMU_MemoryPage(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_64k); + MMU_XNPage(descriptor2, reg.xn_t, PAGE_64k); + MMU_DomainPage(descriptor, reg.domain); + MMU_PPage(descriptor, reg.e_t); + MMU_APPage(descriptor2, reg.priv_t, reg.user_t, 1); + MMU_SharedPage(descriptor2,reg.sh_t); + MMU_GlobalPage(descriptor2,reg.g_t); + MMU_SecurePage(descriptor,reg.sec_t); + *descriptor &= PAGE_L1_MASK; + *descriptor |= PAGE_L1_DESCRIPTOR; + *descriptor2 &= PAGE_L2_64K_MASK; + *descriptor2 |= PAGE_L2_64K_DESC; + break; + + case SECTION: + //error + break; + } + + return 0; +} + +/** \brief Create a 1MB Section + + \param [in] ttb Translation table base address + \param [in] base_address Section base address + \param [in] count Number of sections to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTSection(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1) +{ + uint32_t offset; + uint32_t entry; + uint32_t i; + + offset = base_address >> 20; + entry = (base_address & 0xFFF00000) | descriptor_l1; + + //4 bytes aligned + ttb = ttb + offset; + + for (i = 0; i < count; i++ ) + { + //4 bytes aligned + *ttb++ = entry; + entry += OFFSET_1M; + } +} + +/** \brief Create a 4k page entry + + \param [in] ttb L1 table base address + \param [in] base_address 4k base address + \param [in] count Number of 4k pages to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + \param [in] ttb_l2 L2 table base address + \param [in] descriptor_l2 L2 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTPage4k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 ) +{ + + uint32_t offset, offset2; + uint32_t entry, entry2; + uint32_t i; + + offset = base_address >> 20; + entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1; + + //4 bytes aligned + ttb += offset; + //create l1_entry + *ttb = entry; + + offset2 = (base_address & 0xff000) >> 12; + ttb_l2 += offset2; + entry2 = (base_address & 0xFFFFF000) | descriptor_l2; + for (i = 0; i < count; i++ ) + { + //4 bytes aligned + *ttb_l2++ = entry2; + entry2 += OFFSET_4K; + } +} + +/** \brief Create a 64k page entry + + \param [in] ttb L1 table base address + \param [in] base_address 64k base address + \param [in] count Number of 64k pages to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + \param [in] ttb_l2 L2 table base address + \param [in] descriptor_l2 L2 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTPage64k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 ) +{ + uint32_t offset, offset2; + uint32_t entry, entry2; + uint32_t i,j; + + + offset = base_address >> 20; + entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1; + + //4 bytes aligned + ttb += offset; + //create l1_entry + *ttb = entry; + + offset2 = (base_address & 0xff000) >> 12; + ttb_l2 += offset2; + entry2 = (base_address & 0xFFFF0000) | descriptor_l2; + for (i = 0; i < count; i++ ) + { + //create 16 entries + for (j = 0; j < 16; j++) + { + //4 bytes aligned + *ttb_l2++ = entry2; + } + entry2 += OFFSET_64K; + } +} + +/** \brief Enable MMU +*/ +__STATIC_INLINE void MMU_Enable(void) +{ + // Set M bit 0 to enable the MMU + // Set AFE bit to enable simplified access permissions model + // Clear TRE bit to disable TEX remap and A bit to disable strict alignment fault checking + __set_SCTLR( (__get_SCTLR() & ~(1 << 28) & ~(1 << 1)) | 1 | (1 << 29)); + __ISB(); +} + +/** \brief Disable MMU +*/ +__STATIC_INLINE void MMU_Disable(void) +{ + // Clear M bit 0 to disable the MMU + __set_SCTLR( __get_SCTLR() & ~1); + __ISB(); +} + +/** \brief Invalidate entire unified TLB +*/ + +__STATIC_INLINE void MMU_InvalidateTLB(void) +{ + __set_TLBIALL(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new state +} + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CA_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/Core_A/irq_ctrl.h b/platform/CMSIS/Include/Core_A/irq_ctrl.h new file mode 100755 index 0000000..b171ef0 --- /dev/null +++ b/platform/CMSIS/Include/Core_A/irq_ctrl.h @@ -0,0 +1,186 @@ +/**************************************************************************//** + * @file irq_ctrl.h + * @brief Interrupt Controller API header file + * @version V1.0.0 + * @date 23. June 2017 + ******************************************************************************/ +/* + * Copyright (c) 2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef IRQ_CTRL_H_ +#define IRQ_CTRL_H_ + +#include + +#ifndef IRQHANDLER_T +#define IRQHANDLER_T +/// Interrupt handler data type +typedef void (*IRQHandler_t) (void); +#endif + +#ifndef IRQN_ID_T +#define IRQN_ID_T +/// Interrupt ID number data type +typedef int32_t IRQn_ID_t; +#endif + +/* Interrupt mode bit-masks */ +#define IRQ_MODE_TRIG_Pos (0U) +#define IRQ_MODE_TRIG_Msk (0x07UL /*<< IRQ_MODE_TRIG_Pos*/) +#define IRQ_MODE_TRIG_LEVEL (0x00UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: level triggered interrupt +#define IRQ_MODE_TRIG_LEVEL_LOW (0x01UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: low level triggered interrupt +#define IRQ_MODE_TRIG_LEVEL_HIGH (0x02UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: high level triggered interrupt +#define IRQ_MODE_TRIG_EDGE (0x04UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_RISING (0x05UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: rising edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_FALLING (0x06UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: falling edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_BOTH (0x07UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: rising and falling edge triggered interrupt + +#define IRQ_MODE_TYPE_Pos (3U) +#define IRQ_MODE_TYPE_Msk (0x01UL << IRQ_MODE_TYPE_Pos) +#define IRQ_MODE_TYPE_IRQ (0x00UL << IRQ_MODE_TYPE_Pos) ///< Type: interrupt source triggers CPU IRQ line +#define IRQ_MODE_TYPE_FIQ (0x01UL << IRQ_MODE_TYPE_Pos) ///< Type: interrupt source triggers CPU FIQ line + +#define IRQ_MODE_DOMAIN_Pos (4U) +#define IRQ_MODE_DOMAIN_Msk (0x01UL << IRQ_MODE_DOMAIN_Pos) +#define IRQ_MODE_DOMAIN_NONSECURE (0x00UL << IRQ_MODE_DOMAIN_Pos) ///< Domain: interrupt is targeting non-secure domain +#define IRQ_MODE_DOMAIN_SECURE (0x01UL << IRQ_MODE_DOMAIN_Pos) ///< Domain: interrupt is targeting secure domain + +#define IRQ_MODE_CPU_Pos (5U) +#define IRQ_MODE_CPU_Msk (0xFFUL << IRQ_MODE_CPU_Pos) +#define IRQ_MODE_CPU_ALL (0x00UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets all CPUs +#define IRQ_MODE_CPU_0 (0x01UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 0 +#define IRQ_MODE_CPU_1 (0x02UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 1 +#define IRQ_MODE_CPU_2 (0x04UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 2 +#define IRQ_MODE_CPU_3 (0x08UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 3 +#define IRQ_MODE_CPU_4 (0x10UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 4 +#define IRQ_MODE_CPU_5 (0x20UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 5 +#define IRQ_MODE_CPU_6 (0x40UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 6 +#define IRQ_MODE_CPU_7 (0x80UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 7 + +#define IRQ_MODE_ERROR (0x80000000UL) ///< Bit indicating mode value error + +/* Interrupt priority bit-masks */ +#define IRQ_PRIORITY_Msk (0x0000FFFFUL) ///< Interrupt priority value bit-mask +#define IRQ_PRIORITY_ERROR (0x80000000UL) ///< Bit indicating priority value error + +/// Initialize interrupt controller. +/// \return 0 on success, -1 on error. +int32_t IRQ_Initialize (void); + +/// Register interrupt handler. +/// \param[in] irqn interrupt ID number +/// \param[in] handler interrupt handler function address +/// \return 0 on success, -1 on error. +int32_t IRQ_SetHandler (IRQn_ID_t irqn, IRQHandler_t handler); + +/// Get the registered interrupt handler. +/// \param[in] irqn interrupt ID number +/// \return registered interrupt handler function address. +IRQHandler_t IRQ_GetHandler (IRQn_ID_t irqn); + +/// Enable interrupt. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_Enable (IRQn_ID_t irqn); + +/// Disable interrupt. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_Disable (IRQn_ID_t irqn); + +/// Get interrupt enable state. +/// \param[in] irqn interrupt ID number +/// \return 0 - interrupt is disabled, 1 - interrupt is enabled. +uint32_t IRQ_GetEnableState (IRQn_ID_t irqn); + +/// Configure interrupt request mode. +/// \param[in] irqn interrupt ID number +/// \param[in] mode mode configuration +/// \return 0 on success, -1 on error. +int32_t IRQ_SetMode (IRQn_ID_t irqn, uint32_t mode); + +/// Get interrupt mode configuration. +/// \param[in] irqn interrupt ID number +/// \return current interrupt mode configuration with optional IRQ_MODE_ERROR bit set. +uint32_t IRQ_GetMode (IRQn_ID_t irqn); + +/// Get ID number of current interrupt request (IRQ). +/// \return interrupt ID number. +IRQn_ID_t IRQ_GetActiveIRQ (void); + +/// Get ID number of current fast interrupt request (FIQ). +/// \return interrupt ID number. +IRQn_ID_t IRQ_GetActiveFIQ (void); + +/// Signal end of interrupt processing. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_EndOfInterrupt (IRQn_ID_t irqn); + +/// Set interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPending (IRQn_ID_t irqn); + +/// Get interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 - interrupt is not pending, 1 - interrupt is pending. +uint32_t IRQ_GetPending (IRQn_ID_t irqn); + +/// Clear interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_ClearPending (IRQn_ID_t irqn); + +/// Set interrupt priority value. +/// \param[in] irqn interrupt ID number +/// \param[in] priority interrupt priority value +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriority (IRQn_ID_t irqn, uint32_t priority); + +/// Get interrupt priority. +/// \param[in] irqn interrupt ID number +/// \return current interrupt priority value with optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriority (IRQn_ID_t irqn); + +/// Set priority masking threshold. +/// \param[in] priority priority masking threshold value +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriorityMask (uint32_t priority); + +/// Get priority masking threshold +/// \return current priority masking threshold value with optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriorityMask (void); + +/// Set priority grouping field split point +/// \param[in] bits number of MSB bits included in the group priority field comparison +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriorityGroupBits (uint32_t bits); + +/// Get priority grouping field split point +/// \return current number of MSB bits included in the group priority field comparison with +/// optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriorityGroupBits (void); + +#endif // IRQ_CTRL_H_ diff --git a/platform/CMSIS/Include/arm_common_tables.h b/platform/CMSIS/Include/arm_common_tables.h new file mode 100755 index 0000000..dfea746 --- /dev/null +++ b/platform/CMSIS/Include/arm_common_tables.h @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables.h + * Description: Extern declaration for common tables + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern const uint16_t armBitRevTable[1024]; +extern const q15_t armRecipTableQ15[64]; +extern const q31_t armRecipTableQ31[64]; +extern const float32_t twiddleCoef_16[32]; +extern const float32_t twiddleCoef_32[64]; +extern const float32_t twiddleCoef_64[128]; +extern const float32_t twiddleCoef_128[256]; +extern const float32_t twiddleCoef_256[512]; +extern const float32_t twiddleCoef_512[1024]; +extern const float32_t twiddleCoef_1024[2048]; +extern const float32_t twiddleCoef_2048[4096]; +extern const float32_t twiddleCoef_4096[8192]; +#define twiddleCoef twiddleCoef_4096 +extern const q31_t twiddleCoef_16_q31[24]; +extern const q31_t twiddleCoef_32_q31[48]; +extern const q31_t twiddleCoef_64_q31[96]; +extern const q31_t twiddleCoef_128_q31[192]; +extern const q31_t twiddleCoef_256_q31[384]; +extern const q31_t twiddleCoef_512_q31[768]; +extern const q31_t twiddleCoef_1024_q31[1536]; +extern const q31_t twiddleCoef_2048_q31[3072]; +extern const q31_t twiddleCoef_4096_q31[6144]; +extern const q15_t twiddleCoef_16_q15[24]; +extern const q15_t twiddleCoef_32_q15[48]; +extern const q15_t twiddleCoef_64_q15[96]; +extern const q15_t twiddleCoef_128_q15[192]; +extern const q15_t twiddleCoef_256_q15[384]; +extern const q15_t twiddleCoef_512_q15[768]; +extern const q15_t twiddleCoef_1024_q15[1536]; +extern const q15_t twiddleCoef_2048_q15[3072]; +extern const q15_t twiddleCoef_4096_q15[6144]; +extern const float32_t twiddleCoef_rfft_32[32]; +extern const float32_t twiddleCoef_rfft_64[64]; +extern const float32_t twiddleCoef_rfft_128[128]; +extern const float32_t twiddleCoef_rfft_256[256]; +extern const float32_t twiddleCoef_rfft_512[512]; +extern const float32_t twiddleCoef_rfft_1024[1024]; +extern const float32_t twiddleCoef_rfft_2048[2048]; +extern const float32_t twiddleCoef_rfft_4096[4096]; + +/* floating-point bit reversal tables */ +#define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) +#define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) +#define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) +#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) +#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) +#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) +#define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) +#define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) +#define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) + +extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; + +/* fixed-point bit reversal tables */ +#define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) +#define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) +#define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) +#define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) +#define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) +#define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) +#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) +#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) +#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) + +extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; + +/* Tables for Fast Math Sine and Cosine */ +extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; +extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; +extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/platform/CMSIS/Include/arm_const_structs.h b/platform/CMSIS/Include/arm_const_structs.h new file mode 100755 index 0000000..80a3e8b --- /dev/null +++ b/platform/CMSIS/Include/arm_const_structs.h @@ -0,0 +1,66 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs.h + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f32() function. + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_CONST_STRUCTS_H +#define _ARM_CONST_STRUCTS_H + +#include "arm_math.h" +#include "arm_common_tables.h" + + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; + + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; + + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; + +#endif diff --git a/platform/CMSIS/Include/arm_math.h b/platform/CMSIS/Include/arm_math.h new file mode 100755 index 0000000..62f87be --- /dev/null +++ b/platform/CMSIS/Include/arm_math.h @@ -0,0 +1,7160 @@ +/****************************************************************************** + * @file arm_math.h + * @brief Public header file for CMSIS DSP LibraryU + * @version V1.5.3 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2010-2018 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * ------------ + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of functions each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transforms + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Using the Library + * ------------ + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) + * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) + * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) + * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) + * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) + * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) + * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) + * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) + * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) + * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) + * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) + * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) + * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) + * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) + * - arm_ARMv8MBLl_math.lib (Armv8-M Baseline, Little endian) + * - arm_ARMv8MMLl_math.lib (Armv8-M Mainline, Little endian) + * - arm_ARMv8MMLlfsp_math.lib (Armv8-M Mainline, Little endian, Single Precision Floating Point Unit) + * - arm_ARMv8MMLld_math.lib (Armv8-M Mainline, Little endian, DSP instructions) + * - arm_ARMv8MMLldfsp_math.lib (Armv8-M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * Define the appropriate preprocessor macro ARM_MATH_CM7 or ARM_MATH_CM4 or ARM_MATH_CM3 or + * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. + * For Armv8-M cores define preprocessor macro ARM_MATH_ARMV8MBL or ARM_MATH_ARMV8MML. + * Set preprocessor macro __DSP_PRESENT if Armv8-M Mainline core supports DSP instructions. + * + * + * Examples + * -------- + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Toolchain Support + * ------------ + * + * The library has been developed and tested with MDK version 5.14.0.0 + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Building the Library + * ------------ + * + * The library installer contains a project file to rebuild libraries on MDK toolchain in the CMSIS\\DSP_Lib\\Source\\ARM folder. + * - arm_cortexM_math.uvprojx + * + * + * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional preprocessor macros detailed above. + * + * Preprocessor Macros + * ------------ + * + * Each library project have different preprocessor macros. + * + * - UNALIGNED_SUPPORT_DISABLE: + * + * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access + * + * - ARM_MATH_BIG_ENDIAN: + * + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * - ARM_MATH_MATRIX_CHECK: + * + * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * + * - ARM_MATH_ROUNDING: + * + * Define macro ARM_MATH_ROUNDING for rounding on support functions + * + * - ARM_MATH_CMx: + * + * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target + * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and + * ARM_MATH_CM7 for building the library on cortex-M7. + * + * - ARM_MATH_ARMV8MxL: + * + * Define macro ARM_MATH_ARMV8MBL for building the library on Armv8-M Baseline target, ARM_MATH_ARMV8MML for building library + * on Armv8-M Mainline target. + * + * - __FPU_PRESENT: + * + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for floating point libraries. + * + * - __DSP_PRESENT: + * + * Initialize macro __DSP_PRESENT = 1 when Armv8-M Mainline core supports DSP instructions. + * + *


    + * CMSIS-DSP in ARM::CMSIS Pack + * ----------------------------- + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) | + * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library | + * + *
    + * Revision History of CMSIS-DSP + * ------------ + * Please refer to \ref ChangeLog_pg. + * + * Copyright Notice + * ------------ + * + * Copyright (C) 2010-2015 Arm Limited. All rights reserved. + */ + + +/** + * @defgroup groupMath Basic Math Functions + */ + +/** + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + +/** + * @defgroup groupFilters Filtering Functions + */ + +/** + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
    + *     typedef struct
    + *     {
    + *       uint16_t numRows;     // number of rows of the matrix.
    + *       uint16_t numCols;     // number of columns of the matrix.
    + *       float32_t *pData;     // points to the data of the matrix.
    + *     } arm_matrix_instance_f32;
    + * 
    + * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
    + *     pData[i*numCols + j]
    + * 
    + * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
    + * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
    + * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
    + * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
    + * 
    + * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
    + *     ARM_MATH_SIZE_MISMATCH
    + * 
    + * Otherwise the functions return + *
    + *     ARM_MATH_SUCCESS
    + * 
    + * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
    + *     ARM_MATH_MATRIX_CHECK
    + * 
    + * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @defgroup groupTransforms Transform Functions + */ + +/** + * @defgroup groupController Controller Functions + */ + +/** + * @defgroup groupStats Statistics Functions + */ +/** + * @defgroup groupSupport Support Functions + */ + +/** + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @defgroup groupExamples Examples + */ +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#else + #error Unknown compiler +#endif + + +#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ + +#if defined(ARM_MATH_CM7) + #include "core_cm7.h" + #define ARM_MATH_DSP +#elif defined (ARM_MATH_CM4) + #include "core_cm4.h" + #define ARM_MATH_DSP +#elif defined (ARM_MATH_CM33) + #include "core_cm33.h" + #define ARM_MATH_DSP +#elif defined (ARM_MATH_CM3) + #include "core_cm3.h" +#elif defined (ARM_MATH_CM0) + #include "core_cm0.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_CM0PLUS) + #include "core_cm0plus.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_ARMV8MBL) + #include "core_armv8mbl.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_ARMV8MML) + #include "core_armv8mml.h" + #if (defined (__DSP_PRESENT) && (__DSP_PRESENT == 1)) + #define ARM_MATH_DSP + #endif +#else + #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML" +#endif + +#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ +#include "string.h" +#include "math.h" +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#ifndef PI + #define PI 3.14159265358979f +#endif + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) +#define CONTROLLER_Q31_SHIFT (32 - 9) +#define TABLE_SPACING_Q31 0x400000 +#define TABLE_SPACING_Q15 0x80 + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + + /** + * @brief Macro for Unaligned Support + */ +#ifndef UNALIGNED_SUPPORT_DISABLE + #define ALIGN4 +#else + #if defined (__GNUC__) + #define ALIGN4 __attribute__((aligned(4))) + #else + #define ALIGN4 __align(4) + #endif +#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_status; + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ + typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + /** + * @brief definition to read/write two 16 bit values. + */ +#if defined ( __CC_ARM ) + #define __SIMD32_TYPE int32_t __packed + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __GNUC__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE __attribute__((always_inline)) + +#elif defined ( __ICCARM__ ) + #define __SIMD32_TYPE int32_t __packed + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#elif defined ( __TI_ARM__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED __attribute__((unused)) + #define CMSIS_INLINE + +#elif defined ( __CSMC__ ) + #define __SIMD32_TYPE int32_t + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#elif defined ( __TASKING__ ) + #define __SIMD32_TYPE __unaligned int32_t + #define CMSIS_UNUSED + #define CMSIS_INLINE + +#else + #error Unknown compiler +#endif + +#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) +#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) +#define __SIMD64(addr) (*(int64_t **) & (addr)) + +#if !defined (ARM_MATH_DSP) + /** + * @brief definition to pack two 16 bit values. + */ +#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) +#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) + +#endif /* !defined (ARM_MATH_DSP) */ + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) + +#endif + + + /** + * @brief Clips Q63 to Q31 values. + */ + CMSIS_INLINE __STATIC_INLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + CMSIS_INLINE __STATIC_INLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + CMSIS_INLINE __STATIC_INLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + CMSIS_INLINE __STATIC_INLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + + CMSIS_INLINE __STATIC_INLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y))); + } + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. + */ + + CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + q31_t * pRecipTable) + { + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t) (__CLZ( in) - 1)); + } + else + { + signBits = ((uint32_t) (__CLZ(-in) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1U); + } + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + */ + CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + q15_t * pRecipTable) + { + q15_t out = 0; + uint32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ( in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFFu - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + } + + +/* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if !defined (ARM_MATH_DSP) + + /* + * @brief C custom defined QADD8 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QADD8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QSUB8 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QADD16( + uint32_t x, + uint32_t y) + { +/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ + q31_t r = 0, s = 0; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHADD16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHADD16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSUB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSUB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QASX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHASX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSAX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __QSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSAX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SHSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SMUSDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSDX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + /* + * @brief C custom defined SMUADX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUADX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + + /* + * @brief C custom defined QADD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __QADD( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); + } + + + /* + * @brief C custom defined QSUB for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __QSUB( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); + } + + + /* + * @brief C custom defined SMLAD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLAD( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLADX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLADX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLSDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMLSDX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALD( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALDX for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALDX( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMUAD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUAD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SMUSD for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SXTB16 for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE uint32_t __SXTB16( + uint32_t x) + { + return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); + } + + /* + * @brief C custom defined SMMLA for M3 and M0 processors + */ + CMSIS_INLINE __STATIC_INLINE int32_t __SMMLA( + int32_t x, + int32_t y, + int32_t sum) + { + return (sum + (int32_t) (((int64_t) x * y) >> 32)); + } + +#endif /* !defined (ARM_MATH_DSP) */ + + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] S points to an instance of the Q7 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] S points to an instance of the Q15 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if + * numTaps is not a supported value. + */ + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q15; + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_casd_df1_inst_f32; + + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f64; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q31; + + + /** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch); + + + /** + * @brief Q31, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + + /** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + + /** + * @brief Q31 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t * pData); + + + /** + * @brief Q15 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t * pData); + + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ + void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t * pData); + + + + /** + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#if !defined (ARM_MATH_DSP) + q15_t A1; + q15_t A2; +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q31; + + /** + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] S points to an instance of the q15 PID Control structure + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Q7 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q31; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + +/* Deprecated */ + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix2_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q15; + +void arm_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q31; + +void arm_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_f32; + + void arm_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32 ( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen); + +void arm_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] S points to an instance of the Q31 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] S points to an instance of the Q15 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + + /** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f32( + float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q31( + q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + + /** + * @brief Dot product of Q7 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q7( + q7_t * pSrcA, + q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + + /** + * @brief Dot product of Q15 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Dot product of Q31 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_f32( + float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q7( + q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q15( + q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q31( + q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q7 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Partial convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_f32; + + + /** + * @brief Processing function for the floating-point FIR decimator. + * @param[in] S points to an instance of the floating-point FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR decimator. + * @param[in,out] S points to an instance of the floating-point FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q31( + arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_stereo_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f64; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 * S, + uint8_t numStages, + float64_t * pCoeffs, + float64_t * pState); + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pkCoeffs, + float32_t * pvCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pkCoeffs, + q31_t * pvCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the Q15 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + */ + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pkCoeffs, + q15_t * pvCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q31; + + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Correlation of Q15 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ + void arm_correlate_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + + void arm_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + + void arm_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ + void arm_correlate_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_correlate_opt_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] S points to an instance of the floating-point sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] S points to an instance of the Q31 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] S points to an instance of the Q15 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] S points to an instance of the Q7 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cos output. + */ + void arm_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal); + + + /** + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cosine output. + */ + void arm_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal); + + + /** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
    +   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
    +   *    A0 = Kp + Ki + Kd
    +   *    A1 = (-Kp ) - (2 * Kd )
    +   *    A2 = Kd  
    + * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup PID + * @{ + */ + + /** + * @brief Process function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 64-bit accumulator. + * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + * Thus, if the accumulator result overflows it wraps around rather than clip. + * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31U); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + + /** + * @brief Process function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using a 64-bit internal accumulator. + * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + * Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + +#if defined (ARM_MATH_DSP) + __SIMD32_TYPE *vstate; + + /* Implementation of PID controller */ + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + vstate = __SIMD32_CONST(S->state); + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)*vstate, (uint64_t)acc); +#else + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0]; + acc += (q31_t) S->A2 * S->state[1]; +#endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + /** + * @} end of PID group + */ + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * dst); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup clarke + * @{ + */ + + /** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + */ + CMSIS_INLINE __STATIC_INLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); + } + + + /** + * @brief Clarke transform for Q31 version + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + /** + * @} end of clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_clarke + * @{ + */ + + /** + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; + } + + + /** + * @brief Inverse Clarke transform for Q31 version + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the subtraction, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + } + + /** + * @} end of inv_clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q15( + q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup park + * @{ + */ + + /** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * The function implements the forward Park transform. + * + */ + CMSIS_INLINE __STATIC_INLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + } + + + /** + * @brief Park transform for Q31 version + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + /** + * @} end of park group + */ + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q7_to_float( + q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_park + * @{ + */ + + /** + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + } + + + /** + * @brief Inverse Park transform for Q31 version + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + CMSIS_INLINE __STATIC_INLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + } + + /** + * @} end of Inverse park group + */ + + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_float( + q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
    +   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
    +   *       where x0, x1 are nearest values of input x
    +   *             y0, y1 are nearest values to output y
    +   * 
    + * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x) + { + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (int32_t) ((x - S->x1) / xSpacing); + + if (i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if ((uint32_t)i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues - 1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i + 1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); + + } + + /* returns output value */ + return (y); + } + + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_linear_interp_q31( + q31_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (q31_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t) (((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1U); + } + } + + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_linear_interp_q15( + q15_t * pYData, + q31_t x, + uint32_t nValues) + { + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (int32_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (q15_t) (y >> 20); + } + } + + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ + CMSIS_INLINE __STATIC_INLINE q7_t arm_linear_interp_q7( + q7_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + uint32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + if (x < 0) + { + return (pYData[0]); + } + index = (x >> 20) & 0xfff; + + if (index >= (nValues - 1)) + { + return (pYData[nValues - 1]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (q7_t) (y >> 20); + } + } + + /** + * @} end of LinearInterpolate group + */ + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + float32_t arm_sin_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q31_t arm_sin_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q15_t arm_sin_q15( + q15_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + float32_t arm_cos_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q31_t arm_cos_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q15_t arm_cos_q15( + q15_t x); + + + /** + * @ingroup groupFastMath + */ + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
    +   *      x1 = x0 - f(x0)/f'(x0)
    +   * 
    + * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
    +   *     x0 = in/2                         [initial guess]
    +   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
    +   * 
    + */ + + + /** + * @addtogroup SQRT + * @{ + */ + + /** + * @brief Floating-point square root function. + * @param[in] in input value. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + CMSIS_INLINE __STATIC_INLINE arm_status arm_sqrt_f32( + float32_t in, + float32_t * pOut) + { + if (in >= 0.0f) + { + +#if (__FPU_USED == 1) && defined ( __CC_ARM ) + *pOut = __sqrtf(in); +#elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined(__GNUC__) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000) + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + } + + + /** + * @brief Q31 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut); + + + /** + * @brief Q15 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q15( + q15_t in, + q15_t * pOut); + + /** + * @} end of SQRT group + */ + + + /** + * @brief floating-point Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (int32_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q15 Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q15 Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q15_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q7 Circular Read function. + */ + CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q7_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + + /** + * @brief Mean value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Mean value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + + /** + * @brief Q31 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + + /** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q31( + q31_t * pSrcCmplx, + q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + */ + void arm_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_t * index); + + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q31( + float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q15( + q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_float( + q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q7( + q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
    +   *   typedef struct
    +   *   {
    +   *     uint16_t numRows;
    +   *     uint16_t numCols;
    +   *     float32_t *pData;
    +   * } arm_bilinear_interp_instance_f32;
    +   * 
    + * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
    +   *     XF = floor(x)
    +   *     YF = floor(y)
    +   * 
    + * \par + * The interpolated output point is computed as: + *
    +   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
    +   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
    +   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
    +   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
    +   * 
    + * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + + /** + * + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y) + { + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) + { + return (0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex - 1) * S->numCols; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex - 1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + } + + + /** + * + * @brief Q31 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y) + { + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11U; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; + x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11U; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; + y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return ((q31_t)(acc << 2)); + } + + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4U); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4U); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4U); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y2 * (xfract)) >> 4U); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return ((q15_t)(acc >> 36)); + } + + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return ((q7_t)(acc >> 40)); + } + + /** + * @} end of BilinearInterpolate group + */ + + +/* SMMLAR */ +#define multAcc_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMLSR */ +#define multSub_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMULR */ +#define mult_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) + +/* SMMLA */ +#define multAcc_32x32_keep32(a, x, y) \ + a += (q31_t) (((q63_t) x * y) >> 32) + +/* SMMLS */ +#define multSub_32x32_keep32(a, x, y) \ + a -= (q31_t) (((q63_t) x * y) >> 32) + +/* SMMUL */ +#define mult_32x32_keep32(a, x, y) \ + a = (q31_t) (((q63_t) x * y ) >> 32) + + +#if defined ( __CC_ARM ) + /* Enter low optimization region - place directly above function definition */ + #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") + #else + #define LOW_OPTIMIZATION_EXIT + #endif + + /* Enter low optimization region - place directly above function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __GNUC__ ) + #define LOW_OPTIMIZATION_ENTER \ + __attribute__(( optimize("-O1") )) + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __ICCARM__ ) + /* Enter low optimization region - place directly above function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define LOW_OPTIMIZATION_EXIT + + /* Enter low optimization region - place directly above function definition */ + #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 ) + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TI_ARM__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __CSMC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TASKING__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#endif + + +#ifdef __cplusplus +} +#endif + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) +#pragma GCC diagnostic pop + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#else + #error Unknown compiler +#endif + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/platform/CMSIS/Include/cmsis_armcc.h b/platform/CMSIS/Include/cmsis_armcc.h new file mode 100755 index 0000000..093d35b --- /dev/null +++ b/platform/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,870 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/platform/CMSIS/Include/cmsis_armclang.h b/platform/CMSIS/Include/cmsis_armclang.h new file mode 100755 index 0000000..5c4c20e --- /dev/null +++ b/platform/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1877 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/platform/CMSIS/Include/cmsis_compiler.h b/platform/CMSIS/Include/cmsis_compiler.h new file mode 100755 index 0000000..94212eb --- /dev/null +++ b/platform/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/platform/CMSIS/Include/cmsis_gcc.h b/platform/CMSIS/Include/cmsis_gcc.h new file mode 100755 index 0000000..91a7c9c --- /dev/null +++ b/platform/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2092 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.3 + * @date 16. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + register uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/platform/CMSIS/Include/cmsis_iccarm.h b/platform/CMSIS/Include/cmsis_iccarm.h new file mode 100755 index 0000000..edcaee3 --- /dev/null +++ b/platform/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,913 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.5 + * @date 10. January 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/platform/CMSIS/Include/cmsis_version.h b/platform/CMSIS/Include/cmsis_version.h new file mode 100755 index 0000000..660f612 --- /dev/null +++ b/platform/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/platform/CMSIS/Include/core_armv8mbl.h b/platform/CMSIS/Include/core_armv8mbl.h new file mode 100755 index 0000000..47a3989 --- /dev/null +++ b/platform/CMSIS/Include/core_armv8mbl.h @@ -0,0 +1,1896 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Armv8-M Baseline */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Armv8-M Baseline */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_armv8mml.h b/platform/CMSIS/Include/core_armv8mml.h new file mode 100755 index 0000000..0951a1f --- /dev/null +++ b/platform/CMSIS/Include/core_armv8mml.h @@ -0,0 +1,2960 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm0.h b/platform/CMSIS/Include/core_cm0.h new file mode 100755 index 0000000..a3f1b9a --- /dev/null +++ b/platform/CMSIS/Include/core_cm0.h @@ -0,0 +1,888 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.3 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm0plus.h b/platform/CMSIS/Include/core_cm0plus.h new file mode 100755 index 0000000..f8f30c3 --- /dev/null +++ b/platform/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,1023 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M0+ */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M0+ */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; + +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm23.h b/platform/CMSIS/Include/core_cm23.h new file mode 100755 index 0000000..7d1d478 --- /dev/null +++ b/platform/CMSIS/Include/core_cm23.h @@ -0,0 +1,1899 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< @Deprecated TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< @Deprecated TPI ACPR: PRESCALER Mask */ + +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm3.h b/platform/CMSIS/Include/core_cm3.h new file mode 100755 index 0000000..a2c0d08 --- /dev/null +++ b/platform/CMSIS/Include/core_cm3.h @@ -0,0 +1,1933 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 08. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< @Deprecated TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< @Deprecated TPI ACPR: PRESCALER Mask */ + +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm33.h b/platform/CMSIS/Include/core_cm33.h new file mode 100755 index 0000000..b1efbca --- /dev/null +++ b/platform/CMSIS/Include/core_cm33.h @@ -0,0 +1,2963 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 08. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_PCS_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< @Deprecated TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< @Deprecated TPI ACPR: PRESCALER Mask */ + +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm4.h b/platform/CMSIS/Include/core_cm4.h new file mode 100755 index 0000000..a11a381 --- /dev/null +++ b/platform/CMSIS/Include/core_cm4.h @@ -0,0 +1,2118 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 08. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< @Deprecated TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< @Deprecated TPI ACPR: PRESCALER Mask */ + +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_cm7.h b/platform/CMSIS/Include/core_cm7.h new file mode 100755 index 0000000..1fe53bf --- /dev/null +++ b/platform/CMSIS/Include/core_cm7.h @@ -0,0 +1,2660 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 08. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< @Deprecated TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< @Deprecated TPI ACPR: PRESCALER Mask */ + +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_INLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_INLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_INLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_INLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_INLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + register uint32_t ccsidr; + register uint32_t sets; + register uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_INLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_INLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_INLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_sc000.h b/platform/CMSIS/Include/core_sc000.h new file mode 100755 index 0000000..9aab5e5 --- /dev/null +++ b/platform/CMSIS/Include/core_sc000.h @@ -0,0 +1,1016 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.3 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/core_sc300.h b/platform/CMSIS/Include/core_sc300.h new file mode 100755 index 0000000..a569ef2 --- /dev/null +++ b/platform/CMSIS/Include/core_sc300.h @@ -0,0 +1,1903 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.3 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED1[1U]; +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/platform/CMSIS/Include/mpu_armv7.h b/platform/CMSIS/Include/mpu_armv7.h new file mode 100755 index 0000000..aa180c9 --- /dev/null +++ b/platform/CMSIS/Include/mpu_armv7.h @@ -0,0 +1,197 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) + +#define ARM_MPU_AP_NONE 0U +#define ARM_MPU_AP_PRIV 1U +#define ARM_MPU_AP_URO 2U +#define ARM_MPU_AP_FULL 3U +#define ARM_MPU_AP_PRO 5U +#define ARM_MPU_AP_RO 6U + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size ) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (MPU_RASR_ENABLE_Msk)) + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/platform/CMSIS/Include/mpu_armv8.h b/platform/CMSIS/Include/mpu_armv8.h new file mode 100755 index 0000000..0ccfc74 --- /dev/null +++ b/platform/CMSIS/Include/mpu_armv8.h @@ -0,0 +1,333 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Pos) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/platform/CMSIS/Include/tz_context.h b/platform/CMSIS/Include/tz_context.h new file mode 100755 index 0000000..0d09749 --- /dev/null +++ b/platform/CMSIS/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/platform/board/board.S b/platform/board/board.S new file mode 100755 index 0000000..1b4dd3a --- /dev/null +++ b/platform/board/board.S @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------------------------------*/ +/* @file: board.S */ +/* ---------------------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2015 , Freescale Semiconductor, Inc. */ +/* Copyright 2017-2020 NXP */ +/* */ +/* Redistribution and use in source and binary forms, with or without modification, */ +/* are permitted provided that the following conditions are met: */ +/* */ +/* o Redistributions of source code must retain the above copyright notice, this list */ +/* of conditions and the following disclaimer. */ +/* */ +/* o Redistributions in binary form must reproduce the above copyright notice, this */ +/* list of conditions and the following disclaimer in the documentation and/or */ +/* other materials provided with the distribution. */ +/* */ +/* o Neither the name of the copyright holder nor the names of its */ +/* contributors may be used to endorse or promote products derived from this */ +/* software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND */ +/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ +/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR */ +/* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ +/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; */ +/* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ +/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ +/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*****************************************************************************/ +/* Version: GCC for ARM Embedded Processors */ +/*****************************************************************************/ + +#define ASM_CODE + + .syntax unified + .arch armv7-m + .text + + .align 4 + .globl board_lib_init_array + .weak board_lib_init_array + .type board_lib_init_array, %function +board_lib_init_array: + push {lr} +#ifdef DEBUG + bl __libc_init_array +#endif + pop {lr} + bx lr + diff --git a/platform/board/board_common.c b/platform/board/board_common.c new file mode 100755 index 0000000..8972f16 --- /dev/null +++ b/platform/board/board_common.c @@ -0,0 +1,303 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Implementation file containing the board API. + * + * @addtogroup BRD_SVC BRD: Board Interface + * + * Common code used by all board ports. Common shims for object package + * recompile (tests, monitor, etc.) Some common DRC code. + */ +/*==========================================================================*/ + +/* Includes */ + +#ifdef DEBUG + #include +#endif +#include "main/main.h" +#include "main/board.h" +#include "main/monitor.h" +#include "test/common/test.h" +#include "drivers/wdog32/fsl_wdog32.h" + +/* Forced Error */ + +#ifdef FORCE_COMPILE_ERROR + #error Forced error for testing +#endif + +/* Local Defines */ + +#define CALL_TEST_DRV(X) TEMP_TEST_DRV(X) +#define TEMP_TEST_DRV(X) test_drv_##X + +#define CALL_TEST_SC(X) TEMP_TEST_SC(X) +#define TEMP_TEST_SC(X) test_sc_##X + +#define CALL_TEST_AP(X) TEMP_TEST_AP(X) +#define TEMP_TEST_AP(X) test_ap_##X + +/* Local Functions */ + +/* Local Variables */ + +static sc_bool_t ddr_tick_enable = SC_FALSE; +static sc_bool_t ddr_derate_tick_enable = SC_FALSE; + +/* Global Variables */ + +#ifdef DEBUG + sc_bool_t debug = SC_TRUE; +#else + sc_bool_t debug = SC_FALSE; +#endif + +int8_t debug_level = DEBUG_LEVEL; + +#ifdef HAS_TEST + sc_bool_t has_test = SC_TRUE; +#else + sc_bool_t has_test = SC_FALSE; +#endif + +#ifdef TEST_ALL + sc_bool_t test_all = SC_TRUE; +#else + sc_bool_t test_all = SC_FALSE; +#endif + +#if defined(MONITOR) || defined(EXPORT_MONITOR) + sc_bool_t has_monitor = SC_TRUE; +#else + sc_bool_t has_monitor = SC_FALSE; +#endif + +#ifdef XRDC_NOCHECK + sc_bool_t xrdc_nocheck = SC_TRUE; +#else + sc_bool_t xrdc_nocheck = SC_FALSE; +#endif + +#ifdef DIRTY + sc_bool_t pkit_dirty = SC_TRUE; +#else + sc_bool_t pkit_dirty = SC_FALSE; +#endif + +/*--------------------------------------------------------------------------*/ +/* Driver test shim */ +/*--------------------------------------------------------------------------*/ +sc_err_t test_drv(sc_bool_t *const stop) +{ + #ifdef HAS_TEST + CALL_TEST_DRV(TEST)(stop); + #else + *stop = SC_FALSE; + #endif + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* SCU test shim */ +/*--------------------------------------------------------------------------*/ +sc_err_t test_sc(sc_bool_t *const stop) +{ + #ifdef HAS_TEST + CALL_TEST_SC(TEST)(stop); + #else + *stop = SC_FALSE; + #endif + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* AP test shim */ +/*--------------------------------------------------------------------------*/ +sc_err_t test_ap(sc_bool_t *const stop) +{ + #ifdef HAS_TEST + CALL_TEST_AP(TEST)(stop); + #else + *stop = SC_FALSE; + #endif + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Run monitor */ +/*--------------------------------------------------------------------------*/ +void board_monitor(void) +{ + #ifdef MONITOR + monitor(); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Shim for system exit */ +/*--------------------------------------------------------------------------*/ +void board_exit(int32_t status) +{ + #ifdef DEBUG + exit((int) status); + #else + board_fault(SC_FALSE, BOARD_BFAULT_EXIT, SC_PT); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Shim for setvbuf */ +/*--------------------------------------------------------------------------*/ +void board_stdio(void) +{ + #ifdef DEBUG + (void) setvbuf(stdin, NULL, _IONBF, 0); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Shim for system exit */ +/*--------------------------------------------------------------------------*/ +void board_wdog_disable(sc_bool_t lp) +{ + /* Watchdog disable is called from nowhere else in the code but here. + This can be modified if concerned about watchdog disable. */ + +#if !defined(SIMU) && !defined(NO_WDOG_DIS) + #ifndef DEBUG + if (lp != SC_FALSE) + #endif + { + /* Disable the WDOG */ + WDOG32_Deinit(WDOG_SC); + } +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Conditional printf */ +/*--------------------------------------------------------------------------*/ +void board_printf(const char *fmt, ...) +{ + #ifdef DEBUG + va_list args; + + if (debug == SC_FALSE) + { + return; + } + + va_start(args, fmt); + + #if defined(SIMU) + (void) vfprintf(stderr, fmt, args); + #else + if (SCFW_DBG_READY != 0U) + { + (void) vfprintf(stderr, fmt, args); + } + else + { + SCFW_DBG_SKIPS++; + } + #endif + + va_end(args); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* DDR periodic enable */ +/*--------------------------------------------------------------------------*/ +void board_ddr_periodic_enable(sc_bool_t enb) +{ + if (board_ddr_period_ms != 0U) + { + ddr_tick_enable = enb; + } +} + +/* DDR derate periodic enable */ +/*--------------------------------------------------------------------------*/ +void board_ddr_derate_periodic_enable(sc_bool_t enb) +{ + if (board_ddr_derate_period_ms != 0U) + { + ddr_derate_tick_enable = enb; + } +} + +/*--------------------------------------------------------------------------*/ +/* Common board tick */ +/*--------------------------------------------------------------------------*/ +void board_common_tick(uint16_t msec) +{ + if ((ddr_tick_enable != SC_FALSE) || (ddr_derate_tick_enable != SC_FALSE)) + { + static uint32_t ddr_mseconds = 0U; + static uint32_t ddr_derate_mseconds = 0U; + + /* Tick DDR */ + ddr_mseconds += msec; + ddr_derate_mseconds += msec; + + /* Handle DDR periodic tick */ + if ((ddr_tick_enable != SC_FALSE) && (board_ddr_period_ms != 0U) && (ddr_mseconds >= board_ddr_period_ms)) + { + ddr_mseconds = 0U; + + (void) board_ddr_config(SC_FALSE, BOARD_DDR_PERIODIC); + } + + /* Handle DDR derate periodic tick */ + if ((ddr_derate_tick_enable != SC_FALSE) && (board_ddr_derate_period_ms != 0U) && (ddr_derate_mseconds >= board_ddr_derate_period_ms)) + { + ddr_derate_mseconds = 0U; + + (void) board_ddr_config(SC_FALSE, BOARD_DDR_DERATE_PERIODIC); + } + } + + /* User tick */ + board_tick(msec); +} + diff --git a/platform/board/board_common.h b/platform/board/board_common.h new file mode 100755 index 0000000..30a9b68 --- /dev/null +++ b/platform/board/board_common.h @@ -0,0 +1,157 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing some common board funtions. + * + * @addtogroup BRD_SVC BRD: Board Interface + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_COMMON_H +#define SC_BOARD_COMMON_H + +/* Includes */ + +/* Defines */ + +/* External variables */ + +/*! Shim debug variable (to allow object package config) */ +extern sc_bool_t debug; + +/*! Shim debug level variable (to allow object package config) */ +extern int8_t debug_level; + +/*! Shim has_test variable (to allow object package config) */ +extern sc_bool_t has_test; + +/*! Shim test_all variable (to allow object package config) */ +extern sc_bool_t test_all; + +/*! Shim has_monitor variable (to allow object package config) */ +extern sc_bool_t has_monitor; + +/*! Shim xrdc_nocheck variable (to allow object package config) */ +extern sc_bool_t xrdc_nocheck; + +/*! Shim pkit_dirty variable (to allow object package config) */ +extern sc_bool_t pkit_dirty; + +/* Functions */ + +/*! + * Shim test function (to allow test inclusion from object packages) + * + * @param[in] stop flag indicating if test run should stop + * + * @return Returns an error code (SC_ERR_NONE = success) + */ +sc_err_t test_drv(sc_bool_t *const stop); + +/*! + * Shim test function (to allow test inclusion from object packages) + * + * @param[in] stop flag indicating if test run should stop + * + * @return Returns an error code (SC_ERR_NONE = success) + */ +sc_err_t test_sc(sc_bool_t *const stop); + +/*! + * Shim test function (to allow test inclusion from object packages) + * + * @param[in] stop flag indicating if test run should stop + * + * @return Returns an error code (SC_ERR_NONE = success) + */ +sc_err_t test_ap(sc_bool_t *const stop); + +/*! + * Shim monitor function (to allow monitor inclusion from object packages) + */ +void board_monitor(void); + +/*! + * Shim for exit() + */ +void board_exit(int32_t status); + +/*! + * Shim for setvbuf() + */ +void board_stdio(void); + +/*! + * Shim for watchdog disable + * + * @param[in] lp SC_TRUE = entry of KS1 LP mode + */ +void board_wdog_disable(sc_bool_t lp); + +/*! + * Conditional printf + */ +void board_printf(const char *fmt, ...); + +/*! + * Enable/disable the DDR periodic tick. + * + * @param[in] enb enable flag (SC_TRUE = on) + */ +void board_ddr_periodic_enable(sc_bool_t enb); + +/*! + * Enable/disable the DDR derate periodic tick. + * + * @param[in] enb enable flag (SC_TRUE = on) + */ +void board_ddr_derate_periodic_enable(sc_bool_t enb); + +/*! + * Common function to tick the board. + * + * @param[in] msec number of mS to increment + */ +void board_common_tick(uint16_t msec); + +/** @} */ + +#endif /* SC_BOARD_COMMON_H */ + diff --git a/platform/board/config.h b/platform/board/config.h new file mode 100755 index 0000000..0fcf2b6 --- /dev/null +++ b/platform/board/config.h @@ -0,0 +1,78 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the board subsystem. + * + * @addtogroup BOARD + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_BRD_CONFIG_H +#define SC_BRD_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define BRD_NUM_RSRC_BRD 11U + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_BRD \ + "PMIC_0", \ + "PMIC_1", \ + "PMIC_2", \ + "BOARD_R0", \ + "BOARD_R1", \ + "BOARD_R2", \ + "BOARD_R3", \ + "BOARD_R4", \ + "BOARD_R5", \ + "BOARD_R6", \ + "BOARD_R7", \ + +#endif + +#endif /* SC_BRD_CONFIG_H */ + +/** @} */ + diff --git a/platform/board/drivers/pca6416a/pca6416a.c b/platform/board/drivers/pca6416a/pca6416a.c new file mode 100755 index 0000000..d0b35d9 --- /dev/null +++ b/platform/board/drivers/pca6416a/pca6416a.c @@ -0,0 +1,135 @@ +/* +** ################################################################### +** +** Copyright 2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Implementation of PCA6416A functions + */ +/*==========================================================================*/ + +/* Includes */ + +#include "drivers/pmic/fsl_pmic.h" +#include "board/drivers/pca6416a/pca6416a.h" + +/* Local Defines */ + +/*! + * @name I2C Bus Expander Registers + */ +/** @{ */ +#define BUS_EXP_IN_REG 0x00U +#define BUS_EXP_OUT_REG 0x02U +#define BUS_EXP_POL_REG 0x04U +#define BUS_EXP_CONF_REG 0x06U +/** @} */ + +/*--------------------------------------------------------------------------*/ +/* Write pin direction register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_WritePinDirection(uint8_t device_addr, uint8_t port, + uint8_t dir) +{ + uint8_t temp = dir; + + /* Return result */ + return i2c_write(device_addr, BUS_EXP_CONF_REG + port, &temp, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Read pin direction register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_ReadPinDirection(uint8_t device_addr, uint8_t port, + uint8_t *dir) +{ + /* Return result */ + return i2c_read(device_addr, BUS_EXP_CONF_REG + port, dir, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Write pin polarity register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_WritePinPolarity(uint8_t device_addr, uint8_t port, + uint8_t pol) +{ + uint8_t temp = pol; + + /* Return result */ + return i2c_write(device_addr, BUS_EXP_POL_REG + port, &temp, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Read pin polarity register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_ReadPinPolarity(uint8_t device_addr, uint8_t port, + uint8_t *pol) +{ + /* Return result */ + return i2c_read(device_addr, BUS_EXP_POL_REG + port, pol, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Write pin output register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_WritePinOutput(uint8_t device_addr, uint8_t port, + uint8_t out) +{ + uint8_t temp = out; + + /* Return result */ + return i2c_write(device_addr, BUS_EXP_OUT_REG + port, &temp, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Read pin output register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_ReadPinOutput(uint8_t device_addr, uint8_t port, + uint8_t *out) +{ + /* Return result */ + return i2c_read(device_addr, BUS_EXP_OUT_REG + port, out, 1U); +} + +/*--------------------------------------------------------------------------*/ +/* Read pin input register */ +/*--------------------------------------------------------------------------*/ +status_t PCA6416A_ReadPinInput(uint8_t device_addr, uint8_t port, + uint8_t *in) +{ + /* Return result */ + return i2c_read(device_addr, BUS_EXP_IN_REG + port, in, 1U); +} + diff --git a/platform/board/drivers/pca6416a/pca6416a.h b/platform/board/drivers/pca6416a/pca6416a.h new file mode 100755 index 0000000..cd7e0b2 --- /dev/null +++ b/platform/board/drivers/pca6416a/pca6416a.h @@ -0,0 +1,142 @@ +/* +** ################################################################### +** +** Copyright 2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * @brief Functions for PCA6416A. + * + * @addtogroup pca6416a_driver PCA6416A: PCA6416A Driver + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PCA6416A_H +#define SC_PCA6416A_H + +/* Includes */ + +#include "drivers/pmic/fsl_pmic.h" + +/* Functions */ + +/*! + * This function writes the pin direction regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[in] dir direction (0=output, 1=input) + * + * @return Returns the I2C status. + */ +status_t PCA6416A_WritePinDirection(uint8_t device_addr, uint8_t port, + uint8_t dir); + +/*! + * This function reads the pin direction regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[out] dir pointer to return the direction (0=output, 1=input) + * + * @return Returns the I2C status. + */ +status_t PCA6416A_ReadPinDirection(uint8_t device_addr, uint8_t port, + uint8_t *dir); + +/*! + * This function writes the pin polarity regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[in] pol polarity (1=invert) + * + * @return Returns the I2C status. + */ +status_t PCA6416A_WritePinPolarity(uint8_t device_addr, uint8_t port, + uint8_t pol); + +/*! + * This function reads the pin polarity regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[out] pol pointer to return the polarity (1=invert) + * + * @return Returns the I2C status. + */ +status_t PCA6416A_ReadPinPolarity(uint8_t device_addr, uint8_t port, + uint8_t *pol); + +/*! + * This function writes the pin output regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[in] out output value + * + * @return Returns the I2C status. + */ +status_t PCA6416A_WritePinOutput(uint8_t device_addr, uint8_t port, + uint8_t out); + +/*! + * This function reads the pin output regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[out] out pointer to return the output + * + * @return Returns the I2C status. + */ +status_t PCA6416A_ReadPinOutput(uint8_t device_addr, uint8_t port, + uint8_t *out); + +/*! + * This function reads the pin input regsiter. + * + * @param[in] device_addr I2C address + * @param[in] port expander port + * @param[out] in input + * + * @return Returns the I2C status. + */ +status_t PCA6416A_ReadPinInput(uint8_t device_addr, uint8_t port, + uint8_t *in); + + /** @} */ + + #endif /* SC_PCA6416A_H */ + diff --git a/platform/board/mx8dxl_evk/Makefile b/platform/board/mx8dxl_evk/Makefile new file mode 100755 index 0000000..a1f4813 --- /dev/null +++ b/platform/board/mx8dxl_evk/Makefile @@ -0,0 +1,63 @@ +## ################################################################### +## +## Copyright 2019-2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8dxl_dcd_emul +else + DDR_CON ?= imx8dxl_dcd_1.2GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o \ + $(OUT)/board/drivers/pca6416a/pca6416a.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) \ + $(OUT)/board/drivers/pca6416a + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8dxl_evk/board.bom b/platform/board/mx8dxl_evk/board.bom new file mode 100755 index 0000000..4062849 --- /dev/null +++ b/platform/board/mx8dxl_evk/board.bom @@ -0,0 +1,39 @@ +## ################################################################### +## +## Copyright 2019-2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif diff --git a/platform/board/mx8dxl_evk/board.c b/platform/board/mx8dxl_evk/board.c new file mode 100755 index 0000000..2013765 --- /dev/null +++ b/platform/board/mx8dxl_evk/board.c @@ -0,0 +1,1483 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8DXL EVK board. + * + * @addtogroup MX8DXL_EVK_BRD BRD: MX8DXL EVK Board + * + * Module for MX8DXL EVK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00130 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/igpio/fsl_gpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" +#include "drivers/systick/fsl_systick.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "board/drivers/pca6416a/pca6416a.h" +#include "drivers/nic400/fsl_nic400.h" +#ifdef HAS_SECO +#include "drivers/seco/fsl_seco.h" +#endif + +/* Local Defines */ + +#if defined(BD_DDR_RET_REGION1_SIZE) && (BD_DDR_RET_REGION1_SIZE <= 12) + #ifndef BD_DDR_SIZE + /*! NXP DXL DDR3L EVK board */ + #define BD_DDR_SIZE SC_512MB + #endif +#else + /*! NXP DXL LPDDR4 EVK board */ + #ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_1GB + #endif + #define HAS_VDD_MII_SELECT +#endif + +/*! I2C Bus Expander Address */ +#define BUS_EXP_ADDR 0x20U + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_R0 3U /*!< PCA9548APW - U75 */ +#define BRD_R_BOARD_R1 4U /*!< PCA6416APW - U80 */ +#define BRD_R_BOARD_R2 5U /*!< PCA6416APW - U84 */ +#define BRD_R_BOARD_R3 6U /*!< PCA9548APW - U76 */ +#define BRD_R_BOARD_R4 7U /*!< PCA6416APW - U82 */ +#define BRD_R_BOARD_R5 8U /*!< PCA6416APW - U101 (rev A) */ +#define BRD_R_BOARD_R6 9U /*!< VDD_MII_SELECT (rev B) */ +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_SCU_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 2U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm; +static uint8_t dir_cache = 0xFFU; +static uint8_t out_cache = 0xFFU; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 0U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + ss_print(3, "board_init(%d)\n", phase); + + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if defined(ALT_DEBUG_SCU_UART) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SCL, SC_P_PMIC_I2C_SDA, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_INTERNAL; + break; + /* Spread Spectrum SPREAD value for PCIE DPLL */ + case BOARD_PARM_PCIE_DPLL_SS: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + rtn = BOARD_KS1_RESUME_USEC; + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; +#ifndef EMUL + /* VDD_MEMC voltage */ + case BOARD_PARM_VDD_MEMC: + rtn = BOARD_PARM_RTN_VDD_MEMC_OD; + break; +#endif + /* Control if SC WDOG configuration during KS1 */ + case BOARD_PARM_KS1_WDOG_WAKE: + rtn = BOARD_PARM_KS1_WDOG_WAKE_ENABLE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + +#ifdef EMUL + if(rsrc == SC_R_PMIC_0) + { + rtn = SC_FALSE; + } +#endif + if(rsrc == SC_R_PMIC_1) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. + */ + + sc_err_t err = SC_ERR_NONE; + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR0_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + default: + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t mr_temp; + sc_saddr_t fw_addr = 0UL; + sc_saddr_t fw_start = 0x87FC0000UL; + sc_saddr_t fw_end = 0x87FFFFFFUL; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Note this code is system specific. Customers should statically define + the V2X FW space. */ + + /* Query V2X for FW address */ + if (soc_aux_get_fw_addr(SOC_IDX_AUX_0, &fw_addr) == SC_ERR_NONE) + { + /* DDR? */ + if (fw_addr >= DDR_BASE0) + { + fw_start = fw_addr & ~0xFFFUL; + } + /* FlexSPI? */ + else if (fw_addr >= FSPI0_MEM_BASE) + { + /* SCFW must be able to reload the V2X FW each time the V2X is powered + * down. It also has to be reloaded if V2X generates a serious error + * IRQ. The owner of the FlexSPI must insure it remains accessible + * (configured and clocked). Otherwise, use the mkimage dummy target + * to relocate the V2X FW out of FlexSPI to OCRAM or DDR. + */ + fw_start = fw_addr & ~0xFFFUL; + /* Assumes 128K for V2X FW and following is SCFW */ + fw_end = fw_start + 0x1FFFFUL; + } + /* OCRAM? */ + else if (fw_addr >= OCRAM_BASE) + { + fw_start = fw_addr & ~0xFFFUL; + fw_end = 0x0013FFFFUL; + } + /* Unknown */ + else + { + fw_start = 0UL; + } + } + + /* Allocate V2X memory */ + if ((fw_start != 0UL) && (ddrtest == SC_FALSE)) + { + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, + U64(fw_start), U64(fw_end))); + BRD_ERR(rm_assign_memreg(pt_boot, SECO_PT, mr_temp)); + /*! @todo remove when V2X using IDs correctly */ + BRD_ERR(rm_set_memreg_permissions(SECO_PT, mr_temp, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + } + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[13U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_8B, + SC_R_GPT_4, + RM_RANGE(SC_R_CAN_0, SC_R_CAN_2), + SC_R_I2C_3, + SC_R_FSPI_0, + SC_R_SECO_MU_4, + SC_R_BOARD_R3, + SC_R_BOARD_R4, + SC_R_BOARD_R7 + }; + + /* List of pads */ + static const sc_pad_t pad_list[8U] = + { + RM_RANGE(SC_P_ADC_IN1, SC_P_ADC_IN2), + RM_RANGE(SC_P_FLEXCAN2_RX, SC_P_FLEXCAN2_TX), + RM_RANGE(SC_P_SPI1_SDI, SC_P_SPI1_CS0), + RM_RANGE(SC_P_QSPI0A_DATA0, SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0B) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x08FFFFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Move the M4 UART pads if not used for debug out */ + #ifndef ALT_DEBUG_SCU_UART + BRD_ERR(rm_assign_pad(pt_boot, pt_m4_0, SC_P_SCU_GPIO0_00)); + BRD_ERR(rm_assign_pad(pt_boot, pt_m4_0, SC_P_SCU_GPIO0_01)); + #endif + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[2U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + } + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } + +#ifdef ERR050601_WORKAROUND + /* Power up M4 MU for ddr stress test tool */ + if (ddrtest != SC_FALSE) + { + pm_force_resource_power_mode_v(SC_R_M4_0_MU_1A, + SC_PM_PW_MODE_ON); + } +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + uint32_t pmic_reg = 0U; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, &pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process bus expander resources */ + if ((pmic_ver.device_id != 0U) && (idx >= BRD_R_BOARD_R0) + && (idx <= BRD_R_BOARD_R4)) + { + uint8_t mask; + + /* Calculate mask */ + mask = BIT8(U8(idx) - BRD_R_BOARD_R0); + + /* Configure bus expander direction */ + if ((dir_cache & mask) != 0U) + { + out_cache &= ~mask; + (void) PCA6416A_WritePinOutput(BUS_EXP_ADDR, 0U, + out_cache); + dir_cache &= ~mask; + (void) PCA6416A_WritePinDirection(BUS_EXP_ADDR, 0U, + dir_cache); + } + + /* Flip bits */ + if (from_mode == SC_PM_PW_MODE_OFF) + { + out_cache |= mask; + } + else + { + out_cache &= ~mask; + } + + /* Write output */ + (void) PCA6416A_WritePinOutput(BUS_EXP_ADDR, 0U, + out_cache); + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else if ((type == SC_PM_RESET_TYPE_WARM) + && (reason == SC_PM_RESET_REASON_V2X_DEBUG)) + { + /* Disable WDOG_OUT */ + PAD_SetMux(IOMUXD__JTAG_TRST_B, 4U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if (resource == SC_R_M4_0_PID0) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; +#ifdef HAS_VDD_MII_SELECT + case SC_R_BOARD_R6 : + if (val == 0U) + { + out_cache &= ~BIT8(5U); + } + else + { + out_cache |= BIT8(5U); + } + (void) PCA6416A_WritePinOutput(BUS_EXP_ADDR, 0U, + out_cache); + dir_cache &= ~BIT8(5U); + (void) PCA6416A_WritePinDirection(BUS_EXP_ADDR, 0U, + dir_cache); + break; +#endif + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; +#ifdef HAS_VDD_MII_SELECT + case SC_R_BOARD_R6 : + *val = (U32(out_cache) >> 5UL) & 0x1UL; + break; +#endif + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Temp alarm */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR)) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* EVK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, + PMIC_TEMP_MAX); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + uint32_t ks1_volt = 800U; + + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, ks1_volt, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + + +/*--------------------------------------------------------------------------*/ +/* Get the PMIC IDs and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A35 : + case SC_SUBSYS_DRC_0 : + case SC_SUBSYS_DB : + pmic_init(); + *pmic_reg = PF8100_SW2; + *num_regs = 1U; + break; + default: + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8dxl_evk/board.h b/platform/board/mx8dxl_evk/board.h new file mode 100755 index 0000000..d7d8a50 --- /dev/null +++ b/platform/board/mx8dxl_evk/board.h @@ -0,0 +1,92 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U + +#define PMIC_TEMP_MAX 135U + +#define PF8100_REGULATORS 12U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8dxl_evk/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8dxl_evk/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..2a4c4a7 --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,137 @@ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, // DXL does not require RDBI deskew, but need it defined here to aign the enum properly to allow VREF training command to be parsed + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + + diff --git a/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz.cfg b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz.cfg new file mode 100755 index 0000000..61d5d94 --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz.cfg @@ -0,0 +1,480 @@ +#define __ASSEMBLY__ + +#include +#include + + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80000420 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 1.24 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 1200MHz. */ + uint32_t rate2 = 600000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 1200MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x000000C8); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 // Gate functional clocks +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset (register configuration must be done with DDRC core under reset) +DATA 4 0x41C80204 0x1 // Ungate functional clocks + +//------------------------------------------- +// Configure controller registers +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +DATA 4 DDRC_MSTR_0 0x81080020 // Set LPDDR4, Burst length and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke, post_cke +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000063F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1718141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000302 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020010 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // DFI control update settings +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00050505 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x13131300 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x04040404 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x04040404 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ADDRMAP7_0 0x00000F0F // addrmap_row_b17, addrmap_row_b16 +DATA 4 DDRC_DBICTL_0 0x00000007 // read DBI, write DBI, Data Mask +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// Performance optimizations +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) + +// Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x07009100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config +//DDR power management settings +DATA 4 DDRC_PWRTMG_0 0x00402010 // Timers for automatic entry into powerdown, self-refresh +DATA 4 DDRC_PWRCTL_0 0x0000010A // Enable DDR low power feature (clock disabling, power down) +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + + + + + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010002 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00080123 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004567 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00085601 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004327 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // ADCP +DATA 4 DDR_PHY_PGCR2_0 0x00F00F2C // tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x01021080 // CKEN/CKNEN toggling and polarity +DATA 4 DDR_PHY_PGCR7_0 0x00000010 // AC read clock mode +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001BBBB // Impedance control for DQ bus + +//------------------------------------------- +// Configure and launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put AC PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 // Put DQ PLL in power down state +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x09604B10 +DATA 4 DDR_PHY_PTR1_0 0x075302A3 + +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR4, MR5 and MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength +DATA 4 DDR_PHY_MR11_0 0x66 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x06 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +DATA 4 DDR_PHY_MR12_0 0x12 // VREF(CA) +DATA 4 DDR_PHY_MR14_0 0x10 // VREF(DQ) +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x00696159 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000493E0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000012C // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00007530 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00096 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// No ODT signal for LPDDR4 DQ. So disable it. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM, ACRANKCLKSEL +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode +DATA 4 DDR_PHY_ACIOCR1_0 0x00000000 // A[15:0] OE mode selection +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0x90032010 // tVREF, DVINIT, DVMIN, DVMAX, DVINIT +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO, tVREFIO, SHREN, SHRNK +// Set-up PHY General Configuration Registers +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 // Internal VREF generator range selection (1'b1 = 7.69% - 53.49% of VDDQ) +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +// Set-up DATX8 DX Control Registers +DATA 4 DDR_PHY_DX8SLbDXCTL1_0 0x00840000 // DXRCLKMD +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1200 // POSOEX, PREOEX, LPWAKEUP_THRSH + +// Enable AC PHY PLL and/or IO to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x00190091 // LPWAKEUP_THRSH, LPPLLPD, LPIOPD + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM reset + DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM initialization +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// Wait DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch second DRAM initialization +DATA 4 DDR_PHY_PTR3_0 0x0000012C // tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 // Launch DRAM init + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +// Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Wait disabling of VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00000100 // BMRANK (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000071C7 // DTRPTN, RFSHDT +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// VREF training +//---------------------------------------------------------------// +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +// Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//---------------------------------------------------------------// +// DQS Drift registers +//---------------------------------------------------------------// +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 // Disable Read DQS Gating LCDL Delay VT Compensation +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 // DFTDLY, DFTB2BRD, DFTIDLRD, DFTDTEN +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 // Disable Drift idle read cycle and Drift back-to-back read cycles +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 // DFTTHRSH, DFTMNTPRD + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +// Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +//---------------------------------------------------------------// +// Check that controller is ready to operate +//---------------------------------------------------------------// +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +//---------------------------------------------------------------// +// Configure ECC (if enable required) +//---------------------------------------------------------------// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//---------------------------------------------------------------// +// DRC configuration end +//---------------------------------------------------------------// + + + + diff --git a/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_nocbt.cfg b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_nocbt.cfg new file mode 100755 index 0000000..775804f --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_nocbt.cfg @@ -0,0 +1,317 @@ +#define __ASSEMBLY__ + +#include +#include + + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80000420 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 1.5 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 // Gate functional clocks +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset (register configuration must be done with DDRC core under reset) +DATA 4 0x41C80204 0x1 // Ungate functional clocks + +//------------------------------------------- +// Configure controller registers +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +DATA 4 DDRC_MSTR_0 0x81080020 // Set LPDDR4, Burst length and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke, post_cke +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000063F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060C // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000302 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // DFI control update settings +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00050505 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x13131300 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x04040404 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x04040404 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ADDRMAP7_0 0x00000F0F // addrmap_row_b17, addrmap_row_b16 +DATA 4 DDRC_DBICTL_0 0x00000007 // read DBI, write DBI, Data Mask +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// Performance optimizations +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +// Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x07009100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config +// DDR power management settings +DATA 4 DDRC_PWRTMG_0 0x00402010 // Timers for automatic entry into powerdown, self-refresh, … +DATA 4 DDRC_PWRCTL_0 0x0000010A // Enable DDR low power feature (clock disabling, power down, …) +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010001 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00008765 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004231 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00008765 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004321 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // ADCP +DATA 4 DDR_PHY_PGCR2_0 0x00F00F2C // tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x01021080 // CKEN/CKNEN toggling and polarity +DATA 4 DDR_PHY_PGCR7_0 0x00000010 // AC read clock mode +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BB7B // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001BB5B // Impedance control for DQ bus + +//------------------------------------------- +// Configure and launch ZCAL + PLLINIT + DCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x32 +DATA 4 DDR_PHY_PIR_0 0x33 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR4, MR5 and MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength +DATA 4 DDR_PHY_MR11_0 0x66 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x06 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +DATA 4 DDR_PHY_MR12_0 0x12 // VREF(CA) +DATA 4 DDR_PHY_MR14_0 0x10 // VREF(DQ) +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x00726159 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x00249F00 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000960 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0003A980 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x027004B0 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// No ODT signal for LPDDR4 DQ. So disable it. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM, ACRANKCLKSEL +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode +DATA 4 DDR_PHY_ACIOCR1_0 0x00000000 // A[15:0] OE mode selection +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0x90032010 // tVREF, DVINIT, DVMIN, DVMAX, DVINIT set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO, tVREFIO, SHREN, SHRNK +// Set-up PHY General Configuration Registers +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 // Internal VREF generator range selection (1'b1 = 7.69% - 53.49% of VDDQ) +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +// Set-up DATX8 DX Control Registers +DATA 4 DDR_PHY_DX8SLbDXCTL1_0 0x00840000 // DXRCLKMD +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1200 // POSOEX, PREOEX, LPWAKEUP_THRSH + +// Enable AC PHY PLL and/or IO to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x00190091 // LPWAKEUP_THRSH, LPPLLPD, LPIOPD + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM reset + DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM initialization +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// Wait DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch second DRAM initialization +DATA 4 DDR_PHY_PTR3_0 0x00000960 // tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 // Launch DRAM init + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Wait disabling of VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 // BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000071C7 // DTRPTN, RFSHDT +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// VREF training +//---------------------------------------------------------------// +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +// Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//---------------------------------------------------------------// +// DQS Drift registers +//---------------------------------------------------------------// +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 // Disable Read DQS Gating LCDL Delay VT Compensation +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 // DFTDLY, DFTB2BRD, DFTIDLRD, DFTDTEN +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 // Disable Drift idle read cycle and Drift back-to-back read cycles +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 // DFTTHRSH, DFTMNTPRD + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +// Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +//---------------------------------------------------------------// +// Check that controller is ready to operate +//---------------------------------------------------------------// +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + diff --git a/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_proto_1a.cfg b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_proto_1a.cfg new file mode 100755 index 0000000..f06d69e --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_1.2GHz_proto_1a.cfg @@ -0,0 +1,478 @@ +#define __ASSEMBLY__ + +#include +#include + + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80000420 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 1.19 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 1200MHz. */ + uint32_t rate2 = 600000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 1200MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x000000C8); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 // Gate functional clocks +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset (register configuration must be done with DDRC core under reset) +DATA 4 0x41C80204 0x1 // Ungate functional clocks + +//------------------------------------------- +// Configure controller registers +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +DATA 4 DDRC_MSTR_0 0x81080020 // Set LPDDR4, Burst length and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke, post_cke +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000063F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1718141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000302 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020010 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // DFI control update settings +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00050505 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x13131300 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x04040404 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x04040404 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ADDRMAP7_0 0x00000F0F // addrmap_row_b17, addrmap_row_b16 +DATA 4 DDRC_DBICTL_0 0x00000007 // read DBI, write DBI, Data Mask +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// Performance optimizations +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) + +// Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x07009100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config +//DDR power management settings +DATA 4 DDRC_PWRTMG_0 0x00402010 // Timers for automatic entry into powerdown, self-refresh, … +DATA 4 DDRC_PWRCTL_0 0x0000010A // Enable DDR low power feature (clock disabling, power down, …) +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + + + + + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010001 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00008765 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004231 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00008765 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004321 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // ADCP +DATA 4 DDR_PHY_PGCR2_0 0x00F00F2C // tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x01021080 // CKEN/CKNEN toggling and polarity +DATA 4 DDR_PHY_PGCR7_0 0x00000010 // AC read clock mode +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BB7B // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001BB5B // Impedance control for DQ bus + +//------------------------------------------- +// Configure and launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put AC PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 // Put DQ PLL in power down state +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x09604B10 +DATA 4 DDR_PHY_PTR1_0 0x075302A3 + +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR4, MR5 and MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength +DATA 4 DDR_PHY_MR11_0 0x66 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x06 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +DATA 4 DDR_PHY_MR12_0 0x12 // VREF(CA) +DATA 4 DDR_PHY_MR14_0 0x10 // VREF(DQ) +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x00696159 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000493E0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000012C // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00007530 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00096 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// No ODT signal for LPDDR4 DQ. So disable it. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM, ACRANKCLKSEL +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode +DATA 4 DDR_PHY_ACIOCR1_0 0x00000000 // A[15:0] OE mode selection +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0x90032010 // tVREF, DVINIT, DVMIN, DVMAX, DVINIT +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO, tVREFIO, SHREN, SHRNK +// Set-up PHY General Configuration Registers +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 // Internal VREF generator range selection (1'b1 = 7.69% - 53.49% of VDDQ) +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090913 // Set VREF value in DXREFISELR0, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL, DXREFSSELRANGE, maintain other defaults +// Set-up DATX8 DX Control Registers +DATA 4 DDR_PHY_DX8SLbDXCTL1_0 0x00840000 // DXRCLKMD +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1200 // POSOEX, PREOEX, LPWAKEUP_THRSH + +// Enable AC PHY PLL and/or IO to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x00190091 // LPWAKEUP_THRSH, LPPLLPD, LPIOPD + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM reset + DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM initialization +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// Wait DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch second DRAM initialization +DATA 4 DDR_PHY_PTR3_0 0x0000012C // tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 // Launch DRAM init + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +// Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Wait disabling of VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00000100 // BMRANK (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000071C7 // DTRPTN, RFSHDT +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// VREF training +//---------------------------------------------------------------// +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +// Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//---------------------------------------------------------------// +// DQS Drift registers +//---------------------------------------------------------------// +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 // Disable Read DQS Gating LCDL Delay VT Compensation +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 // DFTDLY, DFTB2BRD, DFTIDLRD, DFTDTEN +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 // Disable Drift idle read cycle and Drift back-to-back read cycles +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 // DFTTHRSH, DFTMNTPRD + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +// Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +//---------------------------------------------------------------// +// Check that controller is ready to operate +//---------------------------------------------------------------// +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +//---------------------------------------------------------------// +// Configure ECC (if enable required) +//---------------------------------------------------------------// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//---------------------------------------------------------------// +// DRC configuration end +//---------------------------------------------------------------// + + + diff --git a/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_emul.cfg b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_emul.cfg new file mode 100755 index 0000000..098b4c2 --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/imx8dxl_dcd_emul.cfg @@ -0,0 +1,115 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +/* + * Device Configuration Data (DCD) + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +// DSC RESET +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + + // This is for lpddr4 controller 600MHz 1.67ns and ddr 1200MHz 0.83ns +DATA 4 DDRC_MSTR_0 0x83080020 // Set LPDDR4, BL = 16 and active ranks = 2 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x00020010 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00100000 // dram_rstn = 20us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1=0x44: nWR=24 ? BL=16; MR2=0x24: RL=24 WL=12 ? +DATA 4 DDRC_INIT4_0 0x00310000 // MR3, MR13 PDDS 110 PU-CAL VddQ/3 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr roundup((WL 12 + BL/2 8 + nWR 18ns)/2) = 20 hex 14 , tFAW (40ns /2) 25 hex 19 , tRASmax 8.7885us 4 , tRASmin 42ns (42ns/tCK)/2 26 hex 19 +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP 7.5ns roundup(tXP/2) 4, rd2pre roundup((BL/2 +8ns - 8)/2) = 5 , tRC 42ns +21ns roundup(63ns/2) = 38 hex +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL 12/2, RL 24/2, rd2wr roundup((RL 24 +BL/2 8 +RU tDQSCK 3.6ns/0.83ns 4.3 +WR_PREAMBLE 2tck + RD_POSTAMBLE 0.5tck -WL 12)/2) = 14, wr2rd RU(WL 12 +BL/2 8+tWTR 10ns +1)/2 17 hex +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw tMRW ? tMRWCKEL 10CK, tmrd 10tck, tmod present on DDR3/4 only +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd 18ns 11, tccd 8tck, trrd 10ns 7, trp 21ns 13 +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tcksrx 3tck, tcksre 5tck, tckesr 7.5ns tSR TBD, tcke 7.5/0.83/2 +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx 7.5ns +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde 5tck, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE 3tck, tCKEHCMD (=tXP?) ? +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff ODT disable, tCCDMW 4*8tck 16, tPPD 4tCK +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr tRFCAB 180ns+ 7.5ns +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL 1us, tZQLAT 30ns 18 +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset 50ns f, tzq_short_interval 0.4s lpddr3 ? +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000017 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP4_0 0x00001f1f // addrmap_col_b11, addrmap_col_b10 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x07070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ADDRMAP7_0 0x00000f0f + +DATA 4 DDRC_ODTMAP_0 0x00002211 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// Toggle Reset ... +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + + //Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// dram_init_inst() +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000021 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 + + //Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 diff --git a/platform/board/mx8dxl_evk/dcd/imx8dxl_ddr3l_dcd_933MHz.cfg b/platform/board/mx8dxl_evk/dcd/imx8dxl_ddr3l_dcd_933MHz.cfg new file mode 100755 index 0000000..709a194 --- /dev/null +++ b/platform/board/mx8dxl_evk/dcd/imx8dxl_ddr3l_dcd_933MHz.cfg @@ -0,0 +1,385 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x020000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 12 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80000800 +DEFINE BD_DDR_RET_REGION2_SIZE 12 + +/* + * Device Configuration Data (DCD) Version 1.0 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +// DXL default is 933MHz, hence when configured for 933MHz, the following is commented. It is uncommented when configured for 800MHz operation. +//if (rom_caller == SC_FALSE) +//{ +// /* Set the DRC rate to achieve a DRAM rate as close as possible to 933MHz. */ +// uint32_t rate2 = 465000000U; +// (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +//} +//else +//{ +// /* gate the cslice and ssslice */ +// CLR_BIT 4 0x41C83800 0xDC000000 +// CLR_BIT 4 0x41C82C00 0xDC00001F +// +// /* relock HP PLL to 930MHz */ +// /* Enable PLL isolation */ +// DSC_AIRegisterWrite(0x24,0,8,0x40000000); +// /* power down PLL and clear dividers */ +// DSC_AIRegisterWrite(0x24,0,8,0x000020FF); +// /* Set the divider */ +// DSC_AIRegisterWrite(0x24,0,4,0x0000009B); +// /* power up PLL and set hold ring off */ +// DSC_AIRegisterWrite(0x24,0,4,0x00003000); +// SYSCTR_TimeDelay(25); +// /* clear hold ring off */ +// DSC_AIRegisterWrite(0x24,0,8,0x00001000); +// SYSCTR_TimeDelay(50); +// /* disable PLL isolation */ +// DSC_AIRegisterWrite(0x24,0,4,0x40000000); +// +// /* Ungate cslice and ssslice */ +// SET_BIT 4 0x41C82C00 0x4C000002 +// SET_BIT 4 0x41C83800 0x4C000000 +//} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +//------------------------------------------- +// Configure controller registers +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x0072007A // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300E5 // pre_cke +DATA 4 DDRC_INIT1_0 0x005D0000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0E140046 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00200000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x000B0000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0E112010 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000C0417 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x07020307 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x05050303 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40960026 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200E3F5 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04898206 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000704 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00040401 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP2_0 0x00000700 // addrmap_col_b5, addrmap_col_b4, addrmap_col_b3, addrmap_col_b2 +DATA 4 DDRC_ADDRMAP3_0 0x12121200 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x04040403 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F040404 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ODTCFG_0 0x06000610 +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// Performance optimizations +DATA 4 DDRC_SCHED_0 0x00001F05 // lpr_num_entries + +// Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x07009100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config +// DDR power management settings +DATA 4 DDRC_PWRTMG_0 0x00402010 // Timers for automatic entry into powerdown, self-refresh, … +DATA 4 DDRC_PWRCTL_0 0x0000000A // Enable DDR low power feature (clock disabling, power down, …) +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + + + + + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00053210 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004876 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00053210 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004876 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0E207 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x3A61D310 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x2D98106A // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x00007799 // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x00007B99 // Impedance control for DQ bus + +//------------------------------------------- +// Configure and launch PLL init, DCAL, ZCAL and PHYRST +//-------------------------------------------- +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000E14 +DATA 4 DDR_PHY_MR1_0 0x00000046 +DATA 4 DDR_PHY_MR2_0 0x00000020 +DATA 4 DDR_PHY_MR3_0 0x00000000 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x06200D08 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28210300 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00F30C17 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x002D0D09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00071FA6 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000F3 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0002D976 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x040003A6 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up PHY General Configuration Registers +DATA 4 DDR_PHY_PGCR5_0 0x01010004 +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 + +// Enable AC PHY PLL and/or IO to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x00190091 // LPWAKEUP_THRSH, LPPLLPD, LPIOPD + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM reset + DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +// Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +//---------------------------------------------------------------// +// Check that controller is ready to operate +//---------------------------------------------------------------// +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +//---------------------------------------------------------------// +// Configure ECC (if enable required) +//---------------------------------------------------------------// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//---------------------------------------------------------------// +// DRC configuration end +//---------------------------------------------------------------// + diff --git a/platform/board/mx8qm_mek/Makefile b/platform/board/mx8qm_mek/Makefile new file mode 100755 index 0000000..1c37faf --- /dev/null +++ b/platform/board/mx8qm_mek/Makefile @@ -0,0 +1,61 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qm_dcd_emul +else + DDR_CON ?= imx8qm_dcd_1.6GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8qm_mek/board.bom b/platform/board/mx8qm_mek/board.bom new file mode 100755 index 0000000..6879226 --- /dev/null +++ b/platform/board/mx8qm_mek/board.bom @@ -0,0 +1,40 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif + diff --git a/platform/board/mx8qm_mek/board.c b/platform/board/mx8qm_mek/board.c new file mode 100755 index 0000000..1983876 --- /dev/null +++ b/platform/board/mx8qm_mek/board.c @@ -0,0 +1,1946 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QM MEK board. + * + * @addtogroup MX8QM_MEK_BRD BRD: MX8QM MEK Board + * + * Module for MX8QM MEK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00090 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "drivers/systick/fsl_systick.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" + +/* Local Defines */ + +/*! Memory size */ +#ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_6GB +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U /*!< EMVSIM */ +#define BRD_R_BOARD_R3 6U /*!< USDHC2 on Base board */ +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 2U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +static sc_err_t pmic_ignore_current_limit(uint8_t address); +static sc_err_t pmic_update_timing(uint8_t address); +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver); +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm0; +static uint32_t temp_alarm1; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + /*rgpio_pin_config_t config; + config.pinDirection = kRGPIO_DigitalOutput;*/ + + ss_print(3, "board_init(%d)\n", phase); + + /*if (phase == BOOT_PHASE_HW_INIT) + { + #ifndef ALT_DEBUG_SCU_UART + pad_force_mux(SC_P_SCU_GPIO0_01, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + #endif*/ + /*pad_force_mux(SC_P_SCU_GPIO0_02, 0, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF);*/ + + /* Toggle base board reset SC_GPIO_01, >= 30nS */ + /*config.outputLogic = 0U; + FGPIO_PinInit(FGPIOA, 1U, &config); + SYSTICK_CycleDelay(SC_SYSTICK_NSEC_TO_TICKS(30U) + 1U); + FGPIO_PinWrite(FGPIOA, 1U, 1U);*/ + + /* SCU_LED on SC_GPIO_02 */ + /*config.outputLogic = 1U; + FGPIO_PinInit(FGPIOA, 2U, &config); + + SystemTimeDelay(2U); + } + else if (phase == BOOT_PHASE_FINAL_INIT)*/ + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if (defined(ALT_DEBUG_UART) || defined(ALT_DEBUG_SCU_UART)) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Use M4 UART if ALT_DEBUG_UART defined */ + /* Return if debug already enabled */ + if ((SCFW_DBG_READY == 0U) && (early_phase == SC_FALSE)) + { + sc_pm_clock_rate_t rate = SC_24MHZ; + static sc_bool_t banner = SC_FALSE; + + /* Configure pads */ + pad_force_mux(SC_P_M40_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M40_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + + /* Power and enable clock */ + pm_force_resource_power_mode_v(SC_R_SC_PID0, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DBLOGIC, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DB, SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + + /* Configure UART */ + main_config_debug_uart(LPUART_DEBUG, rate); + + if (banner == SC_FALSE) + { + debug_print(1, + "\nHello from SCU (Build %u, Commit %08x, %s %s)\n\n", + SCFW_BUILD, SCFW_COMMIT, SCFW_DATE, SCFW_TIME); + banner = SC_TRUE; + } + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ + /* Use M4 UART if ALT_DEBUG_UART defined */ + #if defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Return if debug already disabled */ + if (SCFW_DBG_READY != 0U) + { + /* Disable use of UART */ + SCFW_DBG_READY = 0U; + + // UART deinit to flush TX buffers + LPUART_Deinit(LPUART_DEBUG); + + /* Turn off UART */ + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_OFF); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_OFF); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + #ifdef ALT_DEBUG_UART + (void) rm_set_resource_movable(SC_PT, SC_R_M4_0_UART, SC_R_M4_0_UART, + SC_FALSE); + (void) rm_set_pad_movable(SC_PT, SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA, + SC_FALSE); + #endif + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SDA, SC_P_PMIC_I2C_SCL, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + rtn = BOARD_KS1_RESUME_USEC; + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + /* DC0 PLL0 spread spectrum config */ + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC0 PLL1 spread spectrum config */ + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL0 spread spectrum config */ + case BOARD_PARM_DC1_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL1 spread spectrum config */ + case BOARD_PARM_DC1_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* Control if SC WDOG configuration during KS1 */ + case BOARD_PARM_KS1_WDOG_WAKE: + rtn = BOARD_PARM_KS1_WDOG_WAKE_ENABLE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. - DDR_00060 */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + #if defined(BD_DDR_RET_NUM_DRC) && (BD_DDR_RET_NUM_DRC == 1U) + if(rsrc == SC_R_DRC_1) + { + rtn = SC_FALSE; + } + #endif + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + static uint32_t board_ddr_ret_buf4[BD_DDR_RET_REGION4_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + static uint32_t board_ddr_ret_buf5[BD_DDR_RET_REGION5_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + static uint32_t board_ddr_ret_buf6[BD_DDR_RET_REGION6_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 }, + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + { BD_DDR_RET_REGION4_ADDR, BD_DDR_RET_REGION4_SIZE, board_ddr_ret_buf4 }, + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + { BD_DDR_RET_REGION5_ADDR, BD_DDR_RET_REGION5_SIZE, board_ddr_ret_buf5 }, + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + { BD_DDR_RET_REGION6_ADDR, BD_DDR_RET_REGION6_SIZE, board_ddr_ret_buf6 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + else if (rm_is_resource_avail(SC_R_DRC_1)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_1, + SC_PM_CLK_SLV_BUS, &rate); + } + else + { + ; /* Intentional empty else */ + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + /* DDR_00040 */ + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. See DDR_00010. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + /* Supports stress test tool - DDR_00070 */ + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + case BOARD_DDR1_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(1); + #else + // Run vref training + DRAM_VREF_training_sw(1); + #endif + break; + default: + /* DDR_00020 */ + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + sc_rm_pt_t pt_m4_1 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[7U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_7A, + SC_R_MU_8B, + SC_R_GPT_4, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x0887FFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Create M4 1 partition */ + if (rm_is_resource_avail(SC_R_M4_1_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[5U] = + { + SC_R_IRQSTR_M4_1, + SC_R_MU_6B, + SC_R_MU_7B, + SC_R_MU_9B, + SC_R_GPT_3, + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M41_I2C0_SCL, SC_P_M41_I2C0_SDA), + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088800000ULL, 0x08FFFFFFFULL}, + {0x008181000ULL, 0x008280FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_1, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_1_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_1, "MCU1"); + + /* Allow M4 1 to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_m4_1, SC_RM_PERM_SEC_RW)); + + /* Move M4 1 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x038FE0000ULL, + 0x038FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_1, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_1, SC_PT)); + } + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[4U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4), + RM_RANGE(SC_R_M4_1_PID1, SC_R_M4_1_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + if (pt_m4_1 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_1, + SC_RM_PERM_FULL)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_1_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(pmic_id[idx], pmic_reg[idx], new_volt, + REG_RUN_MODE)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ + static uint32_t vdd_memc_mode = 0U; + + if (mode == SC_PM_PW_MODE_STBY) + { + /* + * System standby (KS1) entry allows VDD_MEMC to be gated off. + * Save current mode and switch off supply. + */ + if (PMIC_GET_MODE(PMIC_1_ADDR, PF8100_SW5, &vdd_memc_mode) + == SC_ERR_NONE) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, SW_STBY_OFF + | SW_RUN_OFF); + } + } + else if (mode == SC_PM_PW_MODE_ON) + { + /* + * System standby (KS1) exit should switch on VDD_MEMC. Restore + * previous mode saved during KS1 entry. + */ + if (vdd_memc_mode != 0U) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, vdd_memc_mode); + } + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + switch (idx) + { + case BRD_R_BOARD_R2 : /* EMVSIM */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_LDO1, + 3000, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_EN_STBY_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R3 : /* USDHC2 on Base Board */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_EN_STBY_EN | VSELECT_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + #ifdef ALT_DEBUG_UART + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if ((resource == SC_R_M4_0_PID0) || (resource == SC_R_M4_1_PID0)) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm0 = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm1 = + SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + /* PMIC 0 */ + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm0; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* PMIC 1 */ + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_1_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm1; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_1_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* Board R7 - only here for testing */ + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Temp alarm from PMIC 1 */ + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC1_HIGH, + SC_PT_ALL); + } + /* Temp alarm from PMIC 0 */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* MEK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + + err |= pmic_ignore_current_limit(PMIC_0_ADDR); + err |= pmic_ignore_current_limit(PMIC_1_ADDR); + + /* Adjust startup timing */ + err |= pmic_update_timing(PMIC_0_ADDR); + err |= pmic_update_timing(PMIC_1_ADDR); + + err |= pmic_match_otp(PMIC_0_ADDR, pmic_ver); + err |= pmic_match_otp(PMIC_1_ADDR, pmic_ver); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + err |= pf8100_pmic_wdog_enable(PMIC_1_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW7, SW_RUN_PWM + | SW_STBY_PWM)); + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, 800, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update power timing for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_update_timing(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + + /* + * Add 60ms stable time for power down for: + * PMIC 1 : LDO2, SW6, SW7 + * PMIC 2 : LDO2, SW5, SW6, SW7 + * on i.mx8QM-mek + * board, otherwise system may reboot fail by mmc not power off + * clean + */ + if (address == PMIC_0_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 0 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else if (address == PMIC_1_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 1 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x6F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else + { + /* Return error */ + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check correct version of OTP for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver) +{ + uint8_t reg_value = 0U; + uint16_t prog_id, match; + sc_err_t err = SC_ERR_NONE; + + if (address == PMIC_0_ADDR) + { + match = EP_PROG_ID; + } + else + { + match = EQ_PROG_ID; + } + + /* Read Prog ID */ + err |= PMIC_REGISTER_ACCESS(address, 0x2, SC_FALSE, ®_value); + prog_id = (((uint16_t)reg_value << 4U) & 0x0F00U); + err |= PMIC_REGISTER_ACCESS(address, 0x3U, SC_FALSE, ®_value); + prog_id |= reg_value; + + /* test against calibration fusing */ + if (OTP_PROG_FUSE_VERSION_1_7V_CAL != 0U) + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + /* if C1 PMIC test for correct OTP */ + if(prog_id != match){/* allow only 1.7v OTP */ + error_print("PMIC INVALID!\n"); + } + } + else + { + error_print("PMIC INVALID!\n"); + } + } + else + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + if(prog_id == match){/* prohibit only 1.7V OTP */ + error_print("PMIC INVALID!\n"); + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A53 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW5; + *num_regs = 1U; + } + break; + case SC_SUBSYS_A72 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW1; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW2; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_1 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + default : + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qm_mek/board.h b/platform/board/mx8qm_mek/board.h new file mode 100755 index 0000000..841c97a --- /dev/null +++ b/platform/board/mx8qm_mek/board.h @@ -0,0 +1,115 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U +#define PMIC_1_ADDR 0x9U + +#define PF8100_C1_SI_REV 0x31U +#define EP_PROG_ID 0x0417U +#define EQ_PROG_ID 0x0418U + +#define PMIC_TEMP_MAX 135U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..896973b --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ +DEFINE BD_DDR_RET_NUM_DRC 2 // Number of DRCs in the SoC + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser_DRC0_only.cfg b/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser_DRC0_only.cfg new file mode 100755 index 0000000..119af25 --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/ddr_stress_test_parser_DRC0_only.cfg @@ -0,0 +1,142 @@ +DEFINE BD_DDR_RET_NUM_DRC 1 // One DRC in the SoC; DRC0 only + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz.cfg b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz.cfg new file mode 100755 index 0000000..cb0c950 --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz.cfg @@ -0,0 +1,590 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x03201901 +DATA 4 DDR_PHY_PTR1_0 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x03201901 +DATA 4 DDR_PHY_PTR1_1 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00032 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00032 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x64032010, 0x4E201C20, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg new file mode 100755 index 0000000..eb1ae49 --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg @@ -0,0 +1,513 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_1 0x00808000 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------=------------ +// Set-up DRAM 1 PHY Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_1 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x33 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF +DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x03300640 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x03300640 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 +// Launch DRAM 1 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait (second time) DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_mek/dcd/imx8qm_dcd_800MHz.cfg b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_800MHz.cfg new file mode 100755 index 0000000..0fc3ead --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_800MHz.cfg @@ -0,0 +1,624 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to 800MHz. */ + uint32_t rate2 = SC_400MHZ; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &rate2); +} +else +{ +/* Change to div4 output */ +DATA 4 0x41A43800 0x4C000000 +DATA 4 0x41D03800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_0 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_1 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x01A00C81 +DATA 4 DDR_PHY_PTR1_0 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x01A00C81 +DATA 4 DDR_PHY_PTR1_1 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00019 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00019 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x32019010, 0x27100E10, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + + + + + + + + + + + + + + + + + + + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qm_mek/dcd/imx8qm_dcd_emul.cfg b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_emul.cfg new file mode 100755 index 0000000..26e3098 --- /dev/null +++ b/platform/board/mx8qm_mek/dcd/imx8qm_dcd_emul.cfg @@ -0,0 +1,214 @@ +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// Reset Should not be needed for ZEBU. +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 + +// ddrc_lpddr4_init(0) +DATA 4 0x5C000000 0xC3080020 +DATA 4 0x5C000064 0x006100E0 +DATA 4 0x5C0000D0 0x40020010 +DATA 4 0x5C0000D4 0x00100000 +DATA 4 0x5C0000DC 0x0054002D +DATA 4 0x5C0000E0 0x00310000 +DATA 4 0x5C0000F4 0x000006CF +DATA 4 0x5C000100 0x1A201B22 +DATA 4 0x5C000104 0x00060633 +DATA 4 0x5C000108 0x070E1014 +DATA 4 0x5C00010C 0x0170C00C +DATA 4 0x5C000110 0x0F04080F +DATA 4 0x5C000114 0x03040C0C +DATA 4 0x5C000118 0x02020007 +DATA 4 0x5C00011C 0x00000401 +DATA 4 0x5C000130 0x00020610 +DATA 4 0x5C000134 0x0C100002 +DATA 4 0x5C000138 0x000000E6 +DATA 4 0x5C000180 0x03200018 +DATA 4 0x5C000184 0x02800100 +DATA 4 0x5C000190 0x049C820C +DATA 4 0x5C000194 0x00060303 +DATA 4 0x5C0001B4 0x00001A0A +DATA 4 0x5C0001B0 0x00000005 +DATA 4 0x5C0001A0 0x80400003 +DATA 4 0x5C0001A4 0x00010002 +DATA 4 0x5C0001A8 0x80000000 +DATA 4 0x5C000200 0x00000017 +DATA 4 0x5C000204 0x00080808 +DATA 4 0x5C000214 0x07070707 +DATA 4 0x5C000218 0x07070707 +DATA 4 0x5C000244 0x00002211 +DATA 4 0x5C000490 0x00000001 +DATA 4 0x5C002190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 +//DATA 4 0x5C0001B0 0x00000004 +//DATA 4 0x5C0000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(0) +DATA 4 0x5C010100 0x0000040D +DATA 4 0x5C010018 0x00F0DA09 +DATA 4 0x5C01001C 0x050A1080 +DATA 4 0x5C010040 0x64032010 +DATA 4 0x5C010044 0x0D701C20 +DATA 4 0x5C010068 0x08000000 +DATA 4 0x5C0117C4 0x08000000 +DATA 4 0x5C010680 0x001FEC58 + +//ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00000040 +DATA 4 0x5C010004 0x00000041 + +//ddr_phy_lpddr4_dram_init(0) +DATA 4 0x5C010184 0x00000054 +DATA 4 0x5C010188 0x0000002D +DATA 4 0x5C01018C 0x00000031 +DATA 4 0x5C010110 0x1044220C +DATA 4 0x5C010114 0x28408C17 +DATA 4 0x5C010118 0x003C01CC +DATA 4 0x5C01011C 0x01800604 +DATA 4 0x5C010120 0x01C0000C +DATA 4 0x5C010124 0x00651D10 +DATA 4 0x5C01004C 0x00007D00 +DATA 4 0x5C010050 0x00000C90 +DATA 4 0x5C010054 0x00007D00 +DATA 4 0x5C010058 0x03000641 +DATA 4 0x5C010500 0x30070800 +DATA 4 0x5C010514 0x09000000 +DATA 4 0x5C010528 0xF0032019 +DATA 4 0x5C01052C 0x07F00173 +DATA 4 0x5C0117EC 0x00081800 +DATA 4 0x5C0117F0 0x09000000 +DATA 4 0x5C0117DC 0x013E4091 + +//ddr_phy_wait_init_done(0) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00040000 +DATA 4 0x5C010004 0x00040001 + +// SECOND DRC SYSTEM + +// ddrc_lpddr4_init(1) +DATA 4 0x5C100000 0xC3080020 +DATA 4 0x5C100064 0x006100E0 +DATA 4 0x5C1000D0 0x40020010 +DATA 4 0x5C1000D4 0x00100000 +DATA 4 0x5C1000DC 0x0054002D +DATA 4 0x5C1000E0 0x00310000 +DATA 4 0x5C1000F4 0x000006CF +DATA 4 0x5C100100 0x1A201B22 +DATA 4 0x5C100104 0x00060633 +DATA 4 0x5C100108 0x070E1014 +DATA 4 0x5C10010C 0x0170C00C +DATA 4 0x5C100110 0x0F04080F +DATA 4 0x5C100114 0x03040C0C +DATA 4 0x5C100118 0x02020007 +DATA 4 0x5C10011C 0x00000401 +DATA 4 0x5C100130 0x00020610 +DATA 4 0x5C100134 0x0C100002 +DATA 4 0x5C100138 0x000000E6 +DATA 4 0x5C100180 0x03200018 +DATA 4 0x5C100184 0x02800100 +DATA 4 0x5C100190 0x049C820C +DATA 4 0x5C100194 0x00060303 +DATA 4 0x5C1001B4 0x00001A0A +DATA 4 0x5C1001B0 0x00000005 +DATA 4 0x5C1001A0 0x80400003 +DATA 4 0x5C1001A4 0x00010002 +DATA 4 0x5C1001A8 0x80000000 +DATA 4 0x5C100200 0x00000017 +DATA 4 0x5C100204 0x00080808 +DATA 4 0x5C100214 0x07070707 +DATA 4 0x5C100218 0x07070707 +DATA 4 0x5C100244 0x00002211 +DATA 4 0x5C100490 0x00000001 +DATA 4 0x5C102190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_1 0x00000001 +CLR_BIT 4 DDRC_INIT0_1 0xC0000000 +//DATA 4 0x5C1001B0 0x00000004 +//DATA 4 0x5C1000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(1) +DATA 4 0x5C110100 0x0000040D +DATA 4 0x5C110018 0x00F0DA09 +DATA 4 0x5C11001C 0x050A1080 +DATA 4 0x5C110040 0x64032010 +DATA 4 0x5C110044 0x0D701C20 +DATA 4 0x5C110068 0x08000000 +DATA 4 0x5C1117C4 0x08000000 +DATA 4 0x5C110680 0x001FEC58 + +//ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00000040 +DATA 4 0x5C110004 0x00000041 + + +//ddr_phy_lpddr4_dram_init(1) +DATA 4 0x5C110184 0x00000054 +DATA 4 0x5C110188 0x0000002D +DATA 4 0x5C11018C 0x00000031 +DATA 4 0x5C110110 0x1044220C +DATA 4 0x5C110114 0x28408C17 +DATA 4 0x5C110118 0x003C01CC +DATA 4 0x5C11011C 0x01800604 +DATA 4 0x5C110120 0x01C0000C +DATA 4 0x5C110124 0x00651D10 +DATA 4 0x5C11004C 0x00007D00 +DATA 4 0x5C110050 0x00000C90 +DATA 4 0x5C110054 0x00007D00 +DATA 4 0x5C110058 0x03000641 +DATA 4 0x5C110500 0x30070800 +DATA 4 0x5C110514 0x09000000 +DATA 4 0x5C110528 0xF0032019 +DATA 4 0x5C11052C 0x07F00173 +DATA 4 0x5C1117EC 0x00081800 +DATA 4 0x5C1117F0 0x09000000 +DATA 4 0x5C1117DC 0x013E4091 + +//ddr_phy_wait_init_done(1) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00040000 +DATA 4 0x5C110004 0x00040001 + +// RESET +DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DSC_SetReset(SC_DSC_DRC_1, BIT(RST_DDR_CRESETN), SC_TRUE); +//DATA 4 0x41a40044 0x4 +//DATA 4 0x41d00044 0x4 + +// dram_init_inst(0) +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// dram_init_inst(1) +CLR_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_1 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_1 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +//DATA 4 0x5C000320 0x00000000 +//DATA 4 0x5C0001B0 0x00000005 +//DATA 4 0x5C000320 0x00000001 +//DATA 4 0x5C100320 0x00000000 +//DATA 4 0x5C1001B0 0x00000005 +//DATA 4 0x5C100320 0x00000001 + diff --git a/platform/board/mx8qm_smarc_4g/Makefile b/platform/board/mx8qm_smarc_4g/Makefile new file mode 100755 index 0000000..1c37faf --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/Makefile @@ -0,0 +1,61 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qm_dcd_emul +else + DDR_CON ?= imx8qm_dcd_1.6GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8qm_smarc_4g/board.bom b/platform/board/mx8qm_smarc_4g/board.bom new file mode 100755 index 0000000..6879226 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/board.bom @@ -0,0 +1,40 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif + diff --git a/platform/board/mx8qm_smarc_4g/board.c b/platform/board/mx8qm_smarc_4g/board.c new file mode 100755 index 0000000..e29ab97 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/board.c @@ -0,0 +1,2007 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QM MEK board. + * + * @addtogroup MX8QM_MEK_BRD BRD: MX8QM MEK Board + * + * Module for MX8QM MEK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00090 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "drivers/systick/fsl_systick.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" + +/* ------------------------------------------------------------------------------------------------------------------ + * ----- iMX8QM: eDMA limitation USE CASE ----- + * ------------------------------------------------------------------------------------------------------------------ + * In the new kernel NXP use the "edma2" in the lpspi driver. The same dma controller is used from M core in FreeRTOS + * This generate a conflict and than a kernel crash + * ------------------------------------------------------------------------------------------------------------------ + * To add a clarification regarding eDMA: + * - The "edma2" node in the Linux device tree refers to the device at BAR 0x5a1f0000 described in the DMA memory map + * as "eDMA0" (i.MX 8QuadMax reference manual rev.F pp.32) + * - DMA0_BASE in imx-sc-firmware/src/scfw_export_mx8qm_b0/platform/devices/MX8QM/MX8QM.h also points to the + * RM's "eDMA0" at 0x5a1f0000. + * This confirms the eDMA conflict. + * + * How to use use eDMA0 in the FreeRTOS: + * - USE_DMA_0 must be defined + * - eDMA0 must be disabled in the Linux device tree overriding the nodes that use "edma2" or disabling the nodes + * that using it + * ------------------------------------------------------------------------------------------------------------------ + * The eDMA conflict affect the below FreeRTOS examples: + * - lpspi_edma_b2b_transfer_master.c + * - lpspi_edma_b2b_transfer_slave.c + * - lpuart_edma_transfer.c + * - edma_memory_to_memory.c + * - edma_scatter_gather.c + * - cmsis_usart_edma_transfer.c + * ------------------------------------------------------------------------------------------------------------------ + */ + +/* Local Defines */ + +#undef USE_DMA_0 /* Before define USE_DMA_0, read "iMX8QM: eDMA limitation USE CASE" above */ + +#undef M41_USES_SPI0 +#undef M41_USES_I2C3 +#undef M41_USES_GPIO3_24 +#undef M41_USES_CAN0 +#undef M41_USES_EDMA + +#ifndef USE_DMA_0 + #undef M41_USES_EDMA +#endif + +/*! Memory size */ +#ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_4GB +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U /*!< EMVSIM */ +#define BRD_R_BOARD_R3 6U /*!< USDHC2 on Base board */ +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 2U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +static sc_err_t pmic_ignore_current_limit(uint8_t address); +static sc_err_t pmic_update_timing(uint8_t address); +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver); +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm0; +static uint32_t temp_alarm1; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + /*rgpio_pin_config_t config; + config.pinDirection = kRGPIO_DigitalOutput;*/ + + ss_print(3, "board_init(%d)\n", phase); + + /*if (phase == BOOT_PHASE_HW_INIT) + { + #ifndef ALT_DEBUG_SCU_UART + pad_force_mux(SC_P_SCU_GPIO0_01, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + #endif*/ + /*pad_force_mux(SC_P_SCU_GPIO0_02, 0, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF);*/ + + /* Toggle base board reset SC_GPIO_01, >= 30nS */ + /*config.outputLogic = 0U; + FGPIO_PinInit(FGPIOA, 1U, &config); + SYSTICK_CycleDelay(SC_SYSTICK_NSEC_TO_TICKS(30U) + 1U); + FGPIO_PinWrite(FGPIOA, 1U, 1U);*/ + + /* SCU_LED on SC_GPIO_02 */ + /*config.outputLogic = 1U; + FGPIO_PinInit(FGPIOA, 2U, &config); + + SystemTimeDelay(2U); + } + else if (phase == BOOT_PHASE_FINAL_INIT)*/ + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if (defined(ALT_DEBUG_UART) || defined(ALT_DEBUG_SCU_UART)) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Use M4 UART if ALT_DEBUG_UART defined */ + /* Return if debug already enabled */ + if ((SCFW_DBG_READY == 0U) && (early_phase == SC_FALSE)) + { + sc_pm_clock_rate_t rate = SC_24MHZ; + static sc_bool_t banner = SC_FALSE; + + /* Configure pads */ + pad_force_mux(SC_P_M40_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M40_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + + /* Power and enable clock */ + pm_force_resource_power_mode_v(SC_R_SC_PID0, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DBLOGIC, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DB, SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + + /* Configure UART */ + main_config_debug_uart(LPUART_DEBUG, rate); + + if (banner == SC_FALSE) + { + debug_print(1, + "\nHello from SCU (Build %u, Commit %08x, %s %s)\n\n", + SCFW_BUILD, SCFW_COMMIT, SCFW_DATE, SCFW_TIME); + banner = SC_TRUE; + } + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ + /* Use M4 UART if ALT_DEBUG_UART defined */ + #if defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Return if debug already disabled */ + if (SCFW_DBG_READY != 0U) + { + /* Disable use of UART */ + SCFW_DBG_READY = 0U; + + // UART deinit to flush TX buffers + LPUART_Deinit(LPUART_DEBUG); + + /* Turn off UART */ + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_OFF); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_OFF); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + #ifdef ALT_DEBUG_UART + (void) rm_set_resource_movable(SC_PT, SC_R_M4_0_UART, SC_R_M4_0_UART, + SC_FALSE); + (void) rm_set_pad_movable(SC_PT, SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA, + SC_FALSE); + #endif + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SDA, SC_P_PMIC_I2C_SCL, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + rtn = BOARD_KS1_RESUME_USEC; + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + /* DC0 PLL0 spread spectrum config */ + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC0 PLL1 spread spectrum config */ + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL0 spread spectrum config */ + case BOARD_PARM_DC1_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL1 spread spectrum config */ + case BOARD_PARM_DC1_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* Control if SC WDOG configuration during KS1 */ + case BOARD_PARM_KS1_WDOG_WAKE: + rtn = BOARD_PARM_KS1_WDOG_WAKE_ENABLE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. - DDR_00060 */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + #if defined(BD_DDR_RET_NUM_DRC) && (BD_DDR_RET_NUM_DRC == 1U) + if(rsrc == SC_R_DRC_1) + { + rtn = SC_FALSE; + } + #endif + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + static uint32_t board_ddr_ret_buf4[BD_DDR_RET_REGION4_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + static uint32_t board_ddr_ret_buf5[BD_DDR_RET_REGION5_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + static uint32_t board_ddr_ret_buf6[BD_DDR_RET_REGION6_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 }, + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + { BD_DDR_RET_REGION4_ADDR, BD_DDR_RET_REGION4_SIZE, board_ddr_ret_buf4 }, + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + { BD_DDR_RET_REGION5_ADDR, BD_DDR_RET_REGION5_SIZE, board_ddr_ret_buf5 }, + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + { BD_DDR_RET_REGION6_ADDR, BD_DDR_RET_REGION6_SIZE, board_ddr_ret_buf6 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + else if (rm_is_resource_avail(SC_R_DRC_1)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_1, + SC_PM_CLK_SLV_BUS, &rate); + } + else + { + ; /* Intentional empty else */ + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + /* DDR_00040 */ + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. See DDR_00010. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + /* Supports stress test tool - DDR_00070 */ + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + case BOARD_DDR1_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(1); + #else + // Run vref training + DRAM_VREF_training_sw(1); + #endif + break; + default: + /* DDR_00020 */ + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + sc_rm_pt_t pt_m4_1 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[7U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_7A, + SC_R_MU_8B, + SC_R_GPT_4, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x0887FFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Create M4 1 partition */ + if (rm_is_resource_avail(SC_R_M4_1_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[5U] = + { + SC_R_IRQSTR_M4_1, +#ifdef M41_USES_SPI0 +#ifdef USE_DMA_0 + SC_R_DMA_0_CH0, + SC_R_DMA_0_CH1, /* DMA0 channels for SPI0 */ +#endif + SC_R_SPI_0, +#endif +#ifdef M41_USES_I2C3 + SC_R_DMA_1_CH0, + SC_R_DMA_1_CH1, /* DMA1 channels for I2C3 */ + SC_R_I2C_3, +#endif +#ifdef M41_USES_GPIO3_24 + SC_R_GPIO_3, +#endif + SC_R_MU_6B, + SC_R_MU_7B, + SC_R_MU_9B, +#ifdef M41_USES_EDMA + SC_R_DMA_0_CH30, /* DMA0 channel for EDMA sample code */ +#endif +#ifdef M41_USES_CAN0 + SC_R_CAN_0, +#endif + SC_R_GPT_3, + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M41_I2C0_SCL, SC_P_M41_I2C0_SDA), + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088800000ULL, 0x08FFFFFFFULL}, + {0x008181000ULL, 0x008280FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_1, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_1_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_1, "MCU1"); + + /* Allow M4 1 to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_m4_1, SC_RM_PERM_SEC_RW)); + + /* Move M4 1 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x038FE0000ULL, + 0x038FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_1, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_1, SC_PT)); + } + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[4U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4), + RM_RANGE(SC_R_M4_1_PID1, SC_R_M4_1_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + if (pt_m4_1 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_1, + SC_RM_PERM_FULL)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_1_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(pmic_id[idx], pmic_reg[idx], new_volt, + REG_RUN_MODE)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ + static uint32_t vdd_memc_mode = 0U; + + if (mode == SC_PM_PW_MODE_STBY) + { + /* + * System standby (KS1) entry allows VDD_MEMC to be gated off. + * Save current mode and switch off supply. + */ + if (PMIC_GET_MODE(PMIC_1_ADDR, PF8100_SW5, &vdd_memc_mode) + == SC_ERR_NONE) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, SW_STBY_OFF + | SW_RUN_OFF); + } + } + else if (mode == SC_PM_PW_MODE_ON) + { + /* + * System standby (KS1) exit should switch on VDD_MEMC. Restore + * previous mode saved during KS1 entry. + */ + if (vdd_memc_mode != 0U) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, vdd_memc_mode); + } + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + switch (idx) + { + case BRD_R_BOARD_R2 : /* EMVSIM */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_LDO1, + 3000, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_EN_STBY_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R3 : /* USDHC2 on Base Board */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_EN_STBY_EN | VSELECT_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + #ifdef ALT_DEBUG_UART + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if ((resource == SC_R_M4_0_PID0) || (resource == SC_R_M4_1_PID0)) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm0 = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm1 = + SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + /* PMIC 0 */ + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm0; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* PMIC 1 */ + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_1_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm1; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_1_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* Board R7 - only here for testing */ + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Temp alarm from PMIC 1 */ + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC1_HIGH, + SC_PT_ALL); + } + /* Temp alarm from PMIC 0 */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* MEK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + + err |= pmic_ignore_current_limit(PMIC_0_ADDR); + err |= pmic_ignore_current_limit(PMIC_1_ADDR); + + /* Adjust startup timing */ + err |= pmic_update_timing(PMIC_0_ADDR); + err |= pmic_update_timing(PMIC_1_ADDR); + + err |= pmic_match_otp(PMIC_0_ADDR, pmic_ver); + err |= pmic_match_otp(PMIC_1_ADDR, pmic_ver); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + err |= pf8100_pmic_wdog_enable(PMIC_1_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW7, SW_RUN_PWM + | SW_STBY_PWM)); + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, 800, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update power timing for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_update_timing(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + + /* + * Add 60ms stable time for power down for: + * PMIC 1 : LDO2, SW6, SW7 + * PMIC 2 : LDO2, SW5, SW6, SW7 + * on i.mx8QM-mek + * board, otherwise system may reboot fail by mmc not power off + * clean + */ + if (address == PMIC_0_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 0 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else if (address == PMIC_1_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 1 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x6F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else + { + /* Return error */ + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check correct version of OTP for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver) +{ + uint8_t reg_value = 0U; + uint16_t prog_id, match; + sc_err_t err = SC_ERR_NONE; + + if (address == PMIC_0_ADDR) + { + match = EP_PROG_ID; + } + else + { + match = EQ_PROG_ID; + } + + /* Read Prog ID */ + err |= PMIC_REGISTER_ACCESS(address, 0x2, SC_FALSE, ®_value); + prog_id = (((uint16_t)reg_value << 4U) & 0x0F00U); + err |= PMIC_REGISTER_ACCESS(address, 0x3U, SC_FALSE, ®_value); + prog_id |= reg_value; + + /* test against calibration fusing */ + if (OTP_PROG_FUSE_VERSION_1_7V_CAL != 0U) + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + /* if C1 PMIC test for correct OTP */ + if(prog_id != match){/* allow only 1.7v OTP */ + error_print("PMIC INVALID!\n"); + } + } + else + { + error_print("PMIC INVALID!\n"); + } + } + else + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + if(prog_id == match){/* prohibit only 1.7V OTP */ + error_print("PMIC INVALID!\n"); + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A53 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW5; + *num_regs = 1U; + } + break; + case SC_SUBSYS_A72 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW1; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW2; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_1 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + default : + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qm_smarc_4g/board.h b/platform/board/mx8qm_smarc_4g/board.h new file mode 100755 index 0000000..841c97a --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/board.h @@ -0,0 +1,115 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U +#define PMIC_1_ADDR 0x9U + +#define PF8100_C1_SI_REV 0x31U +#define EP_PROG_ID 0x0417U +#define EQ_PROG_ID 0x0418U + +#define PMIC_TEMP_MAX 135U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..896973b --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ +DEFINE BD_DDR_RET_NUM_DRC 2 // Number of DRCs in the SoC + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser_DRC0_only.cfg b/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser_DRC0_only.cfg new file mode 100755 index 0000000..119af25 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/ddr_stress_test_parser_DRC0_only.cfg @@ -0,0 +1,142 @@ +DEFINE BD_DDR_RET_NUM_DRC 1 // One DRC in the SoC; DRC0 only + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz.cfg b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz.cfg new file mode 100644 index 0000000..54c4006 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz.cfg @@ -0,0 +1,593 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x100000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 4 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 + + +DEFINE BD_DDR_RET_REGION3_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION3_SIZE 64 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION4_SIZE 16 + + + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 // Gate functional clocks +DATA 4 0x41d00208 0x1 // Gate functional clocks +DATA 4 0x41a40044 0x8 // De-assert DDR PHY reset and keep DDR Controller in reset for its programming requirements +DATA 4 0x41d00044 0x8 // De-assert DDR PHY reset and keep DDR Controller in reset for its programming requirements +DATA 4 0x41a40204 0x1 // Ungate functional clocks +DATA 4 0x41d00204 0x1 // Ungate functional clocks + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC1080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x07070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC1080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x07070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 // De-assert DDR Controller reset +DATA 4 0x41d00044 0x4 // De-assert DDR Controller reset +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x03201901 +DATA 4 DDR_PHY_PTR1_0 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x03201901 +DATA 4 DDR_PHY_PTR1_1 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00032 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AB // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00032 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AB // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x64032010, 0x4E201C20, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00010236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg new file mode 100755 index 0000000..eb1ae49 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg @@ -0,0 +1,513 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_1 0x00808000 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------=------------ +// Set-up DRAM 1 PHY Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_1 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x33 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF +DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x03300640 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x03300640 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 +// Launch DRAM 1 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait (second time) DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_800MHz.cfg b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_800MHz.cfg new file mode 100755 index 0000000..0fc3ead --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_800MHz.cfg @@ -0,0 +1,624 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to 800MHz. */ + uint32_t rate2 = SC_400MHZ; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &rate2); +} +else +{ +/* Change to div4 output */ +DATA 4 0x41A43800 0x4C000000 +DATA 4 0x41D03800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_0 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_1 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x01A00C81 +DATA 4 DDR_PHY_PTR1_0 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x01A00C81 +DATA 4 DDR_PHY_PTR1_1 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00019 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00019 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x32019010, 0x27100E10, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + + + + + + + + + + + + + + + + + + + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_emul.cfg b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_emul.cfg new file mode 100755 index 0000000..26e3098 --- /dev/null +++ b/platform/board/mx8qm_smarc_4g/dcd/imx8qm_dcd_emul.cfg @@ -0,0 +1,214 @@ +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// Reset Should not be needed for ZEBU. +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 + +// ddrc_lpddr4_init(0) +DATA 4 0x5C000000 0xC3080020 +DATA 4 0x5C000064 0x006100E0 +DATA 4 0x5C0000D0 0x40020010 +DATA 4 0x5C0000D4 0x00100000 +DATA 4 0x5C0000DC 0x0054002D +DATA 4 0x5C0000E0 0x00310000 +DATA 4 0x5C0000F4 0x000006CF +DATA 4 0x5C000100 0x1A201B22 +DATA 4 0x5C000104 0x00060633 +DATA 4 0x5C000108 0x070E1014 +DATA 4 0x5C00010C 0x0170C00C +DATA 4 0x5C000110 0x0F04080F +DATA 4 0x5C000114 0x03040C0C +DATA 4 0x5C000118 0x02020007 +DATA 4 0x5C00011C 0x00000401 +DATA 4 0x5C000130 0x00020610 +DATA 4 0x5C000134 0x0C100002 +DATA 4 0x5C000138 0x000000E6 +DATA 4 0x5C000180 0x03200018 +DATA 4 0x5C000184 0x02800100 +DATA 4 0x5C000190 0x049C820C +DATA 4 0x5C000194 0x00060303 +DATA 4 0x5C0001B4 0x00001A0A +DATA 4 0x5C0001B0 0x00000005 +DATA 4 0x5C0001A0 0x80400003 +DATA 4 0x5C0001A4 0x00010002 +DATA 4 0x5C0001A8 0x80000000 +DATA 4 0x5C000200 0x00000017 +DATA 4 0x5C000204 0x00080808 +DATA 4 0x5C000214 0x07070707 +DATA 4 0x5C000218 0x07070707 +DATA 4 0x5C000244 0x00002211 +DATA 4 0x5C000490 0x00000001 +DATA 4 0x5C002190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 +//DATA 4 0x5C0001B0 0x00000004 +//DATA 4 0x5C0000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(0) +DATA 4 0x5C010100 0x0000040D +DATA 4 0x5C010018 0x00F0DA09 +DATA 4 0x5C01001C 0x050A1080 +DATA 4 0x5C010040 0x64032010 +DATA 4 0x5C010044 0x0D701C20 +DATA 4 0x5C010068 0x08000000 +DATA 4 0x5C0117C4 0x08000000 +DATA 4 0x5C010680 0x001FEC58 + +//ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00000040 +DATA 4 0x5C010004 0x00000041 + +//ddr_phy_lpddr4_dram_init(0) +DATA 4 0x5C010184 0x00000054 +DATA 4 0x5C010188 0x0000002D +DATA 4 0x5C01018C 0x00000031 +DATA 4 0x5C010110 0x1044220C +DATA 4 0x5C010114 0x28408C17 +DATA 4 0x5C010118 0x003C01CC +DATA 4 0x5C01011C 0x01800604 +DATA 4 0x5C010120 0x01C0000C +DATA 4 0x5C010124 0x00651D10 +DATA 4 0x5C01004C 0x00007D00 +DATA 4 0x5C010050 0x00000C90 +DATA 4 0x5C010054 0x00007D00 +DATA 4 0x5C010058 0x03000641 +DATA 4 0x5C010500 0x30070800 +DATA 4 0x5C010514 0x09000000 +DATA 4 0x5C010528 0xF0032019 +DATA 4 0x5C01052C 0x07F00173 +DATA 4 0x5C0117EC 0x00081800 +DATA 4 0x5C0117F0 0x09000000 +DATA 4 0x5C0117DC 0x013E4091 + +//ddr_phy_wait_init_done(0) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00040000 +DATA 4 0x5C010004 0x00040001 + +// SECOND DRC SYSTEM + +// ddrc_lpddr4_init(1) +DATA 4 0x5C100000 0xC3080020 +DATA 4 0x5C100064 0x006100E0 +DATA 4 0x5C1000D0 0x40020010 +DATA 4 0x5C1000D4 0x00100000 +DATA 4 0x5C1000DC 0x0054002D +DATA 4 0x5C1000E0 0x00310000 +DATA 4 0x5C1000F4 0x000006CF +DATA 4 0x5C100100 0x1A201B22 +DATA 4 0x5C100104 0x00060633 +DATA 4 0x5C100108 0x070E1014 +DATA 4 0x5C10010C 0x0170C00C +DATA 4 0x5C100110 0x0F04080F +DATA 4 0x5C100114 0x03040C0C +DATA 4 0x5C100118 0x02020007 +DATA 4 0x5C10011C 0x00000401 +DATA 4 0x5C100130 0x00020610 +DATA 4 0x5C100134 0x0C100002 +DATA 4 0x5C100138 0x000000E6 +DATA 4 0x5C100180 0x03200018 +DATA 4 0x5C100184 0x02800100 +DATA 4 0x5C100190 0x049C820C +DATA 4 0x5C100194 0x00060303 +DATA 4 0x5C1001B4 0x00001A0A +DATA 4 0x5C1001B0 0x00000005 +DATA 4 0x5C1001A0 0x80400003 +DATA 4 0x5C1001A4 0x00010002 +DATA 4 0x5C1001A8 0x80000000 +DATA 4 0x5C100200 0x00000017 +DATA 4 0x5C100204 0x00080808 +DATA 4 0x5C100214 0x07070707 +DATA 4 0x5C100218 0x07070707 +DATA 4 0x5C100244 0x00002211 +DATA 4 0x5C100490 0x00000001 +DATA 4 0x5C102190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_1 0x00000001 +CLR_BIT 4 DDRC_INIT0_1 0xC0000000 +//DATA 4 0x5C1001B0 0x00000004 +//DATA 4 0x5C1000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(1) +DATA 4 0x5C110100 0x0000040D +DATA 4 0x5C110018 0x00F0DA09 +DATA 4 0x5C11001C 0x050A1080 +DATA 4 0x5C110040 0x64032010 +DATA 4 0x5C110044 0x0D701C20 +DATA 4 0x5C110068 0x08000000 +DATA 4 0x5C1117C4 0x08000000 +DATA 4 0x5C110680 0x001FEC58 + +//ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00000040 +DATA 4 0x5C110004 0x00000041 + + +//ddr_phy_lpddr4_dram_init(1) +DATA 4 0x5C110184 0x00000054 +DATA 4 0x5C110188 0x0000002D +DATA 4 0x5C11018C 0x00000031 +DATA 4 0x5C110110 0x1044220C +DATA 4 0x5C110114 0x28408C17 +DATA 4 0x5C110118 0x003C01CC +DATA 4 0x5C11011C 0x01800604 +DATA 4 0x5C110120 0x01C0000C +DATA 4 0x5C110124 0x00651D10 +DATA 4 0x5C11004C 0x00007D00 +DATA 4 0x5C110050 0x00000C90 +DATA 4 0x5C110054 0x00007D00 +DATA 4 0x5C110058 0x03000641 +DATA 4 0x5C110500 0x30070800 +DATA 4 0x5C110514 0x09000000 +DATA 4 0x5C110528 0xF0032019 +DATA 4 0x5C11052C 0x07F00173 +DATA 4 0x5C1117EC 0x00081800 +DATA 4 0x5C1117F0 0x09000000 +DATA 4 0x5C1117DC 0x013E4091 + +//ddr_phy_wait_init_done(1) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00040000 +DATA 4 0x5C110004 0x00040001 + +// RESET +DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DSC_SetReset(SC_DSC_DRC_1, BIT(RST_DDR_CRESETN), SC_TRUE); +//DATA 4 0x41a40044 0x4 +//DATA 4 0x41d00044 0x4 + +// dram_init_inst(0) +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// dram_init_inst(1) +CLR_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_1 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_1 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +//DATA 4 0x5C000320 0x00000000 +//DATA 4 0x5C0001B0 0x00000005 +//DATA 4 0x5C000320 0x00000001 +//DATA 4 0x5C100320 0x00000000 +//DATA 4 0x5C1001B0 0x00000005 +//DATA 4 0x5C100320 0x00000001 + diff --git a/platform/board/mx8qm_smarc_8g/Makefile b/platform/board/mx8qm_smarc_8g/Makefile new file mode 100755 index 0000000..1c37faf --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/Makefile @@ -0,0 +1,61 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qm_dcd_emul +else + DDR_CON ?= imx8qm_dcd_1.6GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8qm_smarc_8g/board.bom b/platform/board/mx8qm_smarc_8g/board.bom new file mode 100755 index 0000000..6879226 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/board.bom @@ -0,0 +1,40 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif + diff --git a/platform/board/mx8qm_smarc_8g/board.c b/platform/board/mx8qm_smarc_8g/board.c new file mode 100755 index 0000000..40a7617 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/board.c @@ -0,0 +1,2007 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QM MEK board. + * + * @addtogroup MX8QM_MEK_BRD BRD: MX8QM MEK Board + * + * Module for MX8QM MEK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00090 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "drivers/systick/fsl_systick.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" + +/* ------------------------------------------------------------------------------------------------------------------ + * ----- iMX8QM: eDMA limitation USE CASE ----- + * ------------------------------------------------------------------------------------------------------------------ + * In the new kernel NXP use the "edma2" in the lpspi driver. The same dma controller is used from M core in FreeRTOS + * This generate a conflict and than a kernel crash + * ------------------------------------------------------------------------------------------------------------------ + * To add a clarification regarding eDMA: + * - The "edma2" node in the Linux device tree refers to the device at BAR 0x5a1f0000 described in the DMA memory map + * as "eDMA0" (i.MX 8QuadMax reference manual rev.F pp.32) + * - DMA0_BASE in imx-sc-firmware/src/scfw_export_mx8qm_b0/platform/devices/MX8QM/MX8QM.h also points to the + * RM's "eDMA0" at 0x5a1f0000. + * This confirms the eDMA conflict. + * + * How to use use eDMA0 in the FreeRTOS: + * - USE_DMA_0 must be defined + * - eDMA0 must be disabled in the Linux device tree overriding the nodes that use "edma2" or disabling the nodes + * that using it + * ------------------------------------------------------------------------------------------------------------------ + * The eDMA conflict affect the below FreeRTOS examples: + * - lpspi_edma_b2b_transfer_master.c + * - lpspi_edma_b2b_transfer_slave.c + * - lpuart_edma_transfer.c + * - edma_memory_to_memory.c + * - edma_scatter_gather.c + * - cmsis_usart_edma_transfer.c + * ------------------------------------------------------------------------------------------------------------------ + */ + +/* Local Defines */ + +#undef USE_DMA_0 /* Before define USE_DMA_0, read "iMX8QM: eDMA limitation USE CASE" above */ + +#undef M41_USES_SPI0 +#undef M41_USES_I2C3 +#undef M41_USES_GPIO3_24 +#undef M41_USES_CAN0 +#undef M41_USES_EDMA + +#ifndef USE_DMA_0 + #undef M41_USES_EDMA +#endif + +/*! Memory size */ +#ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_8GB +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U /*!< EMVSIM */ +#define BRD_R_BOARD_R3 6U /*!< USDHC2 on Base board */ +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 2U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +static sc_err_t pmic_ignore_current_limit(uint8_t address); +static sc_err_t pmic_update_timing(uint8_t address); +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver); +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm0; +static uint32_t temp_alarm1; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + /*rgpio_pin_config_t config; + config.pinDirection = kRGPIO_DigitalOutput;*/ + + ss_print(3, "board_init(%d)\n", phase); + + /*if (phase == BOOT_PHASE_HW_INIT) + { + #ifndef ALT_DEBUG_SCU_UART + pad_force_mux(SC_P_SCU_GPIO0_01, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + #endif*/ + /*pad_force_mux(SC_P_SCU_GPIO0_02, 0, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF);*/ + + /* Toggle base board reset SC_GPIO_01, >= 30nS */ + /*config.outputLogic = 0U; + FGPIO_PinInit(FGPIOA, 1U, &config); + SYSTICK_CycleDelay(SC_SYSTICK_NSEC_TO_TICKS(30U) + 1U); + FGPIO_PinWrite(FGPIOA, 1U, 1U);*/ + + /* SCU_LED on SC_GPIO_02 */ + /*config.outputLogic = 1U; + FGPIO_PinInit(FGPIOA, 2U, &config); + + SystemTimeDelay(2U); + } + else if (phase == BOOT_PHASE_FINAL_INIT)*/ + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if (defined(ALT_DEBUG_UART) || defined(ALT_DEBUG_SCU_UART)) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Use M4 UART if ALT_DEBUG_UART defined */ + /* Return if debug already enabled */ + if ((SCFW_DBG_READY == 0U) && (early_phase == SC_FALSE)) + { + sc_pm_clock_rate_t rate = SC_24MHZ; + static sc_bool_t banner = SC_FALSE; + + /* Configure pads */ + pad_force_mux(SC_P_M40_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M40_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SDA, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + pad_force_mux(SC_P_M41_I2C0_SCL, 1, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + + /* Power and enable clock */ + pm_force_resource_power_mode_v(SC_R_SC_PID0, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DBLOGIC, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DB, SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_1_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + + /* Configure UART */ + main_config_debug_uart(LPUART_DEBUG, rate); + + if (banner == SC_FALSE) + { + debug_print(1, + "\nHello from SCU (Build %u, Commit %08x, %s %s)\n\n", + SCFW_BUILD, SCFW_COMMIT, SCFW_DATE, SCFW_TIME); + banner = SC_TRUE; + } + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ + /* Use M4 UART if ALT_DEBUG_UART defined */ + #if defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Return if debug already disabled */ + if (SCFW_DBG_READY != 0U) + { + /* Disable use of UART */ + SCFW_DBG_READY = 0U; + + // UART deinit to flush TX buffers + LPUART_Deinit(LPUART_DEBUG); + + /* Turn off UART */ + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_OFF); + pm_force_resource_power_mode_v(SC_R_M4_1_UART, + SC_PM_PW_MODE_OFF); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + #ifdef ALT_DEBUG_UART + (void) rm_set_resource_movable(SC_PT, SC_R_M4_0_UART, SC_R_M4_0_UART, + SC_FALSE); + (void) rm_set_pad_movable(SC_PT, SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA, + SC_FALSE); + #endif + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SDA, SC_P_PMIC_I2C_SCL, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + rtn = BOARD_KS1_RESUME_USEC; + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + /* DC0 PLL0 spread spectrum config */ + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC0 PLL1 spread spectrum config */ + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL0 spread spectrum config */ + case BOARD_PARM_DC1_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL1 spread spectrum config */ + case BOARD_PARM_DC1_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* Control if SC WDOG configuration during KS1 */ + case BOARD_PARM_KS1_WDOG_WAKE: + rtn = BOARD_PARM_KS1_WDOG_WAKE_ENABLE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. - DDR_00060 */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + #if defined(BD_DDR_RET_NUM_DRC) && (BD_DDR_RET_NUM_DRC == 1U) + if(rsrc == SC_R_DRC_1) + { + rtn = SC_FALSE; + } + #endif + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + static uint32_t board_ddr_ret_buf4[BD_DDR_RET_REGION4_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + static uint32_t board_ddr_ret_buf5[BD_DDR_RET_REGION5_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + static uint32_t board_ddr_ret_buf6[BD_DDR_RET_REGION6_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 }, + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + { BD_DDR_RET_REGION4_ADDR, BD_DDR_RET_REGION4_SIZE, board_ddr_ret_buf4 }, + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + { BD_DDR_RET_REGION5_ADDR, BD_DDR_RET_REGION5_SIZE, board_ddr_ret_buf5 }, + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + { BD_DDR_RET_REGION6_ADDR, BD_DDR_RET_REGION6_SIZE, board_ddr_ret_buf6 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + else if (rm_is_resource_avail(SC_R_DRC_1)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_1, + SC_PM_CLK_SLV_BUS, &rate); + } + else + { + ; /* Intentional empty else */ + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + /* DDR_00040 */ + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. See DDR_00010. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + /* Supports stress test tool - DDR_00070 */ + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + case BOARD_DDR1_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(1); + #else + // Run vref training + DRAM_VREF_training_sw(1); + #endif + break; + default: + /* DDR_00020 */ + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + sc_rm_pt_t pt_m4_1 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[7U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_7A, + SC_R_MU_8B, + SC_R_GPT_4, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M40_I2C0_SCL, SC_P_M40_I2C0_SDA) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x0887FFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Create M4 1 partition */ + if (rm_is_resource_avail(SC_R_M4_1_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[5U] = + { + SC_R_IRQSTR_M4_1, +#ifdef M41_USES_SPI0 +#ifdef USE_DMA_0 + SC_R_DMA_0_CH0, + SC_R_DMA_0_CH1, /* DMA0 channels for SPI0 */ +#endif + SC_R_SPI_0, +#endif +#ifdef M41_USES_I2C3 + SC_R_DMA_1_CH0, + SC_R_DMA_1_CH1, /* DMA1 channels for I2C3 */ + SC_R_I2C_3, +#endif +#ifdef M41_USES_GPIO3_24 + SC_R_GPIO_3, +#endif + SC_R_MU_6B, + SC_R_MU_7B, + SC_R_MU_9B, +#ifdef M41_USES_EDMA + SC_R_DMA_0_CH30, /* DMA0 channel for EDMA sample code */ +#endif +#ifdef M41_USES_CAN0 + SC_R_CAN_0, +#endif + SC_R_GPT_3, + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M41_I2C0_SCL, SC_P_M41_I2C0_SDA), + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088800000ULL, 0x08FFFFFFFULL}, + {0x008181000ULL, 0x008280FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_1, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_1_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_1, "MCU1"); + + /* Allow M4 1 to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_m4_1, SC_RM_PERM_SEC_RW)); + + /* Move M4 1 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x038FE0000ULL, + 0x038FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_1, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_1, SC_PT)); + } + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[4U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4), + RM_RANGE(SC_R_M4_1_PID1, SC_R_M4_1_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + if (pt_m4_1 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_1, + SC_RM_PERM_FULL)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_1_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(pmic_id[idx], pmic_reg[idx], new_volt, + REG_RUN_MODE)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ + static uint32_t vdd_memc_mode = 0U; + + if (mode == SC_PM_PW_MODE_STBY) + { + /* + * System standby (KS1) entry allows VDD_MEMC to be gated off. + * Save current mode and switch off supply. + */ + if (PMIC_GET_MODE(PMIC_1_ADDR, PF8100_SW5, &vdd_memc_mode) + == SC_ERR_NONE) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, SW_STBY_OFF + | SW_RUN_OFF); + } + } + else if (mode == SC_PM_PW_MODE_ON) + { + /* + * System standby (KS1) exit should switch on VDD_MEMC. Restore + * previous mode saved during KS1 entry. + */ + if (vdd_memc_mode != 0U) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, vdd_memc_mode); + } + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + switch (idx) + { + case BRD_R_BOARD_R2 : /* EMVSIM */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_LDO1, + 3000, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_EN_STBY_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R3 : /* USDHC2 on Base Board */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_EN_STBY_EN | VSELECT_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_OFF_STBY_OFF)); + } + break; + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + #ifdef ALT_DEBUG_UART + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if ((resource == SC_R_M4_0_PID0) || (resource == SC_R_M4_1_PID0)) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm0 = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm1 = + SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + /* PMIC 0 */ + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm0; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* PMIC 1 */ + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_1_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm1; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_1_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* Board R7 - only here for testing */ + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Temp alarm from PMIC 1 */ + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC1_HIGH, + SC_PT_ALL); + } + /* Temp alarm from PMIC 0 */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* MEK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + + err |= pmic_ignore_current_limit(PMIC_0_ADDR); + err |= pmic_ignore_current_limit(PMIC_1_ADDR); + + /* Adjust startup timing */ + err |= pmic_update_timing(PMIC_0_ADDR); + err |= pmic_update_timing(PMIC_1_ADDR); + + err |= pmic_match_otp(PMIC_0_ADDR, pmic_ver); + err |= pmic_match_otp(PMIC_1_ADDR, pmic_ver); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + err |= pf8100_pmic_wdog_enable(PMIC_1_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW7, SW_RUN_PWM + | SW_STBY_PWM)); + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, 800, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update power timing for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_update_timing(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + + /* + * Add 60ms stable time for power down for: + * PMIC 1 : LDO2, SW6, SW7 + * PMIC 2 : LDO2, SW5, SW6, SW7 + * on i.mx8QM-mek + * board, otherwise system may reboot fail by mmc not power off + * clean + */ + if (address == PMIC_0_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 0 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else if (address == PMIC_1_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 1 */ + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x6F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else + { + /* Return error */ + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check correct version of OTP for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver) +{ + uint8_t reg_value = 0U; + uint16_t prog_id, match; + sc_err_t err = SC_ERR_NONE; + + if (address == PMIC_0_ADDR) + { + match = EP_PROG_ID; + } + else + { + match = EQ_PROG_ID; + } + + /* Read Prog ID */ + err |= PMIC_REGISTER_ACCESS(address, 0x2, SC_FALSE, ®_value); + prog_id = (((uint16_t)reg_value << 4U) & 0x0F00U); + err |= PMIC_REGISTER_ACCESS(address, 0x3U, SC_FALSE, ®_value); + prog_id |= reg_value; + + /* test against calibration fusing */ + if (OTP_PROG_FUSE_VERSION_1_7V_CAL != 0U) + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + /* if C1 PMIC test for correct OTP */ + if(prog_id != match){/* allow only 1.7v OTP */ + error_print("PMIC INVALID!\n"); + } + } + else + { + error_print("PMIC INVALID!\n"); + } + } + else + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + if(prog_id == match){/* prohibit only 1.7V OTP */ + error_print("PMIC INVALID!\n"); + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A53 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW5; + *num_regs = 1U; + } + break; + case SC_SUBSYS_A72 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW1; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW2; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_1 : + pmic_init(); + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + default : + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qm_smarc_8g/board.h b/platform/board/mx8qm_smarc_8g/board.h new file mode 100755 index 0000000..841c97a --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/board.h @@ -0,0 +1,115 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U +#define PMIC_1_ADDR 0x9U + +#define PF8100_C1_SI_REV 0x31U +#define EP_PROG_ID 0x0417U +#define EQ_PROG_ID 0x0418U + +#define PMIC_TEMP_MAX 135U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..896973b --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ +DEFINE BD_DDR_RET_NUM_DRC 2 // Number of DRCs in the SoC + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser_DRC0_only.cfg b/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser_DRC0_only.cfg new file mode 100755 index 0000000..119af25 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/ddr_stress_test_parser_DRC0_only.cfg @@ -0,0 +1,142 @@ +DEFINE BD_DDR_RET_NUM_DRC 1 // One DRC in the SoC; DRC0 only + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz.cfg b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz.cfg new file mode 100644 index 0000000..70100e3 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz.cfg @@ -0,0 +1,591 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x200000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 // Gate functional clocks +DATA 4 0x41d00208 0x1 // Gate functional clocks +DATA 4 0x41a40044 0x8 // De-assert DDR PHY reset and keep DDR Controller in reset for its programming requirements +DATA 4 0x41d00044 0x8 // De-assert DDR PHY reset and keep DDR Controller in reset for its programming requirements +DATA 4 0x41a40204 0x1 // Ungate functional clocks +DATA 4 0x41d00204 0x1 // Ungate functional clocks + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x08080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x08080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 // De-assert DDR Controller reset +DATA 4 0x41d00044 0x4 // De-assert DDR Controller reset +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x03201901 +DATA 4 DDR_PHY_PTR1_0 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x03201901 +DATA 4 DDR_PHY_PTR1_1 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00032 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AB // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00032 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AB // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x64032010, 0x4E201C20, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg new file mode 100755 index 0000000..eb1ae49 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg @@ -0,0 +1,513 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_1 0x00808000 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------=------------ +// Set-up DRAM 1 PHY Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_1 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x33 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF +DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x03300640 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x03300640 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 +// Launch DRAM 1 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait (second time) DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_800MHz.cfg b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_800MHz.cfg new file mode 100755 index 0000000..0fc3ead --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_800MHz.cfg @@ -0,0 +1,624 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to 800MHz. */ + uint32_t rate2 = SC_400MHZ; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &rate2); +} +else +{ +/* Change to div4 output */ +DATA 4 0x41A43800 0x4C000000 +DATA 4 0x41D03800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_0 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_1 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x01A00C81 +DATA 4 DDR_PHY_PTR1_0 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x01A00C81 +DATA 4 DDR_PHY_PTR1_1 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00019 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00019 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x32019010, 0x27100E10, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + + + + + + + + + + + + + + + + + + + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_emul.cfg b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_emul.cfg new file mode 100755 index 0000000..26e3098 --- /dev/null +++ b/platform/board/mx8qm_smarc_8g/dcd/imx8qm_dcd_emul.cfg @@ -0,0 +1,214 @@ +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// Reset Should not be needed for ZEBU. +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 + +// ddrc_lpddr4_init(0) +DATA 4 0x5C000000 0xC3080020 +DATA 4 0x5C000064 0x006100E0 +DATA 4 0x5C0000D0 0x40020010 +DATA 4 0x5C0000D4 0x00100000 +DATA 4 0x5C0000DC 0x0054002D +DATA 4 0x5C0000E0 0x00310000 +DATA 4 0x5C0000F4 0x000006CF +DATA 4 0x5C000100 0x1A201B22 +DATA 4 0x5C000104 0x00060633 +DATA 4 0x5C000108 0x070E1014 +DATA 4 0x5C00010C 0x0170C00C +DATA 4 0x5C000110 0x0F04080F +DATA 4 0x5C000114 0x03040C0C +DATA 4 0x5C000118 0x02020007 +DATA 4 0x5C00011C 0x00000401 +DATA 4 0x5C000130 0x00020610 +DATA 4 0x5C000134 0x0C100002 +DATA 4 0x5C000138 0x000000E6 +DATA 4 0x5C000180 0x03200018 +DATA 4 0x5C000184 0x02800100 +DATA 4 0x5C000190 0x049C820C +DATA 4 0x5C000194 0x00060303 +DATA 4 0x5C0001B4 0x00001A0A +DATA 4 0x5C0001B0 0x00000005 +DATA 4 0x5C0001A0 0x80400003 +DATA 4 0x5C0001A4 0x00010002 +DATA 4 0x5C0001A8 0x80000000 +DATA 4 0x5C000200 0x00000017 +DATA 4 0x5C000204 0x00080808 +DATA 4 0x5C000214 0x07070707 +DATA 4 0x5C000218 0x07070707 +DATA 4 0x5C000244 0x00002211 +DATA 4 0x5C000490 0x00000001 +DATA 4 0x5C002190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 +//DATA 4 0x5C0001B0 0x00000004 +//DATA 4 0x5C0000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(0) +DATA 4 0x5C010100 0x0000040D +DATA 4 0x5C010018 0x00F0DA09 +DATA 4 0x5C01001C 0x050A1080 +DATA 4 0x5C010040 0x64032010 +DATA 4 0x5C010044 0x0D701C20 +DATA 4 0x5C010068 0x08000000 +DATA 4 0x5C0117C4 0x08000000 +DATA 4 0x5C010680 0x001FEC58 + +//ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00000040 +DATA 4 0x5C010004 0x00000041 + +//ddr_phy_lpddr4_dram_init(0) +DATA 4 0x5C010184 0x00000054 +DATA 4 0x5C010188 0x0000002D +DATA 4 0x5C01018C 0x00000031 +DATA 4 0x5C010110 0x1044220C +DATA 4 0x5C010114 0x28408C17 +DATA 4 0x5C010118 0x003C01CC +DATA 4 0x5C01011C 0x01800604 +DATA 4 0x5C010120 0x01C0000C +DATA 4 0x5C010124 0x00651D10 +DATA 4 0x5C01004C 0x00007D00 +DATA 4 0x5C010050 0x00000C90 +DATA 4 0x5C010054 0x00007D00 +DATA 4 0x5C010058 0x03000641 +DATA 4 0x5C010500 0x30070800 +DATA 4 0x5C010514 0x09000000 +DATA 4 0x5C010528 0xF0032019 +DATA 4 0x5C01052C 0x07F00173 +DATA 4 0x5C0117EC 0x00081800 +DATA 4 0x5C0117F0 0x09000000 +DATA 4 0x5C0117DC 0x013E4091 + +//ddr_phy_wait_init_done(0) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00040000 +DATA 4 0x5C010004 0x00040001 + +// SECOND DRC SYSTEM + +// ddrc_lpddr4_init(1) +DATA 4 0x5C100000 0xC3080020 +DATA 4 0x5C100064 0x006100E0 +DATA 4 0x5C1000D0 0x40020010 +DATA 4 0x5C1000D4 0x00100000 +DATA 4 0x5C1000DC 0x0054002D +DATA 4 0x5C1000E0 0x00310000 +DATA 4 0x5C1000F4 0x000006CF +DATA 4 0x5C100100 0x1A201B22 +DATA 4 0x5C100104 0x00060633 +DATA 4 0x5C100108 0x070E1014 +DATA 4 0x5C10010C 0x0170C00C +DATA 4 0x5C100110 0x0F04080F +DATA 4 0x5C100114 0x03040C0C +DATA 4 0x5C100118 0x02020007 +DATA 4 0x5C10011C 0x00000401 +DATA 4 0x5C100130 0x00020610 +DATA 4 0x5C100134 0x0C100002 +DATA 4 0x5C100138 0x000000E6 +DATA 4 0x5C100180 0x03200018 +DATA 4 0x5C100184 0x02800100 +DATA 4 0x5C100190 0x049C820C +DATA 4 0x5C100194 0x00060303 +DATA 4 0x5C1001B4 0x00001A0A +DATA 4 0x5C1001B0 0x00000005 +DATA 4 0x5C1001A0 0x80400003 +DATA 4 0x5C1001A4 0x00010002 +DATA 4 0x5C1001A8 0x80000000 +DATA 4 0x5C100200 0x00000017 +DATA 4 0x5C100204 0x00080808 +DATA 4 0x5C100214 0x07070707 +DATA 4 0x5C100218 0x07070707 +DATA 4 0x5C100244 0x00002211 +DATA 4 0x5C100490 0x00000001 +DATA 4 0x5C102190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_1 0x00000001 +CLR_BIT 4 DDRC_INIT0_1 0xC0000000 +//DATA 4 0x5C1001B0 0x00000004 +//DATA 4 0x5C1000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(1) +DATA 4 0x5C110100 0x0000040D +DATA 4 0x5C110018 0x00F0DA09 +DATA 4 0x5C11001C 0x050A1080 +DATA 4 0x5C110040 0x64032010 +DATA 4 0x5C110044 0x0D701C20 +DATA 4 0x5C110068 0x08000000 +DATA 4 0x5C1117C4 0x08000000 +DATA 4 0x5C110680 0x001FEC58 + +//ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00000040 +DATA 4 0x5C110004 0x00000041 + + +//ddr_phy_lpddr4_dram_init(1) +DATA 4 0x5C110184 0x00000054 +DATA 4 0x5C110188 0x0000002D +DATA 4 0x5C11018C 0x00000031 +DATA 4 0x5C110110 0x1044220C +DATA 4 0x5C110114 0x28408C17 +DATA 4 0x5C110118 0x003C01CC +DATA 4 0x5C11011C 0x01800604 +DATA 4 0x5C110120 0x01C0000C +DATA 4 0x5C110124 0x00651D10 +DATA 4 0x5C11004C 0x00007D00 +DATA 4 0x5C110050 0x00000C90 +DATA 4 0x5C110054 0x00007D00 +DATA 4 0x5C110058 0x03000641 +DATA 4 0x5C110500 0x30070800 +DATA 4 0x5C110514 0x09000000 +DATA 4 0x5C110528 0xF0032019 +DATA 4 0x5C11052C 0x07F00173 +DATA 4 0x5C1117EC 0x00081800 +DATA 4 0x5C1117F0 0x09000000 +DATA 4 0x5C1117DC 0x013E4091 + +//ddr_phy_wait_init_done(1) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00040000 +DATA 4 0x5C110004 0x00040001 + +// RESET +DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DSC_SetReset(SC_DSC_DRC_1, BIT(RST_DDR_CRESETN), SC_TRUE); +//DATA 4 0x41a40044 0x4 +//DATA 4 0x41d00044 0x4 + +// dram_init_inst(0) +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// dram_init_inst(1) +CLR_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_1 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_1 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +//DATA 4 0x5C000320 0x00000000 +//DATA 4 0x5C0001B0 0x00000005 +//DATA 4 0x5C000320 0x00000001 +//DATA 4 0x5C100320 0x00000000 +//DATA 4 0x5C1001B0 0x00000005 +//DATA 4 0x5C100320 0x00000001 + diff --git a/platform/board/mx8qm_val/Makefile b/platform/board/mx8qm_val/Makefile new file mode 100755 index 0000000..ef0845a --- /dev/null +++ b/platform/board/mx8qm_val/Makefile @@ -0,0 +1,58 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qm_dcd_emul +else + DDR_CON ?= imx8qm_dcd_1.6GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o \ + $(OUT)/board/pmic.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + diff --git a/platform/board/mx8qm_val/board.bom b/platform/board/mx8qm_val/board.bom new file mode 100755 index 0000000..fbff4e9 --- /dev/null +++ b/platform/board/mx8qm_val/board.bom @@ -0,0 +1,37 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf100 \ + pmic/pf8100 + diff --git a/platform/board/mx8qm_val/board.c b/platform/board/mx8qm_val/board.c new file mode 100755 index 0000000..9d13076 --- /dev/null +++ b/platform/board/mx8qm_val/board.c @@ -0,0 +1,2086 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QM validation board. + * + * @addtogroup MX8QM_VAL_BRD BRD: MX8QM Validation Board + * + * Module for MX8QM validation board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00080, DDR_00030 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "all_ss.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf100/fsl_pf100.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" + +/* Local Defines */ + +/*! Memory size */ +#ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_6GB +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U /*!< PTN5150 */ +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U /*!< HSIC */ +#define BRD_R_BOARD_R3 6U /*!< USDHC2 on Base board */ +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 1 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif + +/*! Configure debug UART */ +#define LPUART_DEBUG LPUART_SC + +/*! Configure debug UART instance */ +#define LPUART_DEBUG_INST 0U + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +#ifndef EMUL + static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver); + static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver); +#endif +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t pmic_card; +static uint32_t temp_alarm0; +static uint32_t temp_alarm1; +static uint32_t temp_alarm2; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + rgpio_pin_config_t config; + config.pinDirection = kRGPIO_DigitalOutput; + config.outputLogic = 1U; + + ss_print(3, "board_init(%d)\n", phase); + + if (phase == BOOT_PHASE_HW_INIT) + { + pad_force_mux(SC_P_SCU_GPIO0_02, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + pad_force_mux(SC_P_SCU_GPIO0_03, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + + /* DELAYED_3V3_EN SC_GPIO_03 */ + FGPIO_PinInit(FGPIOA, 3U, &config); + + /* SCU_LED on */ + FGPIO_PinInit(FGPIOA, 2U, &config); + + SystemTimeDelay(2U); + } + else if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #ifndef DEBUG_TERM_EMUL + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if !defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Return if debug enabled */ + ASRT(SCFW_DBG_READY == 0U); + + /* Configure SCU UART */ + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SDA, SC_P_PMIC_I2C_SCL, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, SC_P_SCU_GPIO0_07, + SC_FALSE); +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + /* There are two versions of the val board. The DDR4 version uses + * an internal PCIe clock. This is a way to tell the boards + * apart from their DDR configuration. */ + #if defined(BD_DDR_RET_NUM_REGION) && (BD_DDR_RET_NUM_REGION == 4) + rtn = BOARD_PARM_RTN_INTERNAL; + #else + rtn = BOARD_PARM_RTN_EXTERNAL; + #endif + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + rtn = BOARD_KS1_RESUME_USEC; + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + /* DC0 PLL0 spread spectrum config */ + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC0 PLL1 spread spectrum config */ + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL0 spread spectrum config */ + case BOARD_PARM_DC1_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC1 PLL1 spread spectrum config */ + case BOARD_PARM_DC1_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. - DDR_00060 */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + #if defined(BD_DDR_RET_NUM_DRC) && (BD_DDR_RET_NUM_DRC == 1U) + if(rsrc == SC_R_DRC_1) + { + rtn = SC_FALSE; + } + #endif + #ifdef EMUL + if(rsrc == SC_R_PMIC_0) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_1) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + #endif + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + static uint32_t board_ddr_ret_buf4[BD_DDR_RET_REGION4_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + static uint32_t board_ddr_ret_buf5[BD_DDR_RET_REGION5_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + static uint32_t board_ddr_ret_buf6[BD_DDR_RET_REGION6_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 }, + #endif + #ifdef BD_DDR_RET_REGION4_SIZE + { BD_DDR_RET_REGION4_ADDR, BD_DDR_RET_REGION4_SIZE, board_ddr_ret_buf4 }, + #endif + #ifdef BD_DDR_RET_REGION5_SIZE + { BD_DDR_RET_REGION5_ADDR, BD_DDR_RET_REGION5_SIZE, board_ddr_ret_buf5 }, + #endif + #ifdef BD_DDR_RET_REGION6_SIZE + { BD_DDR_RET_REGION6_ADDR, BD_DDR_RET_REGION6_SIZE, board_ddr_ret_buf6 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + else if (rm_is_resource_avail(SC_R_DRC_1)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_1, + SC_PM_CLK_SLV_BUS, &rate); + } + else + { + ; /* Intentional empty else */ + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + /* DDR_00040 */ + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. See DDR_00010. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + /* Supports stress test tool - DDR_00070 */ + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + case BOARD_DDR1_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(1); + #else + // Run vref training + DRAM_VREF_training_sw(1); + #endif + break; + default: + /* DDR_00020 */ + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + sc_rm_pt_t pt_m4_1 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[7U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_7A, + SC_R_MU_8B, + SC_R_GPT_4, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[2U] = + { + RM_RANGE(SC_P_M40_I2C0_SCL, SC_P_M40_GPIO0_01) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x0887FFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Create M4 1 partition */ + if (rm_is_resource_avail(SC_R_M4_1_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[8U] = + { + SC_R_IRQSTR_M4_1, + SC_R_MU_6B, + SC_R_MU_7B, + SC_R_MU_9B, + SC_R_GPT_3, + RM_RANGE(SC_R_CAN_0, SC_R_CAN_2), + SC_R_FSPI_0 + }; + + /* List of pads */ + static const sc_pad_t pad_list[6U] = + { + RM_RANGE(SC_P_M41_I2C0_SCL, SC_P_M41_GPIO0_01), + RM_RANGE(SC_P_FLEXCAN0_RX, SC_P_FLEXCAN2_TX), + RM_RANGE(SC_P_QSPI0A_DATA0, SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088800000ULL, 0x08FFFFFFFULL}, + {0x008181000ULL, 0x008280FFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_1, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_1_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_1, "MCU1"); + + /* Allow M4 1 to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_m4_1, SC_RM_PERM_SEC_RW)); + + /* Move M4 1 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x038FE0000ULL, + 0x038FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_1, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_1, SC_PT)); + } + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[4U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4), + RM_RANGE(SC_R_M4_1_PID1, SC_R_M4_1_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + if (pt_m4_1 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_1, + SC_RM_PERM_FULL)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_1_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + uint8_t mode; + + if (pmic_ver.device_id == PF100_DEV_ID) + { + mode = SW_MODE_PWM_STBY_PWM; + } + else + { + mode = SW_RUN_PWM | SW_STBY_PWM; + } + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + mode)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + mode = 0U; + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + mode)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + uint8_t mode; + + if (pmic_ver.device_id == PF100_DEV_ID) + { + mode = SW_RUN_MODE; + } + else + { + mode = REG_RUN_MODE;/* run mode programming */ + } + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(pmic_id[idx], pmic_reg[idx], new_volt, + mode)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ + static uint32_t vdd_memc_mode = 0U; + + if (mode == SC_PM_PW_MODE_STBY) + { + /* + * System standby (KS1) entry allows VDD_MEMC to be gated off. + * Save current mode and switch off supply. + */ + if (PMIC_GET_MODE(PMIC_1_ADDR, PF8100_SW5, &vdd_memc_mode) + == SC_ERR_NONE) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, SW_STBY_OFF + | SW_RUN_OFF); + } + } + else if (mode == SC_PM_PW_MODE_ON) + { + /* + * System standby (KS1) exit should switch on VDD_MEMC. Restore + * previous mode saved during KS1 entry. + */ + if (vdd_memc_mode != 0U) + { + (void) PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW5, vdd_memc_mode); + } + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + switch (idx) + { + case BRD_R_BOARD_R0 : /* PTN5150 (use SC_R_BOARD_R0) */ + if (pmic_ver.device_id == PF100_DEV_ID) + { + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_2_ADDR, VGEN6, + 3000, SW_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_2_ADDR, VGEN6, + VGEN_MODE_ON)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_2_ADDR, VGEN6, + VGEN_MODE_OFF)); + } + } + else + {/* PF8100_dual Card */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_LDO1, + 3000, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_EN_STBY_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO1, + RUN_OFF_STBY_OFF)); + } + } + break; + case BRD_R_BOARD_R2 : /* HSIC (use SC_R_BOARD_R2) */ + if (pmic_ver.device_id == PF100_DEV_ID) + { + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, VGEN1, + 1200, SW_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, VGEN1, + VGEN_MODE_ON)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, VGEN1, + VGEN_MODE_OFF)); + } + } + else + {/* PF8100_dual Card */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_SW7, + 1200, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW7, + RUN_EN_STBY_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_SW7, + RUN_OFF_STBY_OFF)); + } + } + break; + case BRD_R_BOARD_R3 : /* USDHC2 on Base Board */ + if (pmic_card == PF8100_DUAL) + { + if (to_mode > SC_PM_PW_MODE_OFF) + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_EN_STBY_EN | VSELECT_EN)); + } + else + { + BRD_ERR(PMIC_SET_MODE(PMIC_1_ADDR, PF8100_LDO2, + RUN_OFF_STBY_OFF)); + } + } + break; + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if ((resource == SC_R_M4_0_PID0) || (resource == SC_R_M4_1_PID0)) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm0 = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm1 = + SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_2 : + if (ctrl == SC_C_TEMP_HI) + { + if (pmic_card == PF100_TRIPLE) + { + temp_alarm2 = + SET_PMIC_TEMP_ALARM(PMIC_2_ADDR, val); + } + else + { + temp_alarm2 = val; /* Fake the set if not there */ + } + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + /* PMIC 0 */ + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm0; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + /* PMIC 1 */ + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_1_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm1; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_1_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_2 : + if (ctrl == SC_C_TEMP) + { + if (pmic_card == PF100_TRIPLE) + { + *val = GET_PMIC_TEMP(PMIC_2_ADDR); + } + else + { + err = SC_ERR_PARM; + } + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm2; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_2_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R0 : + if (ctrl == SC_C_VOLTAGE) + { + /* For debug, get voltage */ + if (pmic_card == PF100_TRIPLE) + { + (void) PMIC_GET_VOLTAGE(PMIC_2_ADDR, VGEN6, val, + SW_RUN_MODE); + } + else + { + (void) PMIC_GET_VOLTAGE(PMIC_1_ADDR, PF8100_LDO1, + val, REG_RUN_MODE); + } + } + else + { + err = SC_ERR_PARM; + } + break; + /* Board R7 - only here for testing */ + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Handle IRQ */ + switch (pmic_card) + { + case PF100_TRIPLE : + /* Temp alarm from PMIC 2 */ + if (PMIC_IRQ_SERVICE(PMIC_2_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC2_HIGH, SC_PT_ALL); + } + /* Temp alarm from PMIC 1 */ + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC1_HIGH, SC_PT_ALL); + } + /* Temp alarm from PMIC 0 */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC0_HIGH, SC_PT_ALL); + } + break; + case PF8100_DUAL : + /* Temp alarm from PMIC 1 */ + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC1_HIGH, SC_PT_ALL); + } + /* Temp alarm from PMIC 0 */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC0_HIGH, SC_PT_ALL); + } + break; + default : + ; /* Intentional empty default */ + break; + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + /* Probe for PMIC 0 */ + if (pmic_get_device_id(PMIC_0_ADDR) == PF100_DEV_ID) + { /* probe for pmic at 0x8 */ + board_print(2, "Found Triple PF100 PMIC Card \n"); + pmic_card = PF100_TRIPLE; + PMIC_TYPE = PF100; + /* Probe for PMIC 1 */ + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + + /* Configure temp alarms */ + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + temp_alarm2 = SET_PMIC_TEMP_ALARM(PMIC_2_ADDR, PMIC_TEMP_MAX); + + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, SW1AB, SW_MODE_PWM_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, SW1C, SW_MODE_PWM_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_2_ADDR, SW3A, SW_MODE_PWM_STBY_PWM)); + } + /* Isolate Device Family to support 8100 & 8200 */ + else if ((pmic_get_device_id(PMIC_1_ADDR) & FAM_ID_MASK) == PF8X00_FAM_ID) + { + pmic_card = PF8100_DUAL; + PMIC_TYPE = PF8100; + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + board_print(2, "Found Dual PF8100 PMIC Card Rev:0x%x\n",pmic_ver.si_rev); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + + err = SC_ERR_NONE; + + /* ignore OV/UV for A0/B0 & bypass current limit for A0 */ + err |= pmic_ignore_current_limit(PMIC_0_ADDR, pmic_ver); + err |= pmic_ignore_current_limit(PMIC_1_ADDR, pmic_ver); + + err |= pmic_match_otp(PMIC_0_ADDR, pmic_ver); + err |= pmic_match_otp(PMIC_1_ADDR, pmic_ver); + + if(pmic_ver.si_rev == PF8100_A0_REV) + { + /* set Regulation modes for MAIN and 1.8V rails */ + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, SW_RUN_PWM + | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW7, SW_RUN_PWM + | SW_STBY_PWM)); + } + + if (err != SC_ERR_NONE) + { + error_print("PMIC Initialization Error!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, + 800, REG_STBY_MODE)); + } + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + err |= pf8100_pmic_wdog_enable(PMIC_1_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + } + /* Isolate Device Family to support 8100 & 8200 */ + else if ((pmic_get_device_id(PMIC_0_ADDR) & FAM_ID_MASK) + == PF8X00_FAM_ID) + { + board_print(2, "Found Single PF8100 PMIC Card\n"); + error_print("Single PF8100 PMIC NOT Supported!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + else + { + error_print("PMIC Card not found!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +#ifndef EMUL +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address, pmic_version_t ver) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Only bypass current limit on A0 silicon */ + if (ver.si_rev == PF8100_A0_REV) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + } + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check correct version of OTP for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver) +{ + uint8_t reg_value = 0U; + uint16_t prog_id, match; + sc_err_t err = SC_ERR_NONE; + + if (address == PMIC_0_ADDR) + { + match = EP_PROG_ID; + } + else + { + match = EQ_PROG_ID; + } + + /* Read Prog ID */ + err |= PMIC_REGISTER_ACCESS(address, 0x2, SC_FALSE, ®_value); + prog_id = (((uint16_t)reg_value << 4U) & 0x0F00U); + err |= PMIC_REGISTER_ACCESS(address, 0x3U, SC_FALSE, ®_value); + prog_id |= reg_value; + + /* test against calibration fusing */ + if (OTP_PROG_FUSE_VERSION_1_7V_CAL != 0U) + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + /* if C1 PMIC test for correct OTP */ + if(prog_id != match){/* allow only 1.7v OTP */ + error_print("PMIC INVALID!\n"); + } + } + else + { + error_print("PMIC INVALID!\n"); + } + } + else + { + if (ver.si_rev >= PF8100_C1_SI_REV) + { + if(prog_id == match){/* prohibit only 1.7V OTP */ + error_print("PMIC INVALID!\n"); + } + } + } + + return err; +} + +#endif + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A53 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_2_ADDR; + pmic_reg[0] = SW2; + *num_regs = 1U; + } + else + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW5; + *num_regs = 1U; + } + break; + case SC_SUBSYS_A72 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = SW3A; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = SW3B; + *num_regs = 2U; + } + else + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = SW1AB; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = SW1C; + *num_regs = 2U; + } + else + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW1; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW2; + *num_regs = 2U; + } + break; + case SC_SUBSYS_GPU_1 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_2_ADDR; + pmic_reg[0] = SW1AB; + pmic_id[1] = PMIC_2_ADDR; + pmic_reg[1] = SW1C; + *num_regs = 2U; + } + else + {/* PF8100_dual Card */ + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + break; + default : + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qm_val/board.h b/platform/board/mx8qm_val/board.h new file mode 100755 index 0000000..0c59775 --- /dev/null +++ b/platform/board/mx8qm_val/board.h @@ -0,0 +1,125 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +#define PMIC_0_ADDR 0x8U +#define PMIC_1_ADDR 0x9U +#define PMIC_2_ADDR 0xAU + +#define PMIC_TEMP_MAX 135U + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +#define SW1ABC_STEP 25U +#define SW2_STEP 25U +#define SW3_STEP 25U +#define PMIC0_SW4_STEP 25U +#define PMIC1_SW4_STEP 50U +#define VGEN12_STEP 50U +#define VGEN3456_STEP 100U + +#define PF100_TRIPLE 0U +#define PF8100_DUAL 1U +#define PF8100_SINGLE 2U + +#define PF8100_C1_SI_REV 0x31U +#define EP_PROG_ID 0x0417U +#define EQ_PROG_ID 0x0418U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qm_val/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qm_val/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..896973b --- /dev/null +++ b/platform/board/mx8qm_val/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ +DEFINE BD_DDR_RET_NUM_DRC 2 // Number of DRCs in the SoC + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_val/dcd/ddr_stress_test_parser_DRC0_only.cfg b/platform/board/mx8qm_val/dcd/ddr_stress_test_parser_DRC0_only.cfg new file mode 100755 index 0000000..119af25 --- /dev/null +++ b/platform/board/mx8qm_val/dcd/ddr_stress_test_parser_DRC0_only.cfg @@ -0,0 +1,142 @@ +DEFINE BD_DDR_RET_NUM_DRC 1 // One DRC in the SoC; DRC0 only + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + diff --git a/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz.cfg b/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz.cfg new file mode 100755 index 0000000..cb0c950 --- /dev/null +++ b/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz.cfg @@ -0,0 +1,590 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x801C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x03201901 +DATA 4 DDR_PHY_PTR1_0 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x03201901 +DATA 4 DDR_PHY_PTR1_1 0x027100E1 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00032 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x000186A0 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000064 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00002710 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00032 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000064 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x64032010, 0x4E201C20, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg b/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg new file mode 100755 index 0000000..eb1ae49 --- /dev/null +++ b/platform/board/mx8qm_val/dcd/imx8qm_dcd_1.6GHz_nocbt.cfg @@ -0,0 +1,513 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_0 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000213 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x0186A000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x006100E0 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4003061C // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x009E0000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x0054002D // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x1A201B22 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x00060633 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x07101617 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00C0C000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x0F04080F // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02040C0C // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020007 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000401 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020610 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0C100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x000000E6 // txsr +DATA 4 DDRC_ZQCTL0_1 0x03200018 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x028061A8 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x049E820C // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00001C0A // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 +DATA 4 DDRC_DFITMG0_SHADOW_1 0x00808000 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------=------------ +// Set-up DRAM 1 PHY Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F0D879 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x64032010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x4E201C20 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x001C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008C2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_1 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x33 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF +DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x03300640 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x54 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x2D // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x1044220C // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x28400417 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006CA1CC // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800602 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x01C02B0F // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x21651D11 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0030D400 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000C80 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x0004E200 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x03300640 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F001AF // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 +// Launch DRAM 1 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Wait (second time) DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240B3 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qm_val/dcd/imx8qm_dcd_800MHz.cfg b/platform/board/mx8qm_val/dcd/imx8qm_dcd_800MHz.cfg new file mode 100755 index 0000000..0fc3ead --- /dev/null +++ b/platform/board/mx8qm_val/dcd/imx8qm_dcd_800MHz.cfg @@ -0,0 +1,624 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x180000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 2 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 6 /* DDR regions to save/restore */ +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80008040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80010000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 +DEFINE BD_DDR_RET_REGION4_ADDR 0x80001000 +DEFINE BD_DDR_RET_REGION4_SIZE 64 +DEFINE BD_DDR_RET_REGION5_ADDR 0x80009040 +DEFINE BD_DDR_RET_REGION5_SIZE 16 +DEFINE BD_DDR_RET_REGION6_ADDR 0x80011000 +DEFINE BD_DDR_RET_REGION6_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 23 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to 800MHz. */ + uint32_t rate2 = SC_400MHZ; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &rate2); +} +else +{ +/* Change to div4 output */ +DATA 4 0x41A43800 0x4C000000 +DATA 4 0x41D03800 0x4C000000 +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_0 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +/* DRAM 1 controller initialization */ +DATA 4 DDRC_MSTR_1 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_1 0x00000111 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_1 0x00C35000 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_1 0x0021F000 +DATA 4 DDRC_RFSHTMG_1 0x00300070 // tREFI, tRFC +DATA 4 DDRC_INIT0_1 0x4002030F // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_1 0x00500000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_1 0x00240012 // MR1, MR2 +DATA 4 DDRC_INIT4_1 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_1 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_1 0x10100D11 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_1 0x0003041A // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_1 0x0408100F // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_1 0x00606000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_1 0x08040408 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_1 0x02030606 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_1 0x02020004 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_1 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_1 0x00020310 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_1 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_1 0x00000073 // txsr +DATA 4 DDRC_ZQCTL0_1 0x0190000C // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_1 0x014030D4 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_1 0x048D8206 // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_1 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_1 0x00000B04 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_1 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_1 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_1 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_1 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_1 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_1 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_1 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_1 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_1 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_1 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_1 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_1 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_1 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRCTL_1 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_PWRTMG_1 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x06FF0001 +DATA 4 DDRC_HWLPCTL_1 0x06FF0001 + +DATA 4 DDRC_SCHED_0 0x00001F05 // CAM (32 entries) +DATA 4 DDRC_SCHED_1 0x00001F05 // CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 +DATA 4 DDRC_DFILPCFG0_1 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41a40208 0x1 +DATA 4 0x41d00208 0x1 +DATA 4 0x41a40044 0x4 +DATA 4 0x41d00044 0x4 +DATA 4 0x41a40204 0x1 +DATA 4 0x41d00204 0x1 + +//------------------------------------------- +// Configure PHY registers for PHY initialization +//-------------------------------------------- +/* DRAM 0 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register + +/* DRAM 1 controller configuration begin */ +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_1 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_1 0x000F0009 +DATA 4 DDR_PHY_DX0DQMAP0_1 0x00003465 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_1 0x00008271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_1 0x00075632 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_1 0x00008104 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_1 0x00064732 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_1 0x00008015 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_1 0x00012574 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_1 0x00008360 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_1 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_1 0x0013AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_1 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_1 0x87001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_1 0x00F06AAC // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_1 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_1 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_1 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_1 0x811C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0x811C0000 +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_1 0x008A2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_1 0x0001B9BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_1 0x0001B9BB // Impedance control for DQ bus + + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 +DATA 4 DDR_PHY_PIR_1 0x10 +DATA 4 DDR_PHY_PIR_1 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +/* DRAM 0 */ +DATA 4 DDR_PHY_PLLCR0_0 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41a40208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41a40504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41a40204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x01A00C81 +DATA 4 DDR_PHY_PTR1_0 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +/* DRAM 1 */ +DATA 4 DDR_PHY_PLLCR0_1 0xA11C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_1 0xA11C0000 +// Switch to boot frequency +DATA 4 0x41d00208 0x1 +DATA 4 0x41d00504 0x00800000 +DATA 4 0x41d00204 0x1 +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_1 0x01A00C81 +DATA 4 DDR_PHY_PTR1_1 0x01390071 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_1 0x22 +DATA 4 DDR_PHY_PIR_1 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00019 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +/* DRAM 1 */ +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_1 0x24 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_1 0x12 // Set RL/WL +DATA 4 DDR_PHY_MR3_1 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_1 0x54 // Set CA ODT and DQ ODT +DATA 4 DDR_PHY_MR13_1 0x40 +DATA 4 DDR_PHY_MR22_1 0x16 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_1 0x48 +DATA 4 DDR_PHY_MR14_1 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_1 0x08221108 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_1 0x2820040C // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_1 0x006640E6 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_1 0x01800301 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_1 0x00E02B09 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_1 0x11330F09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_1 0x000A3DEF +DATA 4 DDR_PHY_PTR3_1 0x0000C350 // tDINIT0 +DATA 4 DDR_PHY_PTR4_1 0x00000032 // tDINIT1 +DATA 4 DDR_PHY_PTR5_1 0x00001388 // tDINIT2 +DATA 4 DDR_PHY_PTR6_1 0x00B00019 // tDINIT4, tDINIT3 (1us) +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_1 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_1 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_1 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_1 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_1 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_1 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_1 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_1 0x07F0016F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_1 0x4 +DATA 4 DDR_PHY_PGCR6_1 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_1 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_1 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH +DATA 4 DDR_PHY_DX8SLbDXCTL2_1 0x001C1600 +DATA 4 DDR_PHY_PGCR4_1 0x001900B1 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_1 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x180 +DATA 4 DDR_PHY_PIR_1 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- + +/* DRAM 0 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +/* DRAM 1 */ +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_1 0x00000032 +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_1 0x100 +DATA 4 DDR_PHY_PIR_1 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// DRAM 1 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x32019010, 0x27100E10, 2); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +CLR_BIT 4 DDR_PHY_DQSDR0_1 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_1 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_1 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_1 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_1 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_1 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN +DATA 4 DDR_PHY_DTCR0_1 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_1 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +DATA 4 DDR_PHY_PIR_1 0x200 +DATA 4 DDR_PHY_PIR_1 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 + +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00200000 +// Set DQS/DQSn glitch suppression resistor for training PHY1 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_1 0x400 +DATA 4 DDR_PHY_PIR_1 0x401 + +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 + +// Wait Read DQS training to complete PHY1 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY1 +DATA 4 DDR_PHY_DX8SLbDQSCTL_1 0x01224000 +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_1 0x0010F800 +DATA 4 DDR_PHY_PIR_1 0x0010F801 + +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_1 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); +RDBI_bit_deskew(1); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +DRAM_VREF_training_hw(1); +#else +// Run vref training +DRAM_VREF_training_sw(0); +DRAM_VREF_training_sw(1); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +DATA 4 DDR_PHY_DX8SLbDDLCTL_1 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 +CLR_BIT 4 DDR_PHY_PGCR1_1 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 +//DQS Drift Registers PHY1 +CLR_BIT 4 DDR_PHY_DX0GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_1 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_1 0x08000000 +// Enable DQS drift detection PHY1 +DATA 4 DDR_PHY_DQSDR0_1 0x20188005 +DATA 4 DDR_PHY_DQSDR1_1 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_1 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41A40504 0x400 +DATA 4 0x41D00504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 +CLR_BIT 4 DDR_PHY_PGCR6_1 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + + + + + + + + + + + + + + + + + + + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qm_val/dcd/imx8qm_dcd_emul.cfg b/platform/board/mx8qm_val/dcd/imx8qm_dcd_emul.cfg new file mode 100755 index 0000000..26e3098 --- /dev/null +++ b/platform/board/mx8qm_val/dcd/imx8qm_dcd_emul.cfg @@ -0,0 +1,214 @@ +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// Reset Should not be needed for ZEBU. +DATA 4 0x41a40044 0x8 +DATA 4 0x41d00044 0x8 + +// ddrc_lpddr4_init(0) +DATA 4 0x5C000000 0xC3080020 +DATA 4 0x5C000064 0x006100E0 +DATA 4 0x5C0000D0 0x40020010 +DATA 4 0x5C0000D4 0x00100000 +DATA 4 0x5C0000DC 0x0054002D +DATA 4 0x5C0000E0 0x00310000 +DATA 4 0x5C0000F4 0x000006CF +DATA 4 0x5C000100 0x1A201B22 +DATA 4 0x5C000104 0x00060633 +DATA 4 0x5C000108 0x070E1014 +DATA 4 0x5C00010C 0x0170C00C +DATA 4 0x5C000110 0x0F04080F +DATA 4 0x5C000114 0x03040C0C +DATA 4 0x5C000118 0x02020007 +DATA 4 0x5C00011C 0x00000401 +DATA 4 0x5C000130 0x00020610 +DATA 4 0x5C000134 0x0C100002 +DATA 4 0x5C000138 0x000000E6 +DATA 4 0x5C000180 0x03200018 +DATA 4 0x5C000184 0x02800100 +DATA 4 0x5C000190 0x049C820C +DATA 4 0x5C000194 0x00060303 +DATA 4 0x5C0001B4 0x00001A0A +DATA 4 0x5C0001B0 0x00000005 +DATA 4 0x5C0001A0 0x80400003 +DATA 4 0x5C0001A4 0x00010002 +DATA 4 0x5C0001A8 0x80000000 +DATA 4 0x5C000200 0x00000017 +DATA 4 0x5C000204 0x00080808 +DATA 4 0x5C000214 0x07070707 +DATA 4 0x5C000218 0x07070707 +DATA 4 0x5C000244 0x00002211 +DATA 4 0x5C000490 0x00000001 +DATA 4 0x5C002190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 +//DATA 4 0x5C0001B0 0x00000004 +//DATA 4 0x5C0000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(0) +DATA 4 0x5C010100 0x0000040D +DATA 4 0x5C010018 0x00F0DA09 +DATA 4 0x5C01001C 0x050A1080 +DATA 4 0x5C010040 0x64032010 +DATA 4 0x5C010044 0x0D701C20 +DATA 4 0x5C010068 0x08000000 +DATA 4 0x5C0117C4 0x08000000 +DATA 4 0x5C010680 0x001FEC58 + +//ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00000040 +DATA 4 0x5C010004 0x00000041 + +//ddr_phy_lpddr4_dram_init(0) +DATA 4 0x5C010184 0x00000054 +DATA 4 0x5C010188 0x0000002D +DATA 4 0x5C01018C 0x00000031 +DATA 4 0x5C010110 0x1044220C +DATA 4 0x5C010114 0x28408C17 +DATA 4 0x5C010118 0x003C01CC +DATA 4 0x5C01011C 0x01800604 +DATA 4 0x5C010120 0x01C0000C +DATA 4 0x5C010124 0x00651D10 +DATA 4 0x5C01004C 0x00007D00 +DATA 4 0x5C010050 0x00000C90 +DATA 4 0x5C010054 0x00007D00 +DATA 4 0x5C010058 0x03000641 +DATA 4 0x5C010500 0x30070800 +DATA 4 0x5C010514 0x09000000 +DATA 4 0x5C010528 0xF0032019 +DATA 4 0x5C01052C 0x07F00173 +DATA 4 0x5C0117EC 0x00081800 +DATA 4 0x5C0117F0 0x09000000 +DATA 4 0x5C0117DC 0x013E4091 + +//ddr_phy_wait_init_done(0) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init(0) +DATA 4 0x5C010004 0x00040000 +DATA 4 0x5C010004 0x00040001 + +// SECOND DRC SYSTEM + +// ddrc_lpddr4_init(1) +DATA 4 0x5C100000 0xC3080020 +DATA 4 0x5C100064 0x006100E0 +DATA 4 0x5C1000D0 0x40020010 +DATA 4 0x5C1000D4 0x00100000 +DATA 4 0x5C1000DC 0x0054002D +DATA 4 0x5C1000E0 0x00310000 +DATA 4 0x5C1000F4 0x000006CF +DATA 4 0x5C100100 0x1A201B22 +DATA 4 0x5C100104 0x00060633 +DATA 4 0x5C100108 0x070E1014 +DATA 4 0x5C10010C 0x0170C00C +DATA 4 0x5C100110 0x0F04080F +DATA 4 0x5C100114 0x03040C0C +DATA 4 0x5C100118 0x02020007 +DATA 4 0x5C10011C 0x00000401 +DATA 4 0x5C100130 0x00020610 +DATA 4 0x5C100134 0x0C100002 +DATA 4 0x5C100138 0x000000E6 +DATA 4 0x5C100180 0x03200018 +DATA 4 0x5C100184 0x02800100 +DATA 4 0x5C100190 0x049C820C +DATA 4 0x5C100194 0x00060303 +DATA 4 0x5C1001B4 0x00001A0A +DATA 4 0x5C1001B0 0x00000005 +DATA 4 0x5C1001A0 0x80400003 +DATA 4 0x5C1001A4 0x00010002 +DATA 4 0x5C1001A8 0x80000000 +DATA 4 0x5C100200 0x00000017 +DATA 4 0x5C100204 0x00080808 +DATA 4 0x5C100214 0x07070707 +DATA 4 0x5C100218 0x07070707 +DATA 4 0x5C100244 0x00002211 +DATA 4 0x5C100490 0x00000001 +DATA 4 0x5C102190 0x00808000 + +// Correct CLR settings +CLR_BIT 4 DDRC_DFIMISC_1 0x00000001 +CLR_BIT 4 DDRC_INIT0_1 0xC0000000 +//DATA 4 0x5C1001B0 0x00000004 +//DATA 4 0x5C1000D0 0x00020010 + +// ddr_phy_lpddr4_phy_init(1) +DATA 4 0x5C110100 0x0000040D +DATA 4 0x5C110018 0x00F0DA09 +DATA 4 0x5C11001C 0x050A1080 +DATA 4 0x5C110040 0x64032010 +DATA 4 0x5C110044 0x0D701C20 +DATA 4 0x5C110068 0x08000000 +DATA 4 0x5C1117C4 0x08000000 +DATA 4 0x5C110680 0x001FEC58 + +//ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00000040 +DATA 4 0x5C110004 0x00000041 + + +//ddr_phy_lpddr4_dram_init(1) +DATA 4 0x5C110184 0x00000054 +DATA 4 0x5C110188 0x0000002D +DATA 4 0x5C11018C 0x00000031 +DATA 4 0x5C110110 0x1044220C +DATA 4 0x5C110114 0x28408C17 +DATA 4 0x5C110118 0x003C01CC +DATA 4 0x5C11011C 0x01800604 +DATA 4 0x5C110120 0x01C0000C +DATA 4 0x5C110124 0x00651D10 +DATA 4 0x5C11004C 0x00007D00 +DATA 4 0x5C110050 0x00000C90 +DATA 4 0x5C110054 0x00007D00 +DATA 4 0x5C110058 0x03000641 +DATA 4 0x5C110500 0x30070800 +DATA 4 0x5C110514 0x09000000 +DATA 4 0x5C110528 0xF0032019 +DATA 4 0x5C11052C 0x07F00173 +DATA 4 0x5C1117EC 0x00081800 +DATA 4 0x5C1117F0 0x09000000 +DATA 4 0x5C1117DC 0x013E4091 + +//ddr_phy_wait_init_done(1) +CHECK_BITS_SET 4 DDR_PHY_PGSR0_1 0x1 + +// ddr_phy_launch_init(1) +DATA 4 0x5C110004 0x00040000 +DATA 4 0x5C110004 0x00040001 + +// RESET +DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DSC_SetReset(SC_DSC_DRC_1, BIT(RST_DDR_CRESETN), SC_TRUE); +//DATA 4 0x41a40044 0x4 +//DATA 4 0x41d00044 0x4 + +// dram_init_inst(0) +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// dram_init_inst(1) +CLR_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_1 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_1 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_1 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 +CHECK_BITS_SET 4 DDRC_STAT_1 0x1 + +//DATA 4 0x5C000320 0x00000000 +//DATA 4 0x5C0001B0 0x00000005 +//DATA 4 0x5C000320 0x00000001 +//DATA 4 0x5C100320 0x00000000 +//DATA 4 0x5C1001B0 0x00000005 +//DATA 4 0x5C100320 0x00000001 + diff --git a/platform/board/mx8qx_dxl_phantom/Makefile b/platform/board/mx8qx_dxl_phantom/Makefile new file mode 100755 index 0000000..0a95b08 --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/Makefile @@ -0,0 +1,61 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8dxl_dcd_emul +else + DDR_CON ?= imx8dxl_dcd_lpddr4_16bit_1.2GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8qx_dxl_phantom/board.bom b/platform/board/mx8qx_dxl_phantom/board.bom new file mode 100755 index 0000000..496815c --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/board.bom @@ -0,0 +1,9 @@ + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif + diff --git a/platform/board/mx8qx_dxl_phantom/board.c b/platform/board/mx8qx_dxl_phantom/board.c new file mode 100755 index 0000000..6319e65 --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/board.c @@ -0,0 +1,1668 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QX MEK board. + * + * @addtogroup MX8QX_MEK_BRD BRD: MX8QX MEK Board + * + * Module for MX8QX MEK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00120 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/igpio/fsl_gpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" +#include "drivers/systick/fsl_systick.h" + +/* Local Defines */ + +/*! Memory size */ +#ifndef BD_DDR_SIZE + #define BD_DDR_SIZE SC_1GB +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U +#define BRD_R_BOARD_R3 6U +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 2U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +#ifndef EMUL +static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver); +static sc_err_t pmic_update_timing(uint8_t address); +#endif +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + ss_print(3, "board_init(%d)\n", phase); + + if (phase == BOOT_PHASE_HW_INIT) + { + /* Remove SS not available on DXL */ + soc_ss_notavail(SC_SUBSYS_MIPI_0); + soc_ss_notavail(SC_SUBSYS_MIPI_1); + soc_ss_notavail(SC_SUBSYS_IMG); + soc_ss_notavail(SC_SUBSYS_CSI_0); + soc_ss_notavail(SC_SUBSYS_PI_0); + } + else if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_EARLY_INIT) + { + gpio_pin_config_t config; + config.direction = kGPIO_DigitalOutput; + + /* Power on GPIO */ + pm_force_resource_power_mode_v(SC_R_GPIO_1, SC_PM_PW_MODE_ON); + + /* Mux SPI2_SDO to GPIO */ + pad_force_mux(SC_P_SPI2_SDO, 4, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + + /* Toggle base board reset, >= 30nS */ + config.outputLogic = 0U; + GPIO_PinInit(GPIO1, 1U, &config); + SYSTICK_CycleDelay(SC_SYSTICK_NSEC_TO_TICKS(30U) + 1U); + GPIO_WritePinOutput(GPIO1, 1U, 1U); + + /* Latch output */ + pad_force_mux(SC_P_SPI2_SDO, 4, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_ON); + + /* Power off GPIO */ + pm_force_resource_power_mode_v(SC_R_GPIO_1, SC_PM_PW_MODE_OFF); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if (defined(ALT_DEBUG_UART) || defined(ALT_DEBUG_SCU_UART)) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Use M4 UART if ALT_DEBUG_UART defined */ + /* Return if debug already enabled */ + if ((SCFW_DBG_READY == 0U) && (early_phase == SC_FALSE)) + { + sc_pm_clock_rate_t rate = SC_24MHZ; + static sc_bool_t banner = SC_FALSE; + + /* Configure pads */ + pad_force_mux(SC_P_ADC_IN2, 1, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + pad_force_mux(SC_P_ADC_IN3, 1, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + + /* Power and enable clock */ + pm_force_resource_power_mode_v(SC_R_SC_PID0, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DBLOGIC, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DB, SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + + /* Configure UART */ + main_config_debug_uart(LPUART_DEBUG, rate); + + if (banner == SC_FALSE) + { + debug_print(1, + "\nHello from SCU (Build %u, Commit %08x, %s %s)\n\n", + SCFW_BUILD, SCFW_COMMIT, SCFW_DATE, SCFW_TIME); + banner = SC_TRUE; + } + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ + /* Use M4 UART if ALT_DEBUG_UART defined */ + #if defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Return if debug already disabled */ + if (SCFW_DBG_READY != 0U) + { + /* Disable use of UART */ + SCFW_DBG_READY = 0U; + + // UART deinit to flush TX buffers + LPUART_Deinit(LPUART_DEBUG); + + /* Turn off UART */ + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_OFF); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + #ifdef ALT_DEBUG_UART + (void) rm_set_resource_movable(SC_PT, SC_R_M4_0_UART, SC_R_M4_0_UART, + SC_FALSE); + (void) rm_set_pad_movable(SC_PT, SC_P_ADC_IN3, SC_P_ADC_IN2, + SC_FALSE); + #endif + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SCL, SC_P_PMIC_I2C_SDA, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + if (OTP_KS1_07V_SUPPORT == 1U) /* KS1 0.7V support */ + { + rtn = BOARD_KS1_07V_RESUME_USEC; + } + else + { + rtn = BOARD_KS1_RESUME_USEC; + } + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (rsrc) + { + case SC_R_GPT_9 : + case SC_R_GPT_10 : + case SC_R_DSP_RAM : + case SC_R_IRQSTR_DSP : + case SC_R_PMIC_1 : + case SC_R_PMIC_2 : + rtn = SC_FALSE; + break; + default : + rtn = SC_TRUE; + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + /* Init the analog repeater from ROM stage, mandatory! */ + if (action == BOARD_DDR_COLD_INIT) + { + ANA_WRITE(0x01U, 12U, 0U, 0xef17U); //SC + ANA_WRITE(0x28U, 12U, 0U, 0xef17U); //VPU + ANA_WRITE(0x24U, 12U, 0U, 0xef13U); //DRC + } + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + default: + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Keep baseboard reset */ + BRD_ERR(rm_assign_pad(pt_boot, SC_PT, SC_P_SPI2_SDO)); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[9U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_8B, + SC_R_GPT_4, + RM_RANGE(SC_R_CAN_0, SC_R_CAN_2), + SC_R_FSPI_0, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[9U] = + { + RM_RANGE(SC_P_ADC_IN1, SC_P_ADC_IN2), + SC_P_ADC_IN5, + RM_RANGE(SC_P_FLEXCAN0_RX, SC_P_FLEXCAN0_TX), + SC_P_USB_SS3_TC1, + SC_P_USB_SS3_TC3, + RM_RANGE(SC_P_QSPI0A_DATA0, SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0B) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x08FFFFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[2U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + } + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + uint32_t pmic_reg = 0U; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, &pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + uint32_t pmic_reg = 0U; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, &pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, pmic_reg, + new_volt, REG_RUN_MODE)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + switch (idx) + { + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + #ifdef ALT_DEBUG_UART + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if (resource == SC_R_M4_0_PID0) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR)) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* MEK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, + PMIC_TEMP_MAX); + + /* Ignore OV/UV detection for A0/B0 & ignore current limit for A0 */ + err |= pmic_ignore_current_limit(PMIC_0_ADDR, pmic_ver); + + if(pmic_ver.si_rev == PF8100_A0_REV) + { + /* Set Regulation modes for MAIN and 1.8V rails */ + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW6, + SW_RUN_PWM | SW_STBY_PWM)); + } + + /* Adjust startup timing */ + err |= pmic_update_timing(PMIC_0_ADDR); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + uint32_t ks1_volt = 800U; + + if (OTP_KS1_07V_SUPPORT == 1U) + { + ks1_volt = 700U; + } + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, ks1_volt, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} +#ifndef EMUL +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Only bypass current limit for A0 silicon */ + if (ver.si_rev == PF8100_A0_REV) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + } + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update power timing for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_update_timing(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + + /* + * Add 60ms stable time for power down SW5/6/7/LDO2 on i.mx8QXP-MEK + * board, otherwise system may reboot fail by mmc not power off + * clean + */ + if (address == PMIC_0_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 0 */ + err |= PMIC_REGISTER_ACCESS(address, 0x6F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else + { + /* Return error */ + err = SC_ERR_PARM; + } + + return err; +} + +#endif + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A35 : + pmic_init(); + *pmic_reg = PF8100_SW3; + *num_regs = 1U; + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + *pmic_reg = PF8100_SW3; + *num_regs = 1U; + break; + default: + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qx_dxl_phantom/board.h b/platform/board/mx8qx_dxl_phantom/board.h new file mode 100755 index 0000000..b3555e9 --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/board.h @@ -0,0 +1,121 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U + +#define PMIC_TEMP_MAX 135U + +#define PF8100_REGULATORS 12U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U + +/* + * Resume from KS1 ramps VDD_MAIN 300 mV (700 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 300 mV / 7.813 mV/us = 38.4 us ==> 39 us + * + */ +#define BOARD_KS1_07V_RESUME_USEC 39U + +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qx_dxl_phantom/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qx_dxl_phantom/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..ec954a4 --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,129 @@ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + + diff --git a/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_emul.cfg b/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_emul.cfg new file mode 100755 index 0000000..b5b9d82 --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_emul.cfg @@ -0,0 +1,263 @@ +/* +** ################################################################### +** +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +/* + * Device Configuration Data (DCD) + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + + +// DSC RESET +// First reset ? ZEBU dont know if we need this first reset. 1 +//DATA 4 0x41C80208 0x1 +//DATA 4 0x41C80044 0x8 +//DATA 4 0x41C80204 0x1 + +//ddrc_lpddr4_init(inst); + + // This is for lpddr4 controller 600MHz 1.67ns and ddr 1200MHz 0.83ns +DATA 4 DDRC_MSTR_0 0x03080020 // Set LPDDR4, BL = 16 and active ranks = 2 +DATA 4 DDRC_RFSHTMG_0 0x0049006D // tREFI noroundup(3.904us/tCK)/2 36 = 24, tRFC 180ns RoundUp(tRFCmin/tCK)/2 (180/0.83)/2 134 = 86 +DATA 4 DDRC_INIT0_0 0x0002000c // post cke roundup(2us/tCK)/2 pre_cke = 2ms is too long - LPDDR4 model hacked for 20us 00-SDRAM initialization routine is run after power up . 00 and 10 the same ? +DATA 4 DDRC_INIT1_0 0x000c0000 // dram_rstn - LPDDR4 model hacked for 20us; +DATA 4 DDRC_INIT3_0 0x00440024 // MR1=0x44: nWR=24 ? BL=16; MR2=0x24: RL=24 WL=12 ? +DATA 4 DDRC_INIT4_0 0x00310000 // MR3, MR13 PDDS 110 PU-CAL VddQ/3 +DATA 4 DDRC_RANKCTL_0 0x000006cf // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1519041a // wr2pr roundup((WL 12 + BL/2 8 + nWR 18ns)/2) = 20 hex 14 , tFAW (40ns /2) 25 hex 19 , tRASmax 8.7885us 4 , tRASmin 42ns (42ns/tCK)/2 26 hex 19 +DATA 4 DDRC_DRAMTMG1_0 0x00040526 // tXP 7.5ns roundup(tXP/2) 4, rd2pre roundup((BL/2 +8ns - 8)/2) = 5 , tRC 42ns +21ns roundup(63ns/2) = 38 hex +DATA 4 DDRC_DRAMTMG2_0 0x060b0e11 // WL 12/2, RL 24/2, rd2wr roundup((RL 24 +BL/2 8 +RU tDQSCK 3.6ns/0.83ns 4.3 +WR_PREAMBLE 2tck + RD_POSTAMBLE 0.5tck -WL 12)/2) = 14, wr2rd RU(WL 12 +BL/2 8+tWTR 10ns +1)/2 17 hex +DATA 4 DDRC_DRAMTMG3_0 0x0170c000 // tmrw tMRW ? tMRWCKEL 10CK, tmrd 10tck, tmod present on DDR3/4 only +DATA 4 DDRC_DRAMTMG4_0 0x0b04070d // trcd 18ns 11, tccd 8tck, trrd 10ns 7, trp 21ns 13 +DATA 4 DDRC_DRAMTMG5_0 0x03040305 // tcksrx 3tck, tcksre 5tck, tckesr 7.5ns tSR TBD, tcke 7.5/0.83/2 +DATA 4 DDRC_DRAMTMG6_0 0x00000004 // tckdpde, tckdpdx, tckcsx 7.5ns +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde 5tck, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE 3tck, tCKEHCMD (=tXP?) ? +DATA 4 DDRC_DRAMTMG13_0 0x00100002 // tODTLoff ODT disable, tCCDMW 4*8tck 16, tPPD 4tCK +DATA 4 DDRC_DRAMTMG14_0 0x00000039 // txsr tRFCAB 180ns+ 7.5ns +DATA 4 DDRC_ZQCTL0_0 0x025b0012 // tZQCAL 1us, tZQLAT 30ns 18 +DATA 4 DDRC_ZQCTL1_0 0x03d72e68 // tZQReset 50ns f, tzq_short_interval 0.4s lpddr3 ? +DATA 4 DDRC_DFITMG0_0 0x0498820a // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001608 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x80400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x00010002 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000016 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080202 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP2_0 0x02020000 +DATA 4 DDRC_ADDRMAP3_0 0x02020202 +DATA 4 DDRC_ADDRMAP4_0 0x00001f1f // addrmap_col_b11, addrmap_col_b10 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0f070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +// These should not be here +//DATA 4 DDRC_ADDRMAP1_0 0x00171717 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +//DATA 4 DDRC_ADDRMAP5_0 0x03030303 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +//DATA 4 DDRC_ADDRMAP6_0 0x03030303 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +DATA 4 DDRC_ODTMAP_0 0x00002211 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// in ddrc_init_inst() +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +// As DRAM init sequence will be run by controller set 0x0 to skip_dram_init field +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 + + +// Do we need this as well? Didnt need to set before ZEBU 2 +DATA 4 DDRC_PWRCTL_0 0x10D + +// Toggle Reset ... ZEBU NEED THIS? 3 +//DATA 4 0x41C80208 0x1 +//DATA 4 0x41C80044 0x4 +//DATA 4 0x41C80204 0x1 + + //------------------------------------------- + // Configure registers for PHY initialization + // Timings are computed for a PHY at 600MHz (DRAM at 1200MHz) 600MHz 1.67ns ddr 1200MHz 0.83ns + //------------------------------------------- + +//ddr_phy_lpddr4_phy_init() + + // Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank + + // Set-up PHY General Configuration Register + // PGCR0,1,4,5,6,7 are untouched +DATA 4 DDR_PHY_PGCR0_0 0x87001e00 // address copy +DATA 4 DDR_PHY_PGCR2_0 0x00F0A3CC // Set tREFPRD (9*3.904us) +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity + + // Set-up PHY Timing Register + // PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST + // CAST32(DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK=25us, tPLLRST=9us +DATA 4 DDR_PHY_PTR1_0 0x0D701C20 // tPLLLOCK reduced to 4.3us, tPLLRST=9us + + // Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x00000000 // FREQSEL=0 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x08000000 + + // Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x001FEC58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) + + // Set-up Impedance Controller Program Register + // ZQnPR0, ZQnPR1 are untouched, lpddr4 PD_REFSEL should not be default value, FIXME + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x41 + + //------------------------------------------- + // Configure registers for DRAM initialization + //------------------------------------------- + //ddr 1200MHz 0.83ns + +// ddr_phy_lpddr4_dram_init() + + // Set-up Mode Register + // MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL=24/WL=12 +DATA 4 DDR_PHY_MR3_0 0x31 // Set drive strength to 40 ohms typical pull-down/pull-up + + // Set-up DRAM Timing Parameters Register + // DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0d331a05 // tRRD (10/0.83 = 13), tRAS (42ns/0.83 = 51 ), tRP (21ns/0.83 = 26 1A), tRTP (101) +DATA 4 DDR_PHY_DTPR1_0 0x28318C0a // tWLMRD, tFAW(40ns/0.83 = 49 31), tODTUP(odt is disable), tMRD(10 tck) +DATA 4 DDR_PHY_DTPR2_0 0x003a00E2 // tRTW, tRTODT, tCMDCKE, tCKE (7.5 / 0.83 = 10 a), tXS(180ns + 7.5ns / 0.83 = 226 ) +DATA 4 DDR_PHY_DTPR3_0 0x01800502 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (3.6ns / 0.83 ) (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x01C0000a // tRFC(180ns/0.83), tWLO, tXP (7.5ns / 0.83 ) +DATA 4 DDR_PHY_DTPR5_0 0x004c160d // tRC (tRAS + tRPab = (42+21)/0.83 = 76 ), tRCD (18ns / 0.83 = 22 ), tWTR (10ns / 0.83 13 d) + + // Set-up PHY Timing Register + // DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 - 2ms +DATA 4 DDR_PHY_PTR3_0 0x00005E21 // tDINIT0 - memory model hacked to 20us 25097 +DATA 4 DDR_PHY_PTR4_0 0x0000096A // tDINIT1 (2000ns) 2410 +DATA 4 DDR_PHY_PTR5_0 0x00005E21 // tDINIT2 - normally 200us but memory model hacked to 20us +DATA 4 DDR_PHY_PTR6_0 0x025004B5 // tDINIT4 (30ns) 37, tDINIT3 (1us) 1205 + + // RDIMMGCR0-2 RDIMMGCR0-4?? + + // Set-up DATX8 Common Configuration Register + // DXCCR is untouched + + // Set-up DDR System General Configuration Register + // DSGCR is untouched + + // Set-up ODT Configuration Register + // ODTCR is untouched + + // Set-up Anti-Aging Control Register + // AACR is untouched + + // Set-up Data Training Address Register + // DTAR0-3 are untouched + // !! DTAR3 is not described in spec !! + + // Set-up AC I/O Configuration Register + // ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 + + // IOVCR0-1, DXnGCR0-4??, CALBYP + + // Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032019 // CK1, CK0 +DATA 4 DDR_PHY_VTCR1_0 0x07F00173 // HVIO=1, SHREN=1, SHRNK=0 + + // Set-up DATX8 General Configuration Registers + // DXnGCR0-4 are untouched + + // Set-up DATX8 DX Control Register 2 +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x081800 // PREOEX=2tCK, POSOEX=0.5tCK + + // Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x09000000 // I/O mode = LPDDR4 + + // Set-up DATX8 DQS Control Register +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x013E4091 // DQS resistor + +//ddr_phy_wait_init_done() + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40000 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x40001 + +// ddr_phy_wait_init_done + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + + +// Toggle Reset? ZEBU dont know if correct reset inserted here. 4 +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0xF +//DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DATA 4 0x41C80204 0x1 + + +// dram_init_inst() +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 + + //Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 diff --git a/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_lpddr4_16bit_1.2GHz.cfg b/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_lpddr4_16bit_1.2GHz.cfg new file mode 100755 index 0000000..47bf40e --- /dev/null +++ b/platform/board/mx8qx_dxl_phantom/dcd/imx8dxl_dcd_lpddr4_16bit_1.2GHz.cfg @@ -0,0 +1,326 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80002020 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 11 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81081020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST = 7 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x1F000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00070707 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x06060606 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x06060606 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00002211 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR2_0 0xAAAA0000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR2_0 0xAAAA0000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAA0000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR3_0 0xFFE18587 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR3_0 0xFFE18587 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0xFFE18587 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010002 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00082013 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004567 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00081302 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004756 // DQ bit 5/6/7 and DM remapping +// DATA 4 DDR_PHY_DX2DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +// DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004000 // DQ bit 5/6/7 and DM remapping +// DATA 4 DDR_PHY_DX3DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +// DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x00249F00 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000960 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0003A980 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x027004B0 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// Launch a second time DRAM initialization due to following Synopsys PHY bug: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + + + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +DATA 4 0x41c80504 0x400 +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_mek/Makefile b/platform/board/mx8qx_mek/Makefile new file mode 100755 index 0000000..e76e411 --- /dev/null +++ b/platform/board/mx8qx_mek/Makefile @@ -0,0 +1,61 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qx_dcd_emul +else + DDR_CON ?= imx8qx_dcd_1.2GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + +ifeq ($(M),1) + OBJS += $(OUT)/board/pmic.o +endif + diff --git a/platform/board/mx8qx_mek/board.bom b/platform/board/mx8qx_mek/board.bom new file mode 100755 index 0000000..68d9ada --- /dev/null +++ b/platform/board/mx8qx_mek/board.bom @@ -0,0 +1,39 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf8100 + +ifeq ($(M),1) + DRV2 += pmic/pf100 +endif diff --git a/platform/board/mx8qx_mek/board.c b/platform/board/mx8qx_mek/board.c new file mode 100755 index 0000000..a2d2235 --- /dev/null +++ b/platform/board/mx8qx_mek/board.c @@ -0,0 +1,1672 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QX MEK board. + * + * @addtogroup MX8QX_MEK_BRD BRD: MX8QX MEK Board + * + * Module for MX8QX MEK board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00110 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/rgpio/fsl_rgpio.h" +#include "drivers/igpio/fsl_gpio.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "dcd/dcd_retention.h" +#include "drivers/systick/fsl_systick.h" + +/* Local Defines */ + +#ifndef BD_DDR_SIZE +#if defined(BD_DDR_RET_REGION1_SIZE) && (BD_DDR_RET_REGION1_SIZE <= 32) + /*! NXP QXP 16-bit LPDDR4 MEK board */ + #define BD_DDR_SIZE SC_1GB +#else + /*! Other NXP QXP MEK boards */ + #define BD_DDR_SIZE SC_3GB +#endif +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U +#define BRD_R_BOARD_R3 6U +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 3 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif +#if DEBUG_UART == 2 + /*! Use alternate debug UART */ + #define ALT_DEBUG_SCU_UART +#endif +#if (defined(MONITOR) || defined(EXPORT_MONITOR) || defined(HAS_TEST) \ + || (DEBUG_UART == 1)) && !defined(DEBUG_TERM_EMUL) \ + && !defined(ALT_DEBUG_SCU_UART) + #define ALT_DEBUG_UART +#endif + +/*! Configure debug UART */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG LPUART_SC +#else + #define LPUART_DEBUG LPUART_MCU_0 +#endif + +/*! Configure debug UART instance */ +#ifdef ALT_DEBUG_SCU_UART + #define LPUART_DEBUG_INST 0U +#else + #define LPUART_DEBUG_INST 1U +#endif + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +#ifndef EMUL +static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver); +static sc_err_t pmic_update_timing(uint8_t address); +#endif +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t temp_alarm; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + ss_print(3, "board_init(%d)\n", phase); + + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_EARLY_INIT) + { + gpio_pin_config_t config; + config.direction = kGPIO_DigitalOutput; + + /* Power on GPIO */ + pm_force_resource_power_mode_v(SC_R_GPIO_1, SC_PM_PW_MODE_ON); + + /* Mux SPI2_SDO to GPIO */ + pad_force_mux(SC_P_SPI2_SDO, 4, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + + /* Toggle base board reset, >= 30nS */ + config.outputLogic = 0U; + GPIO_PinInit(GPIO1, 1U, &config); + SYSTICK_CycleDelay(SC_SYSTICK_NSEC_TO_TICKS(30U) + 1U); + GPIO_WritePinOutput(GPIO1, 1U, 1U); + + /* Latch output */ + pad_force_mux(SC_P_SPI2_SDO, 4, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_ON); + + /* Power off GPIO */ + pm_force_resource_power_mode_v(SC_R_GPIO_1, SC_PM_PW_MODE_OFF); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #if (defined(ALT_DEBUG_UART) || defined(ALT_DEBUG_SCU_UART)) \ + && !defined(DEBUG_TERM_EMUL) + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(ALT_DEBUG_SCU_UART) && !defined(DEBUG_TERM_EMUL) \ + && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Check if debug disabled */ + if (SCFW_DBG_READY == 0U) + { + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + } + #elif defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Use M4 UART if ALT_DEBUG_UART defined */ + /* Return if debug already enabled */ + if ((SCFW_DBG_READY == 0U) && (early_phase == SC_FALSE)) + { + sc_pm_clock_rate_t rate = SC_24MHZ; + static sc_bool_t banner = SC_FALSE; + + /* Configure pads */ + pad_force_mux(SC_P_ADC_IN2, 1, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + pad_force_mux(SC_P_ADC_IN3, 1, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + + /* Power and enable clock */ + pm_force_resource_power_mode_v(SC_R_SC_PID0, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DBLOGIC, + SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_DB, SC_PM_PW_MODE_ON); + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + &rate); + (void) pm_clock_enable(SC_PT, SC_R_M4_0_UART, SC_PM_CLK_PER, + SC_TRUE, SC_FALSE); + + /* Configure UART */ + main_config_debug_uart(LPUART_DEBUG, rate); + + if (banner == SC_FALSE) + { + debug_print(1, + "\nHello from SCU (Build %u, Commit %08x, %s %s)\n\n", + SCFW_BUILD, SCFW_COMMIT, SCFW_DATE, SCFW_TIME); + banner = SC_TRUE; + } + } + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ + /* Use M4 UART if ALT_DEBUG_UART defined */ + #if defined(ALT_DEBUG_UART) && defined(DEBUG) && !defined(SIMU) + /* Return if debug already disabled */ + if (SCFW_DBG_READY != 0U) + { + /* Disable use of UART */ + SCFW_DBG_READY = 0U; + + // UART deinit to flush TX buffers + LPUART_Deinit(LPUART_DEBUG); + + /* Turn off UART */ + pm_force_resource_power_mode_v(SC_R_M4_0_UART, + SC_PM_PW_MODE_OFF); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + #ifdef ALT_DEBUG_UART + (void) rm_set_resource_movable(SC_PT, SC_R_M4_0_UART, SC_R_M4_0_UART, + SC_FALSE); + (void) rm_set_pad_movable(SC_PT, SC_P_ADC_IN3, SC_P_ADC_IN2, + SC_FALSE); + #endif + + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SCL, SC_P_PMIC_I2C_SDA, + SC_FALSE); + #ifdef ALT_DEBUG_SCU_UART + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + /* Supply ramp delay in usec for KS1 exit */ + case BOARD_PARM_KS1_RESUME_USEC: + if (OTP_KS1_07V_SUPPORT == 1U) /* KS1 0.7V support */ + { + rtn = BOARD_KS1_07V_RESUME_USEC; + } + else + { + rtn = BOARD_KS1_RESUME_USEC; + } + break; + /* Control if retention is applied during KS1 */ + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + /* Control if ONOFF button can wake from KS1 */ + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + /* DC0 PLL0 spread spectrum config */ + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* DC0 PLL1 spread spectrum config */ + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + /* Control if SC WDOG configuration during KS1 */ + case BOARD_PARM_KS1_WDOG_WAKE: + rtn = BOARD_PARM_KS1_WDOG_WAKE_ENABLE; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + if(rsrc == SC_R_PMIC_1) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + /* Init the analog repeater from ROM stage, mandatory! */ + if (action == BOARD_DDR_COLD_INIT) + { + ANA_WRITE(0x01U, 12U, 0U, 0xef17U); //SC + ANA_WRITE(0x28U, 12U, 0U, 0xef17U); //VPU + ANA_WRITE(0x24U, 12U, 0U, 0xef13U); //DRC + } + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + default: + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Keep baseboard reset */ + BRD_ERR(rm_assign_pad(pt_boot, SC_PT, SC_P_SPI2_SDO)); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[10U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_8B, + SC_R_GPT_4, + RM_RANGE(SC_R_CAN_0, SC_R_CAN_2), + SC_R_I2C_1, + SC_R_FSPI_0, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[8U] = + { + RM_RANGE(SC_P_ADC_IN1, SC_P_ADC_IN2), + RM_RANGE(SC_P_FLEXCAN0_RX, SC_P_FLEXCAN2_TX), + SC_P_USB_SS3_TC1, + SC_P_USB_SS3_TC3, + RM_RANGE(SC_P_QSPI0A_DATA0, SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0B) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x08FFFFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[2U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + } + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + uint32_t pmic_reg = 0U; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, &pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_PWM | SW_STBY_PWM)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, pmic_reg, + SW_RUN_OFF)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + uint32_t pmic_reg = 0U; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, &pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, pmic_reg, + new_volt, REG_RUN_MODE)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + switch (idx) + { + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + ; /* Intentional empty default */ + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + #endif + #ifdef ALT_DEBUG_UART + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if (resource == SC_R_M4_0_PID0) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Temp alarm */ + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR)) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, SC_IRQ_TEMP_PMIC0_HIGH, + SC_PT_ALL); + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + + /* MEK board spec is for 1M baud for PMIC I2C bus */ + lpi2c_masterConfig.baudRate_Hz = 1000000U; + lpi2c_masterConfig.sdaGlitchFilterWidth_ns = 100U; + lpi2c_masterConfig.sclGlitchFilterWidth_ns = 100U; + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + temp_alarm = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, + PMIC_TEMP_MAX); + + /* Ignore OV/UV detection for A0/B0 & ignore current limit for A0 */ + err |= pmic_ignore_current_limit(PMIC_0_ADDR, pmic_ver); + + if(pmic_ver.si_rev == PF8100_A0_REV) + { + /* Set Regulation modes for MAIN and 1.8V rails */ + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW6, + SW_RUN_PWM | SW_STBY_PWM)); + } + + /* Adjust startup timing */ + err |= pmic_update_timing(PMIC_0_ADDR); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + + if (err != SC_ERR_NONE) + { + /* Loop so WDOG will expire */ + HALT; + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + uint32_t ks1_volt = 800U; + + if (OTP_KS1_07V_SUPPORT == 1U) + { + ks1_volt = 700U; + } + + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, ks1_volt, + REG_STBY_MODE)); + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +#ifndef EMUL +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + if (ver.si_rev == PF8100_A0_REV) + { /* only bypass current limit for A0 silicon */ + val |= 0x20U; /* set xx_ILIM_BYPASS */ + } + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update power timing for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_update_timing(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + + /* + * Add 60ms stable time for power down SW5/6/7/LDO2 on i.mx8QXP-MEK + * board, otherwise system may reboot fail by mmc not power off + * clean + */ + if (address == PMIC_0_ADDR) + { + uint8_t val = 0xED; + + /* Update for PMIC 0 */ + err |= PMIC_REGISTER_ACCESS(address, 0x6F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x77, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x7F, SC_TRUE, &val); + err |= PMIC_REGISTER_ACCESS(address, 0x8D, SC_TRUE, &val); + val = 0x29; + err |= PMIC_REGISTER_ACCESS(address, 0x3C, SC_TRUE, &val); + } + else + { + /* Return error */ + err = SC_ERR_PARM; + } + + return err; +} + +#endif + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss, uint32_t *pmic_reg, + uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A35 : + pmic_init(); + *pmic_reg = PF8100_SW4; + *num_regs = 1U; + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + *pmic_reg = PF8100_SW3; + *num_regs = 1U; + break; + default: + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qx_mek/board.h b/platform/board/mx8qx_mek/board.h new file mode 100755 index 0000000..b3555e9 --- /dev/null +++ b/platform/board/mx8qx_mek/board.h @@ -0,0 +1,121 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC pf8100 +#define PMIC_0_ADDR 0x8U + +#define PMIC_TEMP_MAX 135U + +#define PF8100_REGULATORS 12U + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U + +/* + * Resume from KS1 ramps VDD_MAIN 300 mV (700 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 300 mV / 7.813 mV/us = 38.4 us ==> 39 us + * + */ +#define BOARD_KS1_07V_RESUME_USEC 39U + +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qx_mek/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qx_mek/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..85a23c7 --- /dev/null +++ b/platform/board/mx8qx_mek/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + + diff --git a/platform/board/mx8qx_mek/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg b/platform/board/mx8qx_mek/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg new file mode 100755 index 0000000..79f363e --- /dev/null +++ b/platform/board/mx8qx_mek/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg @@ -0,0 +1,373 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80002020 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81081020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x1F000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00070707 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x06060606 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x06060606 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010002 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x026012C1 +DATA 4 DDR_PHY_PTR1_0 0x01D500A9 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000124F8 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000004B // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001D4C // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00026 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x0000004B +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz.cfg b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz.cfg new file mode 100755 index 0000000..d692183 --- /dev/null +++ b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz.cfg @@ -0,0 +1,372 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x0C0000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 3 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80004040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80008000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x0003000A +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00016578 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004203 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00015867 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004320 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x026012C1 +DATA 4 DDR_PHY_PTR1_0 0x01D500A9 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000124F8 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000004B // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001D4C // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00026 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x0000004B +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg new file mode 100755 index 0000000..613d51b --- /dev/null +++ b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg @@ -0,0 +1,330 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x0C0000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 3 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80004040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80008000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST = 7 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x0003000A +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00016578 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004203 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00015867 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004320 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x00249F00 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000960 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0003A980 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x027004B0 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +DATA 4 0x41c80504 0x400 +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_mek/dcd/imx8qx_dcd_emul.cfg b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_emul.cfg new file mode 100755 index 0000000..389d8bb --- /dev/null +++ b/platform/board/mx8qx_mek/dcd/imx8qx_dcd_emul.cfg @@ -0,0 +1,263 @@ +/* +** ################################################################### +** +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +/* + * Device Configuration Data (DCD) + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + + +// DSC RESET +// First reset ? ZEBU dont know if we need this first reset. 1 +//DATA 4 0x41C80208 0x1 +//DATA 4 0x41C80044 0x8 +//DATA 4 0x41C80204 0x1 + +//ddrc_lpddr4_init(inst); + + // This is for lpddr4 controller 600MHz 1.67ns and ddr 1200MHz 0.83ns +DATA 4 DDRC_MSTR_0 0x03080020 // Set LPDDR4, BL = 16 and active ranks = 2 +DATA 4 DDRC_RFSHTMG_0 0x0049006D // tREFI noroundup(3.904us/tCK)/2 36 = 24, tRFC 180ns RoundUp(tRFCmin/tCK)/2 (180/0.83)/2 134 = 86 +DATA 4 DDRC_INIT0_0 0x0002000c // post cke roundup(2us/tCK)/2 pre_cke = 2ms is too long - LPDDR4 model hacked for 20us 00-SDRAM initialization routine is run after power up . 00 and 10 the same ? +DATA 4 DDRC_INIT1_0 0x000c0000 // dram_rstn - LPDDR4 model hacked for 20us; +DATA 4 DDRC_INIT3_0 0x00440024 // MR1=0x44: nWR=24 ? BL=16; MR2=0x24: RL=24 WL=12 ? +DATA 4 DDRC_INIT4_0 0x00310000 // MR3, MR13 PDDS 110 PU-CAL VddQ/3 +DATA 4 DDRC_RANKCTL_0 0x000006cf // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1519041a // wr2pr roundup((WL 12 + BL/2 8 + nWR 18ns)/2) = 20 hex 14 , tFAW (40ns /2) 25 hex 19 , tRASmax 8.7885us 4 , tRASmin 42ns (42ns/tCK)/2 26 hex 19 +DATA 4 DDRC_DRAMTMG1_0 0x00040526 // tXP 7.5ns roundup(tXP/2) 4, rd2pre roundup((BL/2 +8ns - 8)/2) = 5 , tRC 42ns +21ns roundup(63ns/2) = 38 hex +DATA 4 DDRC_DRAMTMG2_0 0x060b0e11 // WL 12/2, RL 24/2, rd2wr roundup((RL 24 +BL/2 8 +RU tDQSCK 3.6ns/0.83ns 4.3 +WR_PREAMBLE 2tck + RD_POSTAMBLE 0.5tck -WL 12)/2) = 14, wr2rd RU(WL 12 +BL/2 8+tWTR 10ns +1)/2 17 hex +DATA 4 DDRC_DRAMTMG3_0 0x0170c000 // tmrw tMRW ? tMRWCKEL 10CK, tmrd 10tck, tmod present on DDR3/4 only +DATA 4 DDRC_DRAMTMG4_0 0x0b04070d // trcd 18ns 11, tccd 8tck, trrd 10ns 7, trp 21ns 13 +DATA 4 DDRC_DRAMTMG5_0 0x03040305 // tcksrx 3tck, tcksre 5tck, tckesr 7.5ns tSR TBD, tcke 7.5/0.83/2 +DATA 4 DDRC_DRAMTMG6_0 0x00000004 // tckdpde, tckdpdx, tckcsx 7.5ns +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde 5tck, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE 3tck, tCKEHCMD (=tXP?) ? +DATA 4 DDRC_DRAMTMG13_0 0x00100002 // tODTLoff ODT disable, tCCDMW 4*8tck 16, tPPD 4tCK +DATA 4 DDRC_DRAMTMG14_0 0x00000039 // txsr tRFCAB 180ns+ 7.5ns +DATA 4 DDRC_ZQCTL0_0 0x025b0012 // tZQCAL 1us, tZQLAT 30ns 18 +DATA 4 DDRC_ZQCTL1_0 0x03d72e68 // tZQReset 50ns f, tzq_short_interval 0.4s lpddr3 ? +DATA 4 DDRC_DFITMG0_0 0x0498820a // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001608 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x80400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x00010002 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000016 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080202 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP2_0 0x02020000 +DATA 4 DDRC_ADDRMAP3_0 0x02020202 +DATA 4 DDRC_ADDRMAP4_0 0x00001f1f // addrmap_col_b11, addrmap_col_b10 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0f070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +// These should not be here +//DATA 4 DDRC_ADDRMAP1_0 0x00171717 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +//DATA 4 DDRC_ADDRMAP5_0 0x03030303 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +//DATA 4 DDRC_ADDRMAP6_0 0x03030303 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +DATA 4 DDRC_ODTMAP_0 0x00002211 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// in ddrc_init_inst() +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +// As DRAM init sequence will be run by controller set 0x0 to skip_dram_init field +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 + + +// Do we need this as well? Didnt need to set before ZEBU 2 +DATA 4 DDRC_PWRCTL_0 0x10D + +// Toggle Reset ... ZEBU NEED THIS? 3 +//DATA 4 0x41C80208 0x1 +//DATA 4 0x41C80044 0x4 +//DATA 4 0x41C80204 0x1 + + //------------------------------------------- + // Configure registers for PHY initialization + // Timings are computed for a PHY at 600MHz (DRAM at 1200MHz) 600MHz 1.67ns ddr 1200MHz 0.83ns + //------------------------------------------- + +//ddr_phy_lpddr4_phy_init() + + // Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank + + // Set-up PHY General Configuration Register + // PGCR0,1,4,5,6,7 are untouched +DATA 4 DDR_PHY_PGCR0_0 0x87001e00 // address copy +DATA 4 DDR_PHY_PGCR2_0 0x00F0A3CC // Set tREFPRD (9*3.904us) +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity + + // Set-up PHY Timing Register + // PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST + // CAST32(DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK=25us, tPLLRST=9us +DATA 4 DDR_PHY_PTR1_0 0x0D701C20 // tPLLLOCK reduced to 4.3us, tPLLRST=9us + + // Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x00000000 // FREQSEL=0 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x08000000 + + // Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x001FEC58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) + + // Set-up Impedance Controller Program Register + // ZQnPR0, ZQnPR1 are untouched, lpddr4 PD_REFSEL should not be default value, FIXME + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x41 + + //------------------------------------------- + // Configure registers for DRAM initialization + //------------------------------------------- + //ddr 1200MHz 0.83ns + +// ddr_phy_lpddr4_dram_init() + + // Set-up Mode Register + // MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL=24/WL=12 +DATA 4 DDR_PHY_MR3_0 0x31 // Set drive strength to 40 ohms typical pull-down/pull-up + + // Set-up DRAM Timing Parameters Register + // DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0d331a05 // tRRD (10/0.83 = 13), tRAS (42ns/0.83 = 51 ), tRP (21ns/0.83 = 26 1A), tRTP (101) +DATA 4 DDR_PHY_DTPR1_0 0x28318C0a // tWLMRD, tFAW(40ns/0.83 = 49 31), tODTUP(odt is disable), tMRD(10 tck) +DATA 4 DDR_PHY_DTPR2_0 0x003a00E2 // tRTW, tRTODT, tCMDCKE, tCKE (7.5 / 0.83 = 10 a), tXS(180ns + 7.5ns / 0.83 = 226 ) +DATA 4 DDR_PHY_DTPR3_0 0x01800502 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (3.6ns / 0.83 ) (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x01C0000a // tRFC(180ns/0.83), tWLO, tXP (7.5ns / 0.83 ) +DATA 4 DDR_PHY_DTPR5_0 0x004c160d // tRC (tRAS + tRPab = (42+21)/0.83 = 76 ), tRCD (18ns / 0.83 = 22 ), tWTR (10ns / 0.83 13 d) + + // Set-up PHY Timing Register + // DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 - 2ms +DATA 4 DDR_PHY_PTR3_0 0x00005E21 // tDINIT0 - memory model hacked to 20us 25097 +DATA 4 DDR_PHY_PTR4_0 0x0000096A // tDINIT1 (2000ns) 2410 +DATA 4 DDR_PHY_PTR5_0 0x00005E21 // tDINIT2 - normally 200us but memory model hacked to 20us +DATA 4 DDR_PHY_PTR6_0 0x025004B5 // tDINIT4 (30ns) 37, tDINIT3 (1us) 1205 + + // RDIMMGCR0-2 RDIMMGCR0-4?? + + // Set-up DATX8 Common Configuration Register + // DXCCR is untouched + + // Set-up DDR System General Configuration Register + // DSGCR is untouched + + // Set-up ODT Configuration Register + // ODTCR is untouched + + // Set-up Anti-Aging Control Register + // AACR is untouched + + // Set-up Data Training Address Register + // DTAR0-3 are untouched + // !! DTAR3 is not described in spec !! + + // Set-up AC I/O Configuration Register + // ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 + + // IOVCR0-1, DXnGCR0-4??, CALBYP + + // Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032019 // CK1, CK0 +DATA 4 DDR_PHY_VTCR1_0 0x07F00173 // HVIO=1, SHREN=1, SHRNK=0 + + // Set-up DATX8 General Configuration Registers + // DXnGCR0-4 are untouched + + // Set-up DATX8 DX Control Register 2 +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x081800 // PREOEX=2tCK, POSOEX=0.5tCK + + // Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x09000000 // I/O mode = LPDDR4 + + // Set-up DATX8 DQS Control Register +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x013E4091 // DQS resistor + +//ddr_phy_wait_init_done() + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40000 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x40001 + +// ddr_phy_wait_init_done + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + + +// Toggle Reset? ZEBU dont know if correct reset inserted here. 4 +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0xF +//DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DATA 4 0x41C80204 0x1 + + +// dram_init_inst() +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 + + //Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 diff --git a/platform/board/mx8qx_val/Makefile b/platform/board/mx8qx_val/Makefile new file mode 100755 index 0000000..5c44ce5 --- /dev/null +++ b/platform/board/mx8qx_val/Makefile @@ -0,0 +1,58 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +#Set Default DDR config file +ifeq ($(Z),1) + DDR_CON ?= imx8qx_dcd_emul +else + DDR_CON ?= imx8qx_dcd_1.2GHz +endif + +OBJS += $(OUT)/board/$(CONFIG)_$(B)/board.o \ + $(OUT)/board/board_common.o \ + $(OUT)/board/pmic.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DCDH += $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON).h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/$(DDR_CON)_retention.h \ + $(SRC)/board/$(CONFIG)_$(B)/dcd/dcd_retention.h + +RSRC_MD += $(SRC)/board/$(CONFIG)_$(B)/resource.txt + +CTRL_MD += $(SRC)/board/$(CONFIG)_$(B)/control.txt + +DIRS += $(OUT)/board/$(CONFIG)_$(B) + diff --git a/platform/board/mx8qx_val/board.bom b/platform/board/mx8qx_val/board.bom new file mode 100755 index 0000000..fbff4e9 --- /dev/null +++ b/platform/board/mx8qx_val/board.bom @@ -0,0 +1,37 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +DRV2 += \ + pmic \ + pmic/pf100 \ + pmic/pf8100 + diff --git a/platform/board/mx8qx_val/board.c b/platform/board/mx8qx_val/board.c new file mode 100755 index 0000000..aa80e23 --- /dev/null +++ b/platform/board/mx8qx_val/board.c @@ -0,0 +1,1871 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the implementation of the MX8QX validation board. + * + * @addtogroup MX8QX_VAL_BRD BRD: MX8QX Validation Board + * + * Module for MX8QX validation board access. + * + * @{ + */ +/*==========================================================================*/ + +/* This port meets SRS requirement PRD_00100 */ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "board/pmic.h" +#include "all_svc.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf100/fsl_pf100.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "drivers/snvs/fsl_snvs.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "drivers/sysctr/fsl_sysctr.h" +#include "drivers/drc/fsl_drc_cbt.h" +#include "drivers/drc/fsl_drc_derate.h" +#include "drivers/drc/fsl_drc_rdbi_deskew.h" +#include "drivers/drc/fsl_drc_dram_vref.h" +#include "pads.h" +#include "drivers/pad/fsl_pad.h" +#include "ss/drc/v2/dsc.h" +#include "dcd/dcd_retention.h" + +/* Local Defines */ + +#ifndef BD_DDR_SIZE +#if defined(BD_DDR_RET_REGION1_SIZE) && (BD_DDR_RET_REGION1_SIZE == 64) + /*! NXP QXP LPDDR4 VAL board */ + #define BD_DDR_SIZE SC_3GB +#elif defined(BD_DDR_RET_REGION1_SIZE) && (BD_DDR_RET_REGION1_SIZE == 16) + /*! NXP QXP 16-bit DDR3L VAL board */ + #define BD_DDR_SIZE SC_2GB +#elif defined(BD_DDR_RET_REGION3_SIZE) && (BD_DDR_RET_REGION3_SIZE == 24) + /*! NXP QXP 16-bit LPDDR4 VAL board */ + #define BD_DDR_SIZE SC_1P5GB +#else + /*! NXP QXP DDR3L VAL boards */ + #define BD_DDR_SIZE SC_1GB +#endif +#endif + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U +#define BRD_R_BOARD_R3 6U +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U /*!< Test */ +/** @} */ + +#if DEBUG_UART == 1 + /*! Use debugger terminal emulation */ + #define DEBUG_TERM_EMUL +#endif + +/*! Configure debug UART */ +#define LPUART_DEBUG LPUART_SC + +/*! Configure debug UART instance */ +#define LPUART_DEBUG_INST 0U + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +static void pmic_init(void); +#ifndef EMUL + static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver); + static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver); +#endif +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs); + +/* Local Variables */ + +static pmic_version_t pmic_ver; +static uint32_t pmic_card; +static uint32_t temp_alarm0; +static uint32_t temp_alarm1; +static uint32_t temp_alarm2; + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +#ifdef BD_LPDDR4_INC_DQS2DQ +const uint32_t board_ddr_period_ms = 3000U; +#else +const uint32_t board_ddr_period_ms = 0U; +#endif + +const uint32_t board_ddr_derate_period_ms = 1000U; + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + ss_print(3, "board_init(%d)\n", phase); + + if (phase == BOOT_PHASE_FINAL_INIT) + { + /* Configure SNVS button for rising edge */ + SNVS_ConfigButton(SNVS_DRV_BTN_CONFIG_RISINGEDGE, SC_TRUE); + + /* Init PMIC if not already done */ + pmic_init(); + } + else if (phase == BOOT_PHASE_TEST_INIT) + { + /* Configure board for SCFW tests - only called in a unit test + * image. Called just before SC tests are run. + */ + + /* Configure ADMA UART pads. Needed for test_dma. + * NOTE: Even though UART is ALT0, the TX output will not work + * until the pad mux is configured. + */ + PAD_SetMux(IOMUXD__UART0_TX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + PAD_SetMux(IOMUXD__UART0_RX, 0U, SC_PAD_CONFIG_NORMAL, + SC_PAD_ISO_OFF); + } + else + { + ; /* Intentional empty else */ + } +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + #ifndef DEBUG_TERM_EMUL + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; + #else + return NULL; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if !defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Return if debug enabled */ + ASRT(SCFW_DBG_READY == 0U); + + /* Configure SCU UART */ + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + #elif defined(DEBUG_TERM_EMUL) && defined(DEBUG) && !defined(SIMU) + *SCFW_DBG_TX_PTR = 0U; + *SCFW_DBG_RX_PTR = 0U; + /* Set to 2 for JTAG emulation */ + SCFW_DBG_READY = 2U; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ + /* By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ + (void) rm_set_resource_movable(pt_sc, SC_R_SC_I2C, SC_R_SC_I2C, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_PMIC_I2C_SCL, SC_P_PMIC_I2C_SDA, + SC_FALSE); + (void) rm_set_pad_movable(pt_sc, SC_P_SCU_GPIO0_00, + SC_P_SCU_GPIO0_01, SC_FALSE); +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + board_parm_rtn_t rtn = BOARD_PARM_RTN_NOT_USED; + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + switch (parm) + { + /* Used whenever HSIO SS powered up. Valid return values are + BOARD_PARM_RTN_EXTERNAL or BOARD_PARM_RTN_INTERNAL */ + case BOARD_PARM_PCIE_PLL : + rtn = BOARD_PARM_RTN_EXTERNAL; + break; + case BOARD_PARM_KS1_RESUME_USEC: + if (OTP_KS1_07V_SUPPORT == 1U) /* KS1 0.7V support */ + { + rtn = BOARD_KS1_07V_RESUME_USEC; + } + else + { + rtn = BOARD_KS1_RESUME_USEC; + } + break; + case BOARD_PARM_KS1_RETENTION: + rtn = BOARD_KS1_RETENTION; + break; + case BOARD_PARM_KS1_ONOFF_WAKE: + rtn = BOARD_KS1_ONOFF_WAKE; + break; + case BOARD_PARM_DC0_PLL0_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + case BOARD_PARM_DC0_PLL1_SSC: + rtn = BOARD_PARM_RTN_NOT_USED; + break; + default : + ; /* Intentional empty default */ + break; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + sc_bool_t rtn = SC_TRUE; + + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + +#ifdef EMUL + if(rsrc == SC_R_PMIC_0) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_1) + { + rtn = SC_FALSE; + } + if(rsrc == SC_R_PMIC_2) + { + rtn = SC_FALSE; + } +#endif + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized) +{ + /* + * Variables for DDR retention + */ + #if defined(BD_DDR_RET) & !defined(SKIP_DDR) + /* Storage for DRC registers */ + static ddrc board_ddr_ret_drc_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DRC PHY registers */ + static ddr_phy board_ddr_ret_drc_phy_inst[BD_DDR_RET_NUM_DRC]; + + /* Storage for DDR regions */ + static uint32_t board_ddr_ret_buf1[BD_DDR_RET_REGION1_SIZE]; + #ifdef BD_DDR_RET_REGION2_SIZE + static uint32_t board_ddr_ret_buf2[BD_DDR_RET_REGION2_SIZE]; + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + static uint32_t board_ddr_ret_buf3[BD_DDR_RET_REGION3_SIZE]; + #endif + + /* DDR region descriptors */ + static const soc_ddr_ret_region_t board_ddr_ret_region[BD_DDR_RET_NUM_REGION] = + { + { BD_DDR_RET_REGION1_ADDR, BD_DDR_RET_REGION1_SIZE, board_ddr_ret_buf1 }, + #ifdef BD_DDR_RET_REGION2_SIZE + { BD_DDR_RET_REGION2_ADDR, BD_DDR_RET_REGION2_SIZE, board_ddr_ret_buf2 }, + #endif + #ifdef BD_DDR_RET_REGION3_SIZE + { BD_DDR_RET_REGION3_ADDR, BD_DDR_RET_REGION3_SIZE, board_ddr_ret_buf3 } + #endif + }; + + /* DDR retention descriptor passed to SCFW */ + static soc_ddr_ret_info_t board_ddr_ret_info = + { + BD_DDR_RET_NUM_DRC, board_ddr_ret_drc_inst, board_ddr_ret_drc_phy_inst, + BD_DDR_RET_NUM_REGION, board_ddr_ret_region + }; + #endif + + #if defined(BD_LPDDR4_INC_DQS2DQ) && defined(BOARD_DQS2DQ_SYNC) + static soc_dqs2dq_sync_info_t board_dqs2dq_sync_info = + { + BOARD_DQS2DQ_ISI_RSRC, BOARD_DQS2DQ_ISI_REG, BOARD_DQS2DQ_SYNC_TIME + }; + #endif + + board_print(3, "board_init_ddr(%d)\n", early); + + #ifdef SKIP_DDR + return SC_ERR_UNAVAILABLE; + #else + sc_err_t err = SC_ERR_NONE; + + /* Don't power up DDR for M4s */ + ASRT_ERR(early == SC_FALSE, SC_ERR_UNAVAILABLE); + + if ((err == SC_ERR_NONE) && (ddr_initialized == SC_FALSE)) + { + board_print(1, "SCFW: "); + err = board_ddr_config(SC_FALSE, BOARD_DDR_COLD_INIT); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + #endif + } + + #ifdef DEBUG_BOARD + if (err == SC_ERR_NONE) + { + uint32_t rate = 0U; + sc_err_t rate_err = SC_ERR_FAIL; + + if (rm_is_resource_avail(SC_R_DRC_0)) + { + rate_err = pm_get_clock_rate(SC_PT, SC_R_DRC_0, + SC_PM_CLK_SLV_BUS, &rate); + } + if (rate_err == SC_ERR_NONE) + { + board_print(1, "DDR frequency = %u\n", rate * 2U); + } + } + #endif + + if (err == SC_ERR_NONE) + { + #ifdef BD_DDR_RET + soc_ddr_config_retention(&board_ddr_ret_info); + #endif + + #ifdef BD_LPDDR4_INC_DQS2DQ + #ifdef BOARD_DQS2DQ_SYNC + soc_ddr_dqs2dq_config(&board_dqs2dq_sync_info); + #endif + if (board_ddr_period_ms != 0U) + { + soc_ddr_dqs2dq_init(); + } + #endif + } + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + + return err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. + */ + + sc_err_t err = SC_ERR_NONE; +#ifdef LP4_MANUAL_DERATE_WORKAROUND + sc_bool_t polling = SC_FALSE; +#endif + + /* Init the analog repeater from ROM stage, mandatory! */ + if (action == BOARD_DDR_COLD_INIT) + { + ANA_WRITE(0x01U, 12U, 0U, 0xef17U); //SC + ANA_WRITE(0x28U, 12U, 0U, 0xef17U); //VPU + ANA_WRITE(0x24U, 12U, 0U, 0xef13U); //DRC + } + + switch(action) + { + case BOARD_DDR_PERIODIC: + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + #ifdef BD_DDR_RET + soc_ddr_enter_retention(); + #endif + break; + case BOARD_DDR_SR_DRC_OFF_EXIT: + #ifdef BD_DDR_RET + soc_ddr_exit_retention(); + #endif + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_init(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_SR_DRC_ON_ENTER: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + soc_self_refresh_power_down_clk_disable_entry(); + break; + case BOARD_DDR_SR_DRC_ON_EXIT: + soc_refresh_power_down_clk_disable_exit(); + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + case BOARD_DDR_PERIODIC_HALT: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + board_ddr_derate_periodic_enable(SC_FALSE); + #endif + board_ddr_periodic_enable(SC_FALSE); + break; + case BOARD_DDR_PERIODIC_RESTART: + #ifdef LP4_MANUAL_DERATE_WORKAROUND + ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + board_ddr_derate_periodic_enable(SC_TRUE); + #endif + #ifdef BD_LPDDR4_INC_DQS2DQ + soc_ddr_dqs2dq_periodic(); + #endif + board_ddr_periodic_enable(SC_TRUE); + break; + #ifdef LP4_MANUAL_DERATE_WORKAROUND + case BOARD_DDR_DERATE_PERIODIC: + polling = ddrc_lpddr4_derate_periodic(BD_DDR_RET_NUM_DRC); + if (polling != SC_TRUE) + { + board_ddr_derate_periodic_enable(SC_FALSE); + } + break; + #endif + case BOARD_DDR0_VREF: + #if defined(MONITOR) || defined(EXPORT_MONITOR) + // Launch VREF training + DRAM_VREF_training_hw(0); + #else + // Run vref training + DRAM_VREF_training_sw(0); + #endif + break; + default: + #include "dcd/dcd.h" + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + sc_err_t err = SC_ERR_NONE; + + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + /* Note the configuration here is for NXP test purposes */ + + sc_bool_t alt_config = SC_FALSE; + sc_bool_t no_ap = SC_FALSE; + sc_bool_t ddrtest = SC_FALSE; + + /* Get boot parameters. See the Boot Flags section for definition + of these flags.*/ + boot_get_data(NULL, NULL, NULL, NULL, NULL, NULL, &alt_config, + NULL, &ddrtest, &no_ap, NULL); + + board_print(3, "board_system_config(%d, %d)\n", early, alt_config); + + #if !defined(EMUL) + if (ddrtest == SC_FALSE) + { + sc_rm_mr_t mr_temp; + + #if BD_DDR_SIZE < SC_2GB + /* Board has less than 2GB so fragment lower region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE0 + BD_DDR_SIZE, + DDR_BASE0_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + #if BD_DDR_SIZE <= SC_2GB + /* Board has 2GB memory or less so delete upper memory region */ + BRD_ERR(rm_find_memreg(pt_boot, &mr_temp, DDR_BASE1, DDR_BASE1)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #else + /* Fragment upper region and delete */ + BRD_ERR(rm_memreg_frag(pt_boot, &mr_temp, DDR_BASE1 + BD_DDR_SIZE + - SC_2GB, DDR_BASE1_END)); + BRD_ERR(rm_memreg_free(pt_boot, mr_temp)); + #endif + } + #endif + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); + + /* Configure initial resource allocation (note additional allocation + and assignments can be made by the SCFW clients at run-time */ + if (alt_config != SC_FALSE) + { + sc_rm_pt_t pt_m4_0 = SC_RM_NUM_PARTITION; + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + + /* Name boot partition */ + PARTITION_NAME(pt_boot, "AP0"); + + /* Create M4 0 partition */ + if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) + { + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[9U] = + { + SC_R_SYSTEM, + SC_R_IRQSTR_M4_0, + SC_R_MU_5B, + SC_R_MU_8B, + SC_R_GPT_4, + RM_RANGE(SC_R_CAN_0, SC_R_CAN_2), + SC_R_FSPI_0, + SC_R_SECO_MU_4 + }; + + /* List of pads */ + static const sc_pad_t pad_list[6U] = + { + RM_RANGE(SC_P_ADC_IN3, SC_P_ADC_IN2), + RM_RANGE(SC_P_FLEXCAN0_RX, SC_P_FLEXCAN2_TX), + RM_RANGE(SC_P_QSPI0A_DATA0, SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0B) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[2U] = + { + {0x088000000ULL, 0x08FFFFFFFULL}, + {0x008081000ULL, 0x008180FFFULL} + }; + + /* Create partition */ + BRD_ERR(rm_partition_create(pt_boot, &pt_m4_0, SC_FALSE, + SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, + rsrc_list, ARRAY_SIZE(rsrc_list), + pad_list, ARRAY_SIZE(pad_list), + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt_m4_0, "MCU0"); + + /* Allow AP to use SYSTEM (not production!) */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_SYSTEM, + pt_boot, SC_RM_PERM_SEC_RW)); + + /* Move M4 0 TCM */ + BRD_ERR(rm_find_memreg(pt_boot, &mr, 0x034FE0000ULL, + 0x034FE0000ULL)); + BRD_ERR(rm_assign_memreg(pt_boot, pt_m4_0, mr)); + + /* Move partition to be owned by SC */ + BRD_ERR(rm_set_parent(pt_boot, pt_m4_0, SC_PT)); + + /* Check if booting with the no_ap flag set */ + if (no_ap != SC_FALSE) + { + /* Move boot to be owned by M4 0 for Android Automotive */ + BRD_ERR(rm_set_parent(SC_PT, pt_boot, pt_m4_0)); + } + } + + /* Allow all to access the SEMA42s */ + BRD_ERR(rm_set_peripheral_permissions(SC_PT, SC_R_M4_0_SEMA42, + SC_RM_PT_ALL, SC_RM_PERM_FULL)); + + /* Create partition for shared/hidden resources */ + { + sc_rm_pt_t pt; + sc_rm_mr_t mr; + + /* List of resources */ + static const sc_rsrc_t rsrc_list[2U] = + { + RM_RANGE(SC_R_M4_0_PID1, SC_R_M4_0_PID4) + }; + + /* List of memory regions */ + static const sc_rm_mem_list_t mem_list[1U] = + { + {0x090000000ULL, 0x091FFFFFFULL} + }; + + /* Create shared partition */ + BRD_ERR(rm_partition_create(SC_PT, &pt, SC_FALSE, SC_TRUE, + SC_FALSE, SC_FALSE, SC_FALSE, SC_NUM_RESOURCE, + rsrc_list, ARRAY_SIZE(rsrc_list), NULL, 0U, + mem_list, ARRAY_SIZE(mem_list))); + + /* Name partition for debug */ + PARTITION_NAME(pt, "Shared"); + + /* Share memory space */ + BRD_ERR(rm_find_memreg(SC_PT, &mr, + mem_list[0U].addr_start, mem_list[0U].addr_start)); + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_boot, + SC_RM_PERM_FULL)); + if (pt_m4_0 != SC_RM_NUM_PARTITION) + { + BRD_ERR(rm_set_memreg_permissions(pt, mr, pt_m4_0, + SC_RM_PERM_FULL)); + } + } + + #ifdef BOARD_RM_DUMP + rm_dump(pt_boot); + #endif + } + +#if 0 + BRD_ERR(rm_set_pad_movable(pt_boot,SC_P_ADC_IN3,SC_P_ADC_IN2, + SC_TRUE)); + + /* Move some pads not in the M4_0 subsystem */ + BRD_ERR(rm_set_pad_movable(pt_boot, SC_P_FLEXCAN0_RX, + SC_P_FLEXCAN2_TX, SC_TRUE)); + BRD_ERR(rm_set_pad_movable(pt_boot, SC_P_QSPI0A_DATA0, + SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0B, SC_TRUE)); + +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + sc_bool_t rtn = SC_FALSE; + + if ((cpu == SC_R_M4_0_PID0) || (cpu == SC_R_M4_1_PID0)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id != 0U) + { + sc_err_t err = SC_ERR_NONE; + uint8_t mode; + + if (pmic_ver.device_id == PF100_DEV_ID) + { + mode = SW_MODE_PWM_STBY_PWM; + } + else + { + mode = SW_RUN_PWM | SW_STBY_PWM; + } + + /* Flip switch */ + if (to_mode > SC_PM_PW_MODE_OFF) + { + uint8_t idx = 0U; + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + mode)); + idx++; + } + SystemTimeDelay(PMIC_MAX_RAMP); + } + else + { + uint8_t idx = 0U; + + mode = 0U; + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_MODE(pmic_id[idx], pmic_reg[idx], + mode)); + idx++; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + sc_err_t err = SC_ERR_NONE; + pmic_id_t pmic_id[2] = {0U, 0U}; + uint32_t pmic_reg[2] = {0U, 0U}; + uint8_t num_regs = 0U; + + board_print(3, "board_set_voltage(%s, %u, %u)\n", snames[ss], new_volt, + old_volt); + + board_get_pmic_info(ss, pmic_id, pmic_reg, &num_regs); + + /* Check for PMIC */ + if (pmic_ver.device_id == 0U) + { + err = SC_ERR_NOTFOUND; + } + else + { + uint8_t idx = 0U; + uint8_t mode; + + if (pmic_ver.device_id == PF100_DEV_ID) + { + mode = SW_RUN_MODE; + } + else + { + mode = REG_RUN_MODE;/* run mode programming */ + } + + while (idx < num_regs) + { + BRD_ERR(PMIC_SET_VOLTAGE(pmic_id[idx], pmic_reg[idx], + new_volt, mode)); + idx++; + } + if ((old_volt != 0U) && (new_volt > old_volt)) + { + /* PMIC_MAX_RAMP_RATE is in nano Volts. */ + uint32_t ramp_time = ((new_volt - old_volt) * 1000U) + / PMIC_MAX_RAMP_RATE; + SystemTimeDelay(ramp_time + 1U); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %u, %u)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); + + /* Init PMIC */ + pmic_init(); + + /* Process resource */ + if (pmic_ver.device_id != 0U) + { + switch (idx) + { + case BRD_R_BOARD_R7 : + /* Example for testing (use SC_R_BOARD_R7) */ + board_print(3, "SC_R_BOARD_R7 from %u to %u\n", + from_mode, to_mode); + break; + default : + break; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + if (mode == SC_PM_PW_MODE_OFF) + { + /* Request power off */ + SNVS_PowerOff(); + err = snvs_err; + + /* Loop forever */ + while(err == SC_ERR_NONE) + { + ; /* Intentional empty while */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + if (type == SC_PM_RESET_TYPE_BOARD) + { + /* Request PMIC do a board reset */ + } + else if (type == SC_PM_RESET_TYPE_COLD) + { + /* Request PMIC do a cold reset */ + } + else + { + ; /* Intentional empty else */ + } + + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for M4 reset event */ + if (resource == SC_R_M4_0_PID0) + { + always_print("CM4 reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + (void) board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + HALT; + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + (void) board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SNVS_GetButtonStatus(); +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_set_control(%s, %u, %u)\n", rnames[rsrc_idx], ctrl, val); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP_HI) + { + temp_alarm0 = + SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, val); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP_HI) + { + if (pmic_card != PF8100_SINGLE) + { + temp_alarm1 = + SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, val); + } + else + { + temp_alarm1 = val;/* Fake the set if not there */ + } + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_2 : + if (ctrl == SC_C_TEMP_HI) + { + if (pmic_card == PF100_TRIPLE) + { + temp_alarm2 = + SET_PMIC_TEMP_ALARM(PMIC_2_ADDR, val); + } + else + { + temp_alarm2 = val; /* Fake the set if not there */ + } + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage set to %u\n", + val); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + /* Init PMIC */ + pmic_init(); + + /* Check if PMIC available */ + ASRT_ERR(pmic_ver.device_id != 0U, SC_ERR_NOTFOUND); + + if (err == SC_ERR_NONE) + { + /* Process control */ + switch (resource) + { + case SC_R_PMIC_0 : + if (ctrl == SC_C_TEMP) + { + *val = GET_PMIC_TEMP(PMIC_0_ADDR); + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm0; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_0_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_1 : + if (ctrl == SC_C_TEMP) + { + if (pmic_card != PF8100_SINGLE) + { + *val = GET_PMIC_TEMP(PMIC_1_ADDR); + } + else + { + err = SC_ERR_PARM; + } + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm1; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_1_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_PMIC_2 : + if (ctrl == SC_C_TEMP) + { + if (pmic_card == PF100_TRIPLE) + { + *val = GET_PMIC_TEMP(PMIC_2_ADDR); + } + else + { + err = SC_ERR_PARM; + } + } + else if (ctrl == SC_C_TEMP_HI) + { + *val = temp_alarm2; + } + else if (ctrl == SC_C_ID) + { + pmic_version_t v = GET_PMIC_VERSION(PMIC_2_ADDR); + + *val = (U32(v.device_id) << 8U) | U32(v.si_rev); + } + else + { + err = SC_ERR_PARM; + } + break; + case SC_R_BOARD_R7 : + if (ctrl == SC_C_VOLTAGE) + { + /* Example (used for testing) */ + board_print(3, "SC_R_BOARD_R7 voltage get\n"); + } + else + { + err = SC_ERR_PARM; + } + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* PMIC Interrupt (INTB) handler */ +/*--------------------------------------------------------------------------*/ +void PMIC_IRQHandler(void) +{ + /* Handle IRQ */ + switch (pmic_card) + { + case PF100_TRIPLE : + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC0_HIGH, SC_PT_ALL); + } + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC1_HIGH, SC_PT_ALL); + } + if (PMIC_IRQ_SERVICE(PMIC_2_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC2_HIGH, SC_PT_ALL); + } + break; + case PF8100_DUAL : + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC0_HIGH, SC_PT_ALL); + } + if (PMIC_IRQ_SERVICE(PMIC_1_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC1_HIGH, SC_PT_ALL); + } + break; + case PF8100_SINGLE : + if (PMIC_IRQ_SERVICE(PMIC_0_ADDR) != SC_FALSE) + { + /* Trigger client interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_TEMP, + SC_IRQ_TEMP_PMIC0_HIGH, SC_PT_ALL); + } + break; + default : + ; /* Intentional empty default */ + break; + } + + /* Clear IRQ */ + NVIC_ClearPendingIRQ(PMIC_INT_IRQn); +} + +/*--------------------------------------------------------------------------*/ +/* Button Handler */ +/*--------------------------------------------------------------------------*/ +void SNVS_Button_IRQHandler(void) +{ + SNVS_ClearButtonIRQ(); + + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, SC_PT_ALL); +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Init the PMIC interface */ +/*--------------------------------------------------------------------------*/ +static void pmic_init(void) +{ + #ifndef EMUL + static sc_bool_t pmic_checked = SC_FALSE; + static lpi2c_master_config_t lpi2c_masterConfig; + sc_pm_clock_rate_t rate = SC_24MHZ; + + /* See if we already checked for the PMIC */ + if (pmic_checked == SC_FALSE) + { + sc_err_t err = SC_ERR_NONE; + + pmic_checked = SC_TRUE; + + /* Initialize the PMIC */ + board_print(3, "Start PMIC init\n"); + + /* Power up the I2C and configure clocks */ + pm_force_resource_power_mode_v(SC_R_SC_I2C, + SC_PM_PW_MODE_ON); + (void) pm_set_clock_rate(SC_PT, SC_R_SC_I2C, + SC_PM_CLK_PER, &rate); + pm_force_clock_enable(SC_R_SC_I2C, SC_PM_CLK_PER, + SC_TRUE); + + /* Initialize the pads used to communicate with the PMIC */ + pad_force_mux(SC_P_PMIC_I2C_SDA, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SDA, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + pad_force_mux(SC_P_PMIC_I2C_SCL, 0, + SC_PAD_CONFIG_OD_IN, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_I2C_SCL, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the PMIC interrupt pad */ + pad_force_mux(SC_P_PMIC_INT_B, 0, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + (void) pad_set_gp_28fdsoi(SC_PT, SC_P_PMIC_INT_B, + SC_PAD_28FDSOI_DSE_18V_1MA, SC_PAD_28FDSOI_PS_PU); + + /* Initialize the I2C used to communicate with the PMIC */ + LPI2C_MasterGetDefaultConfig(&lpi2c_masterConfig); + LPI2C_MasterInit(LPI2C_PMIC, &lpi2c_masterConfig, SC_24MHZ); + + /* Delay to allow I2C to settle */ + SystemTimeDelay(2U); + + /* Probe for PMIC 0 */ + if (pmic_get_device_id(PMIC_0_ADDR) == PF100_DEV_ID) + { /* probe for pmic at 0x8 */ + board_print(2, "Found Triple PF100 PMIC Card \n"); + PMIC_TYPE = PF100; + pmic_card = PF100_TRIPLE; + /* Probe for PMIC 1 */ + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + + /* Configure temp alarms */ + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + temp_alarm2 = SET_PMIC_TEMP_ALARM(PMIC_2_ADDR, PMIC_TEMP_MAX); + + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, SW1AB, SW_MODE_PWM_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, SW1C, SW_MODE_PWM_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_2_ADDR, SW3A, SW_MODE_PWM_STBY_PWM)); + } + /* Isolate Device Family to support 8100 & 8200 */ + else if (((pmic_get_device_id(PMIC_1_ADDR) & FAM_ID_MASK) == PF8X00_FAM_ID)) + { + PMIC_TYPE = PF8100; + pmic_card = PF8100_DUAL; + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + board_print(2, "Found Dual PF8100 PMIC Card Rev:0x%x\n",pmic_ver.si_rev); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + temp_alarm1 = SET_PMIC_TEMP_ALARM(PMIC_1_ADDR, PMIC_TEMP_MAX); + + /* ignore OV/UV for A0/B0 & bypass current limit for A0 */ + err |= pmic_ignore_current_limit(PMIC_0_ADDR, pmic_ver); + err |= pmic_ignore_current_limit(PMIC_1_ADDR, pmic_ver); + + /* Make sure not 1.7V OTP */ + err |= pmic_match_otp(PMIC_0_ADDR, pmic_ver); + err |= pmic_match_otp(PMIC_1_ADDR, pmic_ver); + + if (pmic_ver.si_rev == PF8100_A0_REV) + { + /* set Regulation modes for MAIN and 1.8V rails */ + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW7, + SW_RUN_PWM | SW_STBY_PWM)); + } + + if (err != SC_ERR_NONE) + { + error_print("PMIC Initialization Error!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, + 800, REG_STBY_MODE)); + } + + /* Configure GPU voltage for Dual PF8100 ( only GPU0 needed at 1.1v ) */ + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_SW1, + 1100, REG_RUN_MODE)); + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_1_ADDR, PF8100_SW2, + 1100, REG_RUN_MODE)); + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + err |= pf8100_pmic_wdog_enable(PMIC_1_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + } + /* Isolate Device Family to support 8100 & 8200 */ + else if ((pmic_get_device_id(PMIC_0_ADDR) & FAM_ID_MASK) + == PF8X00_FAM_ID) + { + pmic_card = PF8100_SINGLE; + PMIC_TYPE = PF8100;//set dynamic functions to use PF8100 + pmic_ver = GET_PMIC_VERSION(PMIC_0_ADDR); + board_print(2, "Found Single PF8100 PMIC Card Rev:0x%x\n",pmic_ver.si_rev); + temp_alarm0 = SET_PMIC_TEMP_ALARM(PMIC_0_ADDR, PMIC_TEMP_MAX); + + err = SC_ERR_NONE; + + /* ignore OV/UV for A0/B0 & ignore current limit for A0 */ + err |= pmic_ignore_current_limit(PMIC_0_ADDR, pmic_ver); + + if (pmic_ver.si_rev == PF8100_A0_REV) + { + /* set Regulation modes for MAIN and 1.8V rails */ + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW1, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW2, + SW_RUN_PWM | SW_STBY_PWM)); + BRD_ERR(PMIC_SET_MODE(PMIC_0_ADDR, PF8100_SW6, + SW_RUN_PWM | SW_STBY_PWM)); + } + + if (err != SC_ERR_NONE) + { + error_print("PMIC Initialization Error!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + + /* Configure STBY voltage for SW1 (VDD_MAIN) */ + if (board_parameter(BOARD_PARM_KS1_RETENTION) + == BOARD_PARM_KS1_RETENTION_ENABLE) + { + uint32_t ks1_volt = 800U; + + if (OTP_KS1_07V_SUPPORT == 1U) + { + ks1_volt = 700U; + } + BRD_ERR(PMIC_SET_VOLTAGE(PMIC_0_ADDR, PF8100_SW1, + ks1_volt, REG_STBY_MODE)); + } + + /* Enable WDI detection in Standby */ + err |= pf8100_pmic_wdog_enable(PMIC_0_ADDR, SC_FALSE, SC_FALSE, SC_TRUE); + } + else + { + error_print("PMIC Card not found!\n"); + + #ifndef EMUL + /* Loop so WDOG will expire */ + HALT; + #else + return; + #endif + } + + /* Enable PMIC IRQ at NVIC level */ + NVIC_EnableIRQ(PMIC_INT_IRQn); + + board_print(3, "Finished PMIC init\n\n"); + } + #endif +} + +#ifndef EMUL +/*--------------------------------------------------------------------------*/ +/* Bypass current limit for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_ignore_current_limit(uint8_t address, + pmic_version_t ver) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t idx; + uint8_t val = 0U; + static const pf8100_vregs_t switchers[11] = + { + PF8100_SW1, + PF8100_SW2, + PF8100_SW3, + PF8100_SW4, + PF8100_SW5, + PF8100_SW6, + PF8100_SW7, + PF8100_LDO1, + PF8100_LDO2, + PF8100_LDO3, + PF8100_LDO4 + }; + + /* Loop over supplies */ + for (idx = 0U; idx < 11U; idx++) + { + /* Read the config register first */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_FALSE, + &val); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Only bypass current limit for A0 silicon */ + if (ver.si_rev == PF8100_A0_REV) + { + val |= 0x20U; /* set xx_ILIM_BYPASS */ + } + + /* + * Enable the UV_BYPASS and OV_BYPASS for all LDOs. + * The SDHC LDO2 constantly switches between 3.3V and 1.8V and + * the counters are incorrectly triggered. + * Also any other LDOs (like LDO1 on the board) that is + * enabled/disabled during suspend/resume can trigger the counters. + */ + if ((switchers[idx] == PF8100_LDO1) || + (switchers[idx] == PF8100_LDO2) || + (switchers[idx] == PF8100_LDO3) || + (switchers[idx] == PF8100_LDO4)) + { + val |= 0xC0U; + } + + /* Write the config register */ + err = PMIC_REGISTER_ACCESS(address, switchers[idx], SC_TRUE, + &val); + } + + /* Stop loop if there is an error */ + if (err != SC_ERR_NONE) + { + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check correct version of OTP for PF8100 */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pmic_match_otp(uint8_t address, pmic_version_t ver) +{ + uint8_t reg_value = 0; + uint16_t match; + sc_err_t err = SC_ERR_NONE; + + if (address == PMIC_0_ADDR) + { + match = EP_PROG_ID; + } + else + { + match = EQ_PROG_ID; + } + + /* Check if C1 or later */ + if (ver.si_rev >= PF8100_C1_SI_REV) + { + uint16_t prog_id; + + /* Read Prog ID */ + err |= PMIC_REGISTER_ACCESS(address, 0x2, SC_FALSE, ®_value); + prog_id = ((reg_value << 4U) & 0x0F00U); + err |= PMIC_REGISTER_ACCESS(address, 0x3, SC_FALSE, ®_value); + prog_id |= reg_value; + + /* Test for correct OTP */ + if(prog_id == match){/* display error if 1.7v OTP */ + error_print("PMIC INVALID!\n"); + } + } + + return err; +} + +#endif + +/*--------------------------------------------------------------------------*/ +/* Get the pmic ids and switchers connected to SS. */ +/*--------------------------------------------------------------------------*/ +static void board_get_pmic_info(sc_sub_t ss,pmic_id_t *pmic_id, + uint32_t *pmic_reg, uint8_t *num_regs) +{ + /* Map SS/PD to PMIC switch */ + switch (ss) + { + case SC_SUBSYS_A35 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = SW3A; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = SW3B; + *num_regs = 2U; + } + else if (pmic_card == PF8100_DUAL) + { + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + pmic_id[1] = PMIC_0_ADDR; + pmic_reg[1] = PF8100_SW4; + *num_regs = 2U; + } + else + { + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW4; + *num_regs = 1U; + } + break; + case SC_SUBSYS_GPU_0 : + pmic_init(); + if (pmic_card == PF100_TRIPLE) + { + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = SW1AB; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = SW1C; + *num_regs = 2U; + } + else if (pmic_card == PF8100_DUAL) + { + pmic_id[0] = PMIC_1_ADDR; + pmic_reg[0] = PF8100_SW1; + pmic_id[1] = PMIC_1_ADDR; + pmic_reg[1] = PF8100_SW2; + *num_regs = 2U; + } + else + { + pmic_id[0] = PMIC_0_ADDR; + pmic_reg[0] = PF8100_SW3; + *num_regs = 1U; + } + break; + default: + ; /* Intentional empty default */ + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + +#ifdef HAS_TEST + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + /* For test_wdog */ + else if (*parm1 == 0xFFFFFFFBU) + { + HALT; + } + else + { + err = SC_ERR_PARM; + } +#endif + + return err; +} + +/** @} */ + diff --git a/platform/board/mx8qx_val/board.h b/platform/board/mx8qx_val/board.h new file mode 100755 index 0000000..1552d37 --- /dev/null +++ b/platform/board/mx8qx_val/board.h @@ -0,0 +1,140 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ + +#include "drivers/pmic/fsl_pmic.h" + +/* Defines */ + +#if 0 + #define SKIP_DDR +#endif + +/*! Configure PMIC I2C */ +#define LPI2C_PMIC LPI2C_SC + +/*! Configure PMIC I2C instance */ +#define LPI2C_PMIC_INST 0U + +/* PMIC related defines */ +#define PMIC_0_ADDR 0x8U +#define PMIC_1_ADDR 0x9U +#define PMIC_2_ADDR 0xAU + +/* + * Configure Maximum Delay based on PMIC OTP settings: + * clock freq = 20MHZ, Regulator-freq = 2.5MHz, SWxDVS Ramp = 0, + * results in a ramp rate of 7,813mV/us. + * 1100 mV / 7.813 mV/us => 140.791 us + */ +#define PMIC_MAX_RAMP 141U /* Max PMIC ramp delay in uS */ +#define PMIC_MAX_RAMP_RATE 7813U /* PMIC voltage ramp (nV) per uS */ + +/* Declare if PMIC transactions will include CRC */ +//#define PMIC_CRC +/* Declare if PMIC Secure Writes are enabled */ +//#define PMIC_SECURE_WRITE + +#define PMIC_TEMP_MAX 135U + +#define SW1ABC_STEP 25U +#define SW2_STEP 25U +#define SW3_STEP 25U +#define SW4_STEP 25U +#define VGEN12_STEP 50U +#define VGEN3456_STEP 100U + + +#define PF8100_REGULATORS 12U +#define PF100_REGULATORS 12U + +#define PF100_TRIPLE 0U +#define PF8100_DUAL 1U +#define PF8100_SINGLE 2U + +#define PF8100_C1_SI_REV 0x31U +#define EP_PROG_ID 0x0417U +#define EQ_PROG_ID 0x0418U + +/* + * Resume from KS1 ramps VDD_MAIN 200 mV (800 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 200 mV / 7.813 mV/us = 25.6 us ==> 26 us + * + */ +#define BOARD_KS1_RESUME_USEC 26U + +/* + * Resume from KS1 ramps VDD_MAIN 300 mV (700 mV to 1000 mV) + * PF8100 reg freq = 2.5 MHz, SWxDVS_RAMP = 0 => 7.813 mV/us + * 300 mV / 7.813 mV/us = 38.4 us ==> 39 us + * + */ +#define BOARD_KS1_07V_RESUME_USEC 39U + +#define BOARD_KS1_RETENTION BOARD_PARM_KS1_RETENTION_ENABLE +#define BOARD_KS1_ONOFF_WAKE BOARD_PARM_KS1_ONOFF_WAKE_ENABLE + +/* DQS2DQ can be synchronized to the ISI to avoid DDR bus contention. Define + * BOARD_DQS2DQ_SYNC to enable synchronization and configure parameters + * using the BOARD_DQS2DQ defines below. Note these defines only apply + * if BD_LPDDR4_INC_DQS2DQ is defined. BOARD_DQS2DQ_ISI_RSRC and + * BOARD_DQS2DQ_ISI_REG must be assigned to the same respective ISI + * channel. BOARD_DQS2DQ_SYNC_TIME determines the search window for ISI + * synchronization before firmware will yield to other service requests. + * Decreasing BOARD_DQS2DQ_SYNC_TIME will lower latency of other service + * requests when periodic DQS2DQ is active, but will decrease the likelihood + * of synchronizing to the ISI frame. + */ +#define BOARD_DQS2DQ_SYNC /* DQS2DQ sync enable */ +#define BOARD_DQS2DQ_ISI_RSRC SC_R_ISI_CH0 /* DQS2DQ sync ISI resource */ +#define BOARD_DQS2DQ_ISI_REG ISI0 /* DQS2DQ sync ISI registers */ +#define BOARD_DQS2DQ_SYNC_TIME 100U /* DQS2DQ sync usec timeout */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/mx8qx_val/dcd/ddr_stress_test_parser.cfg b/platform/board/mx8qx_val/dcd/ddr_stress_test_parser.cfg new file mode 100755 index 0000000..85a23c7 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/ddr_stress_test_parser.cfg @@ -0,0 +1,143 @@ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +// DDR Stress Test Parser to obtain information from the OCRAM loaded by the stress test to initialize DDR + +typedef enum { + CMD_WRITE_DATA, + CMD_SET_BIT, + CMD_CLR_BIT, + CMD_CHECK_BIT_SET, + CMD_CHECK_BIT_CLR, + CMD_COPY_BIT, + CMD_DDR_PARAM, + CMD_RUN_CBT, + CMD_RUN_RDBI_DESKEW, + CMD_RUN_VREF_TRAINING, + CMD_END=0xA5A5A5A5 +}dcd_cmd; + +typedef struct { + dcd_cmd cmd; + uint32_t addr; + uint32_t val; + uint32_t bit; +} dcd_node; + +enum{ + DRAM_TYPE, + TRAIN_INFO, + LP4X_MODE, + DATA_WIDTH, + NUM_PSTAT, + FREQUENCY0 +}; + +volatile dcd_node* dcd_ptr = (volatile dcd_node*)0x0011c000; + volatile uint32_t* dst_addr; + uint32_t regval,val,bitmask; + bool quit = false; + uint32_t ddr_pll; + board_print(1,"ddrc_init_dcd: 0x%x\r\n",(uint32_t)dcd_ptr); + + while(!quit){ + dst_addr = (volatile uint32_t*)dcd_ptr->addr; + val = dcd_ptr->val; + bitmask = dcd_ptr->bit; + + switch (dcd_ptr->cmd){ + case CMD_END: + boot_print(1,"DCD command finished\r\n"); + err = SC_ERR_NONE; + quit = true; + break; + + case CMD_WRITE_DATA: + boot_print(1,"CMD_WRITE_DATA: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + *dst_addr = val; + break; + + case CMD_SET_BIT: + boot_print(1,"CMD_SET_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval |= val; + *dst_addr = regval; + break; + + case CMD_CLR_BIT: + boot_print(1,"CMD_CLR_BIT: dst_addr=0x%x,bitmask=0x%x,val=0x%x\r\n",dst_addr,bitmask,val); + regval = *dst_addr; + regval &= ~val; + *dst_addr = regval; + break; + + case CMD_CHECK_BIT_SET: + boot_print(1,"CMD_CHECK_BIT_SET: dst_addr=0x%x,bitmask=0x%x,val=0x%x ...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval&val)==val) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_CHECK_BIT_CLR: + boot_print(1,"CMD_CHECK_BIT_CLR: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + do{ + regval = *dst_addr; + if((regval & val)==0) + break; + }while(1); + boot_print(1,"Done\r\n"); + break; + + case CMD_DDR_PARAM: + boot_print(1,"CMD_DDR_PARAM: dst_addr=0x%x,bitmask=0x%x,val=0x%x...",dst_addr,bitmask,val); + if(dcd_ptr->addr != FREQUENCY0) + { + err = SC_ERR_UNAVAILABLE; + quit = true; + boot_print(1,"Failed\r\n"); + break; + } + ddr_pll = val*1000000/2; + pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &ddr_pll); + pm_set_clock_rate(SC_PT, SC_R_DRC_1, SC_PM_CLK_MISC0, &ddr_pll); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_CBT: + boot_print(1,"CMD_RUN_CBT: param_1=0x%x,param_2=0x%x,param_3=0x%x...",dcd_ptr->addr,dcd_ptr->bit,dcd_ptr->val); + run_cbt(dcd_ptr->addr, dcd_ptr->bit, dcd_ptr->val); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_RDBI_DESKEW: + boot_print(1,"CMD_RUN_RDBI_DESKEW: param_1=0x%x...",dcd_ptr->addr); + RDBI_bit_deskew(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + case CMD_RUN_VREF_TRAINING: + boot_print(1,"CMD_RUN_VREF_TRAINING: param_1=0x%x...",dcd_ptr->addr); + DRAM_VREF_training_sw(dcd_ptr->addr); + boot_print(1,"Done\r\n"); + break; + + default: + boot_print(1,"Unknown DCD command(0x%x):dst_addr=0x%x,bit=0x%x,val=0x%x\r\n",dcd_ptr->cmd,dst_addr,bitmask,val); + err = SC_ERR_UNAVAILABLE; + quit = true; + break; + } + + dcd_ptr++; + } + + + + + diff --git a/platform/board/mx8qx_val/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg b/platform/board/mx8qx_val/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg new file mode 100755 index 0000000..574a235 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8dx_dcd_lpddr4_16bit_1.2GHz.cfg @@ -0,0 +1,373 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 2 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80002020 +DEFINE BD_DDR_RET_REGION2_SIZE 8 + + + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81081020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x1F000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00070707 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x06060606 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x06060606 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00010002 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00082013 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004567 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00081302 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004756 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x026012C1 +DATA 4 DDR_PHY_PTR1_0 0x01D500A9 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000124F8 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000004B // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001D4C // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00026 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x0000004B +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); + diff --git a/platform/board/mx8qx_val/dcd/imx8dx_ddr3_dcd_16bit_933MHz.cfg b/platform/board/mx8qx_val/dcd/imx8dx_ddr3_dcd_16bit_933MHz.cfg new file mode 100755 index 0000000..d03d31a --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8dx_ddr3_dcd_16bit_933MHz.cfg @@ -0,0 +1,302 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x080000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 16 + +/* + * Device Configuration Data (DCD) Version 20 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 933MHz. */ + uint32_t rate2 = 465000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 930MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x0000009b); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x41041001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x007200A4 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300E5 // pre_cke +DATA 4 DDRC_INIT1_0 0x005D0000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0E140006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00200000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x000B0000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0E112010 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000C0417 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x07020307 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x05050303 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030907 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40960026 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200E3F5 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04898206 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000704 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x07070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +// DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x06000610 +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when configured for 16-bit data bus + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00026051 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004837 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00063527 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004081 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0E207 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x3A61D310 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x2D98106A // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000E14 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000020 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x06200D08 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28210300 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x01470C17 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x002D0D09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00071FA6 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000147 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0002D976 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x040003A7 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support (the following lines are uncommented when ECC is enabled) +// DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1 +// DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA +// DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +// CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +// CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +// DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +// DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 +// DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 diff --git a/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz.cfg b/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz.cfg new file mode 100755 index 0000000..7e735d7 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz.cfg @@ -0,0 +1,372 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x0C0000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 3 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80004040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80008000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x0003000A +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00016578 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004203 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00015867 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004320 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus + +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x026012C1 +DATA 4 DDR_PHY_PTR1_0 0x01D500A9 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000124F8 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000004B // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001D4C // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00026 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x0000004B +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg b/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg new file mode 100755 index 0000000..20d500b --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_dcd_1.2GHz_nocbt.cfg @@ -0,0 +1,330 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x0C0000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 3 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 64 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80004040 +DEFINE BD_DDR_RET_REGION2_SIZE 16 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80008000 +DEFINE BD_DDR_RET_REGION3_SIZE 48 + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0xC3080020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 // REFRESH_BURST = 7 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10000 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000007 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x08080808 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x48080808 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 // Enable Hardware idle period + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 // dfi_lp_en_sr, dfi_lp_wakeup_sr config + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 1200MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x0003000A +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00016578 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004203 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00015867 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004320 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141032 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0000 // DISDIC=1 (no uMCTL2 commands can go to memory) and WDQSEXT=1 +DATA 4 DDR_PHY_PGCR0_0 0x87001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x001C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x001C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x32 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x33 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x00249F00 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x00000960 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0003A980 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x027004B0 // tDINIT4, tDINIT3 +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// Launch a second time DRAM initialization due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +// Wait (second time) DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +DATA 4 0x41c80504 0x400 +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_val/dcd/imx8qx_dcd_16bit_1.2GHz.cfg b/platform/board/mx8qx_val/dcd/imx8qx_dcd_16bit_1.2GHz.cfg new file mode 100755 index 0000000..f419ff5 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_dcd_16bit_1.2GHz.cfg @@ -0,0 +1,371 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Enable LPDDR4 derate workaround */ +DEFINE LP4_MANUAL_DERATE_WORKAROUND + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x060000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 3 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 +DEFINE BD_DDR_RET_REGION2_ADDR 0x80002020 +DEFINE BD_DDR_RET_REGION2_SIZE 8 +DEFINE BD_DDR_RET_REGION3_ADDR 0x80004000 +DEFINE BD_DDR_RET_REGION3_SIZE 24 + +/* + * Device Configuration Data (DCD) Version 16 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +//------------------------------------------- +// Reset controller core domain (required to configure it) +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure controller registers +//-------------------------------------------- +/* DRAM controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x83081020 // Set LPDDR4, BL = 16 and active ranks +DATA 4 DDRC_DERATEEN_0 0x00000203 // derate enable, derate values, byte to read MRR data +DATA 4 DDRC_DERATEINT_0 0x0124F800 // derate MR4 interval read +DATA 4 DDRC_RFSHCTL0_0 0x0021F000 +DATA 4 DDRC_RFSHTMG_0 0x004900A8 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x40030495 // pre_cke = 2ms, post_cke = 2us +DATA 4 DDRC_INIT1_0 0x00770000 // dram_rstn = 200us +DATA 4 DDRC_INIT3_0 0x00440024 // MR1, MR2 +DATA 4 DDRC_INIT4_0 0x00F10040 // MR3, MR13 +DATA 4 DDRC_RANKCTL_0 0x0000066F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1618141A // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x00050526 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x060E1514 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00909000 // tmrw, tmrd, tmod +DATA 4 DDRC_DRAMTMG4_0 0x0B04060B // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x02030909 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG6_0 0x02020006 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_DRAMTMG7_0 0x00000301 // tckpde, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020510 // tCMDCKE, tCKEHCMD +DATA 4 DDRC_DRAMTMG13_0 0x0B100002 // tODTLoff, tCCDMW, tPPD +DATA 4 DDRC_DRAMTMG14_0 0x000000AD // txsr +DATA 4 DDRC_ZQCTL0_0 0x02580012 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x01E0493E // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x0499820A // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00070303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001708 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x00400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x008000A0 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000006 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP3_0 0x1F000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP1_0 0x00070707 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x47070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_DBICTL_0 0x00000007 // rd_dbi_en=wr_dbi_en=dm_en=1 +DATA 4 DDRC_ODTMAP_0 0x00000000 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 +//Performance optimizations +DATA 4 DDRC_PWRCTL_0 0x0000010A +DATA 4 DDRC_PWRTMG_0 0x00402010 +DATA 4 DDRC_HWLPCTL_0 0x003F0001 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +//Enables DFI Low Power interface +DATA 4 DDRC_DFILPCFG0_0 0x0700B100 + +//------------------------------------------- +// Release reset of controller core domain +//-------------------------------------------- +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 since it is not used for LPDDR4 +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_PGCR8_0 0x00030002 +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00061032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004578 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00071032 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004685 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // Clear these as they are unused for LPDDR4 +DATA 4 DDR_PHY_CATR0_0 0x00141000 // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +DATA 4 DDR_PHY_CATR1_0 0x0103AAAA // Only for LPDDR3 but used here to know how LPDDR4 bytes are connected to PHY +// Set-up PHY General Configuration Register +SET_BIT 4 DDR_PHY_PGCR1_0 0x000A0040 // DISDIC=1 (no uMCTL2 commands can go to memory), WDQSEXT=1, PUBMODE=1 +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) if 32-bit, else 0 if 16-bit data bus +DATA 4 DDR_PHY_PGCR2_0 0x00F0A193 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR0_0 0x4B025810 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x3A981518 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x801C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x801C0000 +SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008B2C58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x0001BBBB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x0001B9BB // Impedance control for DQ bus +//------------------------------------------- +// Launch PLL init +//-------------------------------------------- +DATA 4 DDR_PHY_PIR_0 0x10 +DATA 4 DDR_PHY_PIR_0 0x11 + +// Wait end of PLL init (Wait for bit 0 of PGSR0 to be '1') +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Switch to boot frequency and launch DCAL+ZCAL +//-------------------------------------------- +DATA 4 DDR_PHY_PLLCR0_0 0xA01C0000 // Put PLL in power down state +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0xA01C0000 +// Switch to boot frequency +DATA 4 0x41C80208 0x1 // Gate functional clock to avoid glitches +DATA 4 0x41C80504 0x00800000 // Set bypass mode in DSC GPR control register +DATA 4 0x41C80204 0x1 // Ungate functional clock +// Set PLL timings for boot frequency +DATA 4 DDR_PHY_PTR0_0 0x026012C1 +DATA 4 DDR_PHY_PTR1_0 0x01D500A9 +// Launch DCAL+ZCAL +DATA 4 DDR_PHY_PIR_0 0x22 +DATA 4 DDR_PHY_PIR_0 0x23 + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL/WL +DATA 4 DDR_PHY_MR3_0 0xF1 // Set drive strength + +DATA 4 DDR_PHY_MR11_0 0x54 // Set CA and DQ ODT +DATA 4 DDR_PHY_MR13_0 0x40 +DATA 4 DDR_PHY_MR22_0 0x15 // Set ODTE-CS=1 (overrides ODT_CA for CS1 as CS not shared between ranks) +/* LPDDR4 mode register writes for CA and DQ VREF settings */ +DATA 4 DDR_PHY_MR12_0 0x48 +DATA 4 DDR_PHY_MR14_0 0x48 +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0C331A09 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28300411 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x0069615A // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x01800501 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK +DATA 4 DDR_PHY_DTPR4_0 0x01502B0C // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x194C160D // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR2_0 0x000A3DEF // tWLDLYS +DATA 4 DDR_PHY_PTR3_0 0x000124F8 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x0000004B // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00001D4C // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x00B00026 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000001 // Select rank 1 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank1 disabled +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00000000 // ODT of rank0 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070801 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 +// Due to address copy set A[13] (=cke_B[0]) and A[15] (=cke_B[1]) outputs as always ON. +DATA 4 DDR_PHY_ACIOCR1_0 0x44000000 +// Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032008 // CK1, CK0, DRAM VREF set to same as MR12 +DATA 4 DDR_PHY_VTCR1_0 0x07F0018F // HVIO=1, SHREN=1, SHRNK=0 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +SET_BIT 4 DDR_PHY_PGCR5_0 0x4 +DATA 4 DDR_PHY_PGCR6_0 0x00033200 // Enable CSN Bit Delay VT Compensation (AC already enabled by default) + drift limit +// Set-up DATX8 General Configuration Registers +DATA 4 DDR_PHY_DX0GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR5_0 0x09092020 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX2GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX3GCR4_0 0x0E00BF3C // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1600 + +//Enable PHY PLL to go into power down on DFI low power request +DATA 4 DDR_PHY_PGCR4_0 0x001900B1 + +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x79000000 // I/O mode = LPDDR4 + +//------------------------------------------- +// Wait end of PHY initialization then launch DRAM initialization +//------------------------------------------- +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +//------------------------------------------- +// Wait end of DRAM initialization then launch second DRAM initialization +// This is required due to errata e10945: +// Title: "PUB does not program LPDDR4 DRAM MR22 prior to running DRAM ZQ calibration" +// Workaround: "Run DRAM Initialization twice" +//------------------------------------------- +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +// tDINIT0 reduced to 2us instead of 2ms. No need to wait the 2ms for the second DRAM init. +DATA 4 DDR_PHY_PTR3_0 0x0000004B + +// Launch DRAM initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x100 +DATA 4 DDR_PHY_PIR_0 0x101 + +//------------------------------------------- +// Wait end of second DRAM initialization +//------------------------------------------- +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +//------------------------------------------- +// Run CBT (Command Bus Training) +//------------------------------------------- +//Call run_cbt(initial DDR_PHY_PTR0 value, initial DDR_PHY_PTR1 value, total_num_drc) here +run_cbt(0x4B025810, 0x3A981518, 1); +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// configure PHY for data training +// The following register writes are recommended by SNPS prior to running training +CLR_BIT 4 DDR_PHY_DQSDR0_0 0x00000001 // Disable drift +SET_BIT 4 DDR_PHY_PGCR6_0 0x00000001 // Disable VT compensation +CHECK_BITS_SET 4 DDR_PHY_PGSR1_0 0x40000000 // Disable VT compensation +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=1; PUBMODE=1 +// Per SNPS initialize BIST registers for VREF training +DATA 4 DDR_PHY_BISTAR1_0 0x00010100 //BMRANK=1 (maximum rank minus 1); BIST Address Increment: 0x10 (16) +DATA 4 DDR_PHY_BISTAR2_0 0x700003FF // BMBANK=8; BMCOL=0x400 (limit to min cols in JEDEC) +DATA 4 DDR_PHY_BISTAR4_0 0x00003FFF // BMROW=0x4000 (limit to min rows in JEDEC) + +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for errata e10946 (Synopsys +// case 9001045655: Design limitation in LPDDR4 mode: REFRESH must be disabled during DQS2DQ training). +DATA 4 DDR_PHY_DTCR0_0 0x000031C7 // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00030236 // Set RANKEN + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 to satisfy errata e10947 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012240F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01224000 + +// DQS2DQ training, Write leveling, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0010F800 +DATA 4 DDR_PHY_PIR_0 0x0010F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +// run rdbi deskew training +RDBI_bit_deskew(0); + +#ifdef MINIMIZE +// Launch VREF training +DRAM_VREF_training_hw(0); +#else +// Run vref training +DRAM_VREF_training_sw(0); +#endif + +DATA 4 DDR_PHY_DX8SLbDDLCTL_0 0x00100002 +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020040 // DISDIC=0, PUBMODE=0 + +//DQS Drift Registers PHY0 +CLR_BIT 4 DDR_PHY_DX0GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX1GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX2GCR3_0 0x08000000 +CLR_BIT 4 DDR_PHY_DX3GCR3_0 0x08000000 +// Enable DQS drift detection PHY0 +DATA 4 DDR_PHY_DQSDR0_0 0x20188005 +DATA 4 DDR_PHY_DQSDR1_0 0xA8AA0000 +DATA 4 DDR_PHY_DQSDR2_0 0x00070200 + +//Enable QCHAN HWidle +DATA 4 0x41c80504 0x400 +// Enable VT compensation +CLR_BIT 4 DDR_PHY_PGCR6_0 0x1 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +ddrc_lpddr4_derate_init(BD_DDR_RET_NUM_DRC); diff --git a/platform/board/mx8qx_val/dcd/imx8qx_dcd_emul.cfg b/platform/board/mx8qx_val/dcd/imx8qx_dcd_emul.cfg new file mode 100644 index 0000000..c7dea51 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_dcd_emul.cfg @@ -0,0 +1,263 @@ +/* +** ################################################################### +** +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#define __ASSEMBLY__ + +#include +#include + +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} + +/* + * Device Configuration Data (DCD) + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + + +// DSC RESET +// First reset ? ZEBU dont know if we need this first reset. 1 +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 +DATA 4 0x41C80204 0x1 + +//ddrc_lpddr4_init(inst); + + // This is for lpddr4 controller 600MHz 1.67ns and ddr 1200MHz 0.83ns +DATA 4 DDRC_MSTR_0 0x03080020 // Set LPDDR4, BL = 16 and active ranks = 2 +DATA 4 DDRC_RFSHTMG_0 0x0049006D // tREFI noroundup(3.904us/tCK)/2 36 = 24, tRFC 180ns RoundUp(tRFCmin/tCK)/2 (180/0.83)/2 134 = 86 +DATA 4 DDRC_INIT0_0 0x0002000c // post cke roundup(2us/tCK)/2 pre_cke = 2ms is too long - LPDDR4 model hacked for 20us 00-SDRAM initialization routine is run after power up . 00 and 10 the same ? +DATA 4 DDRC_INIT1_0 0x000c0000 // dram_rstn - LPDDR4 model hacked for 20us; +DATA 4 DDRC_INIT3_0 0x00440024 // MR1=0x44: nWR=24 ? BL=16; MR2=0x24: RL=24 WL=12 ? +DATA 4 DDRC_INIT4_0 0x00310000 // MR3, MR13 PDDS 110 PU-CAL VddQ/3 +DATA 4 DDRC_RANKCTL_0 0x000006cf // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x1519041a // wr2pr roundup((WL 12 + BL/2 8 + nWR 18ns)/2) = 20 hex 14 , tFAW (40ns /2) 25 hex 19 , tRASmax 8.7885us 4 , tRASmin 42ns (42ns/tCK)/2 26 hex 19 +DATA 4 DDRC_DRAMTMG1_0 0x00040526 // tXP 7.5ns roundup(tXP/2) 4, rd2pre roundup((BL/2 +8ns - 8)/2) = 5 , tRC 42ns +21ns roundup(63ns/2) = 38 hex +DATA 4 DDRC_DRAMTMG2_0 0x060b0e11 // WL 12/2, RL 24/2, rd2wr roundup((RL 24 +BL/2 8 +RU tDQSCK 3.6ns/0.83ns 4.3 +WR_PREAMBLE 2tck + RD_POSTAMBLE 0.5tck -WL 12)/2) = 14, wr2rd RU(WL 12 +BL/2 8+tWTR 10ns +1)/2 17 hex +DATA 4 DDRC_DRAMTMG3_0 0x0170c000 // tmrw tMRW ? tMRWCKEL 10CK, tmrd 10tck, tmod present on DDR3/4 only +DATA 4 DDRC_DRAMTMG4_0 0x0b04070d // trcd 18ns 11, tccd 8tck, trrd 10ns 7, trp 21ns 13 +DATA 4 DDRC_DRAMTMG5_0 0x03040305 // tcksrx 3tck, tcksre 5tck, tckesr 7.5ns tSR TBD, tcke 7.5/0.83/2 +DATA 4 DDRC_DRAMTMG6_0 0x00000004 // tckdpde, tckdpdx, tckcsx 7.5ns +DATA 4 DDRC_DRAMTMG7_0 0x00000401 // tckpde 5tck, tckpdx +DATA 4 DDRC_DRAMTMG12_0 0x00020610 // tCMDCKE 3tck, tCKEHCMD (=tXP?) ? +DATA 4 DDRC_DRAMTMG13_0 0x00100002 // tODTLoff ODT disable, tCCDMW 4*8tck 16, tPPD 4tCK +DATA 4 DDRC_DRAMTMG14_0 0x00000039 // txsr tRFCAB 180ns+ 7.5ns +DATA 4 DDRC_ZQCTL0_0 0x025b0012 // tZQCAL 1us, tZQLAT 30ns 18 +DATA 4 DDRC_ZQCTL1_0 0x03d72e68 // tZQReset 50ns f, tzq_short_interval 0.4s lpddr3 ? +DATA 4 DDRC_DFITMG0_0 0x0498820a // dfi_t_ctrl_delay, dfi_t_rddata_en, dfi_tphy_wrdata, dfi_tphy_wrlat +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00001608 // dfi_tphy_rdcslat, dfi_tphy_wrcslat +DATA 4 DDRC_DFIMISC_0 0x00000005 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0x80400003 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x00010002 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x00000016 // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080202 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP2_0 0x02020000 +DATA 4 DDRC_ADDRMAP3_0 0x02020202 +DATA 4 DDRC_ADDRMAP4_0 0x00001f1f // addrmap_col_b11, addrmap_col_b10 +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0f070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +// These should not be here +//DATA 4 DDRC_ADDRMAP1_0 0x00171717 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +//DATA 4 DDRC_ADDRMAP5_0 0x03030303 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +//DATA 4 DDRC_ADDRMAP6_0 0x03030303 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 + +DATA 4 DDRC_ODTMAP_0 0x00002211 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +// in ddrc_init_inst() +CLR_BIT 4 DDRC_DFIMISC_0 0x00000001 +// As DRAM init sequence will be run by controller set 0x0 to skip_dram_init field +CLR_BIT 4 DDRC_INIT0_0 0xC0000000 + + +// Do we need this as well? Didnt need to set before ZEBU 2 +DATA 4 DDRC_PWRCTL_0 0x10D + +// Toggle Reset ... ZEBU NEED THIS? 3 +//DATA 4 0x41C80208 0x1 +//DATA 4 0x41C80044 0x4 +//DATA 4 0x41C80204 0x1 + + //------------------------------------------- + // Configure registers for PHY initialization + // Timings are computed for a PHY at 600MHz (DRAM at 1200MHz) 600MHz 1.67ns ddr 1200MHz 0.83ns + //------------------------------------------- + +//ddr_phy_lpddr4_phy_init() + + // Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040D // LPDDR4 selection with 8 bank + + // Set-up PHY General Configuration Register + // PGCR0,1,4,5,6,7 are untouched +DATA 4 DDR_PHY_PGCR0_0 0x87001e00 // address copy +DATA 4 DDR_PHY_PGCR2_0 0x00F0A3CC // Set tREFPRD (9*3.904us) +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity + + // Set-up PHY Timing Register + // PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x64032010 // tPLLPD, tPLLGS, tPHYRST + // CAST32(DDR_PHY_PTR1_0 0x4E201C20 // tPLLLOCK=25us, tPLLRST=9us +DATA 4 DDR_PHY_PTR1_0 0x0D701C20 // tPLLLOCK reduced to 4.3us, tPLLRST=9us + + // Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x00000000 // FREQSEL=0 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x08000000 + + // Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x001FEC58 // Set ODT_MODE=0b10(LPDDR4 stype pullup) + + // Set-up Impedance Controller Program Register + // ZQnPR0, ZQnPR1 are untouched, lpddr4 PD_REFSEL should not be default value, FIXME + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x41 + + //------------------------------------------- + // Configure registers for DRAM initialization + //------------------------------------------- + //ddr 1200MHz 0.83ns + +// ddr_phy_lpddr4_dram_init() + + // Set-up Mode Register + // MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR1_0 0x44 // Set BL, WR-PRE, nWR, RPST +DATA 4 DDR_PHY_MR2_0 0x24 // Set RL=24/WL=12 +DATA 4 DDR_PHY_MR3_0 0x31 // Set drive strength to 40 ohms typical pull-down/pull-up + + // Set-up DRAM Timing Parameters Register + // DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x0d331a05 // tRRD (10/0.83 = 13), tRAS (42ns/0.83 = 51 ), tRP (21ns/0.83 = 26 1A), tRTP (101) +DATA 4 DDR_PHY_DTPR1_0 0x28318C0a // tWLMRD, tFAW(40ns/0.83 = 49 31), tODTUP(odt is disable), tMRD(10 tck) +DATA 4 DDR_PHY_DTPR2_0 0x003a00E2 // tRTW, tRTODT, tCMDCKE, tCKE (7.5 / 0.83 = 10 a), tXS(180ns + 7.5ns / 0.83 = 226 ) +DATA 4 DDR_PHY_DTPR3_0 0x01800502 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (3.6ns / 0.83 ) (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x01C0000a // tRFC(180ns/0.83), tWLO, tXP (7.5ns / 0.83 ) +DATA 4 DDR_PHY_DTPR5_0 0x004c160d // tRC (tRAS + tRPab = (42+21)/0.83 = 76 ), tRCD (18ns / 0.83 = 22 ), tWTR (10ns / 0.83 13 d) + + // Set-up PHY Timing Register + // DATA 4 DDR_PHY_PTR3_0 0x0030D400 // tDINIT0 - 2ms +DATA 4 DDR_PHY_PTR3_0 0x00005E21 // tDINIT0 - memory model hacked to 20us 25097 +DATA 4 DDR_PHY_PTR4_0 0x0000096A // tDINIT1 (2000ns) 2410 +DATA 4 DDR_PHY_PTR5_0 0x00005E21 // tDINIT2 - normally 200us but memory model hacked to 20us +DATA 4 DDR_PHY_PTR6_0 0x025004B5 // tDINIT4 (30ns) 37, tDINIT3 (1us) 1205 + + // RDIMMGCR0-2 RDIMMGCR0-4?? + + // Set-up DATX8 Common Configuration Register + // DXCCR is untouched + + // Set-up DDR System General Configuration Register + // DSGCR is untouched + + // Set-up ODT Configuration Register + // ODTCR is untouched + + // Set-up Anti-Aging Control Register + // AACR is untouched + + // Set-up Data Training Address Register + // DTAR0-3 are untouched + // !! DTAR3 is not described in spec !! + + // Set-up AC I/O Configuration Register + // ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070800 // PNUM2 (i.e.LPDDR4) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x09000000 // I/O mode = LPDDR4 + + // IOVCR0-1, DXnGCR0-4??, CALBYP + + // Set-up VREF Training Control Registers +DATA 4 DDR_PHY_VTCR0_0 0xF0032019 // CK1, CK0 +DATA 4 DDR_PHY_VTCR1_0 0x07F00173 // HVIO=1, SHREN=1, SHRNK=0 + + // Set-up DATX8 General Configuration Registers + // DXnGCR0-4 are untouched + + // Set-up DATX8 DX Control Register 2 +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x081800 // PREOEX=2tCK, POSOEX=0.5tCK + + // Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x09000000 // I/O mode = LPDDR4 + + // Set-up DATX8 DQS Control Register +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x013E4091 // DQS resistor + +//ddr_phy_wait_init_done() + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + +// ddr_phy_launch_init() + // Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x40000 + + // Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x40001 + +// ddr_phy_wait_init_done + // Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 + + +// Toggle Reset? ZEBU dont know if correct reset inserted here. 4 +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0xF +//DSC_SetReset(SC_DSC_DRC_0, BIT(RST_DDR_CRESETN), SC_TRUE); +DATA 4 0x41C80204 0x1 + + +// dram_init_inst() +CLR_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 0 +SET_BIT 4 DDRC_DFIMISC_0 0x00000001 // Set DFIMISC.dfi_init_complete_en to 1 - Trigger DRAM initialization +SET_BIT 4 DDRC_SWCTL_0 0x00000001 // Set SWCTL.sw_done to 1 +CHECK_BITS_SET 4 DDRC_SWSTAT_0 0x00000001 // Wait for SWSTAT.sw_done_ack to become 1 + + //Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 diff --git a/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz.cfg b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz.cfg new file mode 100755 index 0000000..bea7d33 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz.cfg @@ -0,0 +1,303 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 + +/* + * Device Configuration Data (DCD) Version 22 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 800MHz. */ + uint32_t rate2 = 400000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 800MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x00000085); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x00620068 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300C5 // pre_cke +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0C700006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00180000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x00090000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0C101B0E // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000A0314 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x04060609 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002006 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x06020306 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x04040302 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40800020 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200C350 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04878205 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000503 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +// DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x0600060C +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 800MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0C170 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000C70 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000018 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x061C0B06 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28200000 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01040200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00D00C14 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x00270B07 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00061A80 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000D0 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00027100 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x04000321 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support (the following lines are uncommented when ECC is enabled) +// DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1 +// DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA +// DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +// CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +// CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +// DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +// DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 +// DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 + diff --git a/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz_ecc.cfg b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz_ecc.cfg new file mode 100755 index 0000000..9c7bddb --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_800MHz_ecc.cfg @@ -0,0 +1,303 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 + +/* + * Device Configuration Data (DCD) Version 22 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 800MHz. */ + uint32_t rate2 = 400000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 800MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x00000085); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x00620068 // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300C5 // pre_cke +DATA 4 DDRC_INIT1_0 0x00500000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0C700006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00180000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x00090000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0C101B0E // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000A0314 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x04060609 // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002006 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x06020306 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x04040302 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40800020 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200C350 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04878205 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000503 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x0600060C +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 800MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00005281 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00004736 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0C170 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x32019010 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x27100E10 // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000C70 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000018 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x061C0B06 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28200000 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01040200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00D00C14 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x00270B07 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00061A80 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000D0 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x00027100 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x04000321 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support (the following lines are uncommented when ECC is enabled) +DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1 +DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA +DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 + diff --git a/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz.cfg b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz.cfg new file mode 100755 index 0000000..e49a16f --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz.cfg @@ -0,0 +1,303 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 + +/* + * Device Configuration Data (DCD) Version 22 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 933MHz. */ + uint32_t rate2 = 465000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 930MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x0000009B); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x0072007A // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300E5 // pre_cke +DATA 4 DDRC_INIT1_0 0x005D0000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0E140006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00200000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x000B0000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0E112010 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000C0417 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x07020307 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x05050303 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40960026 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200E3F5 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04898206 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000704 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +// DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x06000610 +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled + +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00000000 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00000000 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0E207 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x3A61D310 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x2D98106A // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000E14 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000020 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x06200D08 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28210300 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00F30C17 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x002D0D09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00071FA6 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000F3 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0002D976 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x040003A7 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +// DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support (the following lines are uncommented when ECC is enabled) +// DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1 +// DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA +// DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +// CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +// CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +// DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +// DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +// DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 +// DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 + diff --git a/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc.cfg b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc.cfg new file mode 100755 index 0000000..36d25c7 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc.cfg @@ -0,0 +1,302 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 + +/* + * Device Configuration Data (DCD) Version 22 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 933MHz. */ + uint32_t rate2 = 465000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 930MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x0000009B); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x0072007A // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300E5 // pre_cke +DATA 4 DDRC_INIT1_0 0x005D0000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0E140006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00200000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x000B0000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0E112010 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000C0417 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x07020307 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x05050303 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40960026 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200E3F5 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04898206 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000704 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x06000610 +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00005281 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00004736 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0E207 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x3A61D310 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x2D98106A // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000E14 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000020 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x06200D08 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28210300 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00F30C17 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x002D0D09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00071FA6 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000F3 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0002D976 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x040003A7 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support (the following lines are uncommented when ECC is enabled) +DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1 +DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA +DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 + diff --git a/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc_early_cpu.cfg b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc_early_cpu.cfg new file mode 100755 index 0000000..84c9b45 --- /dev/null +++ b/platform/board/mx8qx_val/dcd/imx8qx_ddr3_dcd_933MHz_ecc_early_cpu.cfg @@ -0,0 +1,382 @@ +#define __ASSEMBLY__ + +#include +#include + +/*! Configure DDR retention support */ +DEFINE BD_DDR_RET /* Add/remove DDR retention */ + +DEFINE BD_DDR_SIZE 0x040000000 /* Total board DDR density (bytes) calculated based on RPA config */ +DEFINE BD_DDR_RET_NUM_DRC 1 /* Number for DRCs to retain */ +DEFINE BD_DDR_RET_NUM_REGION 1 /* DDR regions to save/restore */ + +/* Descriptor values for DDR regions saved/restored during retention */ +DEFINE BD_DDR_RET_REGION1_ADDR 0x80000000 +DEFINE BD_DDR_RET_REGION1_SIZE 32 + +/* + * Device Configuration Data (DCD) Version 19 + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* Only valid if called by SCFW */ +if (action != BOARD_DDR_COLD_INIT) +{ + return SC_ERR_NONE; +} +if (rom_caller == SC_FALSE) +{ + /* Set the DRC rate to achieve a DRAM rate as close as possible to 933MHz. */ + uint32_t rate2 = 465000000U; + (void) pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2); +} +else +{ + /* gate the cslice and ssslice */ + CLR_BIT 4 0x41C83800 0xDC000000 + CLR_BIT 4 0x41C82C00 0xDC00001F + + /* relock HP PLL to 930MHz */ + /* Enable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,8,0x40000000); + /* power down PLL and clear dividers */ + DSC_AIRegisterWrite(0x24,0,8,0x000020FF); + /* Set the divider */ + DSC_AIRegisterWrite(0x24,0,4,0x0000009B); + /* power up PLL and set hold ring off */ + DSC_AIRegisterWrite(0x24,0,4,0x00003000); + SYSCTR_TimeDelay(25); + /* clear hold ring off */ + DSC_AIRegisterWrite(0x24,0,8,0x00001000); + SYSCTR_TimeDelay(50); + /* disable PLL isolation */ + DSC_AIRegisterWrite(0x24,0,4,0x40000000); + + /* Ungate cslice and ssslice */ + SET_BIT 4 0x41C82C00 0x4C000002 + SET_BIT 4 0x41C83800 0x4C000000 +} + +if (rom_caller == SC_TRUE) +{ +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x8 // Assert uMCTL2 core reset +DATA 4 0x41C80204 0x1 // Start functional clocks. + +/* DRAM 0 controller configuration begin */ +DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks +DATA 4 DDRC_RFSHTMG_0 0x0072007A // tREFI, tRFC +DATA 4 DDRC_INIT0_0 0x400300E5 // pre_cke +DATA 4 DDRC_INIT1_0 0x005D0000 // dram_rstn +DATA 4 DDRC_INIT3_0 0x0E140006 // MR0, MR1 +DATA 4 DDRC_INIT4_0 0x00200000 // MR2, MR3 +DATA 4 DDRC_INIT5_0 0x000B0000 // ZQINIT +DATA 4 DDRC_DIMMCTL_0 0x00000000 // DIMMCTL register for address mirroring +DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd +DATA 4 DDRC_DRAMTMG0_0 0x0E112010 // wr2pr, tFAW, tRASmax, tRASmin +DATA 4 DDRC_DRAMTMG1_0 0x000C0417 // tXP, rd2pre, tRC +DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd +DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD +DATA 4 DDRC_DRAMTMG4_0 0x07020307 // trcd, tccd, trrd, trp +DATA 4 DDRC_DRAMTMG5_0 0x05050303 // tCKCKEH, tCKCKEL, tckesr, tcke +DATA 4 DDRC_DRAMTMG8_0 0x03030905 // tckdpde, tckdpdx, tckcsx +DATA 4 DDRC_ZQCTL0_0 0x40960026 // tZQCAL, tZQLAT +DATA 4 DDRC_ZQCTL1_0 0x0200E3F5 // tZQReset, tzq_short_interval +DATA 4 DDRC_DFITMG0_0 0x04898206 +DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable +DATA 4 DDRC_DFITMG2_0 0x00000704 +DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity +DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation +DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max) +DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en +DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0 +DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 +DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6 +DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated +DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 +DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 +DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled) + +DATA 4 DDRC_ODTCFG_0 0x06000610 +DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0 + +DATA 4 DDRC_SCHED_0 0x7F001F05 // 30ns delay upon read store empty if write pending, CAM (32 entries) + +DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000 + +DATA 4 DDRC_PWRCTL_0 0x00000000 + +DATA 4 0x41C80208 0x1 +DATA 4 0x41C80044 0x4 +DATA 4 0x41C80204 0x1 + +//------------------------------------------- +// Configure registers for PHY initialization +// Timings are computed for 933MHz DRAM operation +//-------------------------------------------- +// Following are uncommented (to disable) or commented (to enable) particular byte lanes +// DATA 4 DDR_PHY_DX2GCR1_0 0x55556000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR1_0 0x55556000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR1_0 0x55556000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR2_0 0xAAAAAAAA // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR3_0 0x0029A4A4 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR3_0 0x0029A4A4 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR3_0 0x0029A4A4 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR4_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR4_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR4_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// DATA 4 DDR_PHY_DX2GCR5_0 0x00000000 // uncommented to disable byte lane 2 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX3GCR5_0 0x00000000 // uncommented to disable byte lane 3 when configured for 16-bit data bus +// DATA 4 DDR_PHY_DX4GCR5_0 0x00000000 // uncommented to disable byte lane 4 when ECC disabled +// Set-up DRAM Configuration Register +DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank +// Set-up byte and bit swapping registers +DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping +DATA 4 DDR_PHY_DX4DQMAP0_0 0x00005281 // DQ bit 0/1/2/3/4 remapping +DATA 4 DDR_PHY_DX4DQMAP1_0 0x00004736 // DQ bit 5/6/7 and DM remapping +// Set-up PHY General Configuration Register +// PGCR1,4,5,6,7 are untouched +SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory) +DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy) +DATA 4 DDR_PHY_PGCR2_0 0x00F0E207 // Set tREFPRD +DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity +// Set-up PHY Timing Register +// PTR2 is untouched +DATA 4 DDR_PHY_PTR0_0 0x3A61D310 // tPLLPD, tPLLGS, tPHYRST +DATA 4 DDR_PHY_PTR1_0 0x2D98106A // tPLLLOCK, tPLLRST +// Set-up PLL Control Register +DATA 4 DDR_PHY_PLLCR0_0 0x011C0000 +DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000 +// SET_BIT 4 DDR_PHY_DX8SL1PLLCR0_0 0x20000000 // uncommented to disable byte lanes 2 and 3 PLL when configured for 16-bit data bus +// SET_BIT 4 DDR_PHY_DX8SL2PLLCR0_0 0x20000000 // uncommented to disable byte lanes 4 and 5 PLL when configured for 16-bit data bus or when ECC disabled + +// Set-up Impedance Control Register +DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup) +// ZPROG_DRAM_ODT and ZPROG_HOST_ODT +DATA 4 DDR_PHY_ZQ0PR0_0 0x000077BB // Impedance control for CA bus +DATA 4 DDR_PHY_ZQ1PR0_0 0x000077BB // Impedance control for DQ bus +// Set-up PHY Initialization Register +DATA 4 DDR_PHY_PIR_0 0x72 +// Launch initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x73 + + +//------------------------------------------- +// Configure registers for DRAM initialization +//------------------------------------------- +// Set-up Mode Register +// MR0, MR3, MR4, MR5 MR6 are untouched +DATA 4 DDR_PHY_MR0_0 0x00000E14 +DATA 4 DDR_PHY_MR1_0 0x00000006 +DATA 4 DDR_PHY_MR2_0 0x00000020 +DATA 4 DDR_PHY_MR3_0 0x00000000 + +// Set-up DRAM Timing Parameters Register +// DTPR6 is untouched +DATA 4 DDR_PHY_DTPR0_0 0x06200D08 // tRRD, tRAS, tRP, tRTP +DATA 4 DDR_PHY_DTPR1_0 0x28210300 // tWLMRD, tFAW, tODTUP, tMRD +DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS +DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK) +DATA 4 DDR_PHY_DTPR4_0 0x00F30C17 // tRFC, tWLO, tXP +DATA 4 DDR_PHY_DTPR5_0 0x002D0D09 // tRC, tRCD, tWTR +// Set-up PHY Timing Register +DATA 4 DDR_PHY_PTR3_0 0x00071FA6 // tDINIT0 +DATA 4 DDR_PHY_PTR4_0 0x000000F3 // tDINIT1 +DATA 4 DDR_PHY_PTR5_0 0x0002D976 // tDINIT2 +DATA 4 DDR_PHY_PTR6_0 0x040003A7 // tDINIT4, tDINIT3 + + +// Set-up ODT Configuration Register +// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically. +DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write +DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled + + +// Set-up AC I/O Configuration Register +// ACIOCR1-4 are untouched +DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2 +DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3 +DATA 4 DDR_PHY_IOVCR0_0 0x03000000 +// Set-up DATX8 General Configuration Registers +// DXnGCR0-4 are untouched +DATA 4 DDR_PHY_PGCR5_0 0x01010004 + +// Byte lanes 2 and 3 are commented out when configured for 16-bit data bus. Byte lane 4 commented out when ECC disabled +DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults +DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults +DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults + +// Set-up DATX8 DX Control Register 2 +// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA +DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400 +// Set-up DATX8 IO Control Register +DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3 + +// Wait PHY initialization end then launch DRAM initialization +// Wait for bit 0 of PGSR0 to be '1' +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured + +// Launch DRAM 0 initialization (set bit 0) +DATA 4 DDR_PHY_PIR_0 0x180 +DATA 4 DDR_PHY_PIR_0 0x181 + +// DRAM 0 initialization end +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//---------------------------------------------------------------// +// DATA training +//---------------------------------------------------------------// +// Set-up Data Training Configuration Register +// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys +// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training). +// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED). +DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0 +DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3 + +// Launch Write leveling +DATA 4 DDR_PHY_PIR_0 0x200 +DATA 4 DDR_PHY_PIR_0 0x201 +// Wait Write leveling to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000 + +// Set DQS/DQSn glitch suppression resistor for training PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7 +// Launch Read DQS training +DATA 4 DDR_PHY_PIR_0 0x400 +DATA 4 DDR_PHY_PIR_0 0x401 +// Wait Read DQS training to complete PHY0 +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000 +// Remove DQS/DQSn glitch suppression resistor PHY0 +DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000 + +// Write leveling adjust, Deskew and eye trainings +DATA 4 DDR_PHY_PIR_0 0x0000F800 +DATA 4 DDR_PHY_PIR_0 0x0000F801 +// Wait for training to complete +CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1 +CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 + +//Re-allow uMCTL2 to send commands to DDR +CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0 + +//Check that controller is ready to operate +CHECK_BITS_SET 4 DDRC_STAT_0 0x1 + +// ECC Support for the ROM portion of the DDR initialization + /* Initialize DDR sections for early CPUs. + * These sections are only for the first images to be loaded into DDR and should be minimized to optimize for boot time. + */ + +DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0 +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = write, scub_en = 0 +DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA + + +//========================== Init 4MB from start_addr 0x00000000 =============================// + +/* Set DSC_GPRCTRL to make sure: + * + * Note that: + * sbr_address_start_mask[35:31] is forced to 0. + * sbr_address_start_mask[30:20] is controlled through DSC_GPRCTRL.Bit39,38,37,36,35,34,33,32,26,25,24. + * sbr_address_start_mask[19:00] is forced to 0. + * + * Note that: + * sbr_address_range_mask[35:31] is forced to 0. + * sbr_address_range_mask[30:20] is controlled through DSC_GPRCTRL.Bit47,46,45,44,43,42,41,40,31,30,29. + * sbr_address_range_mask[19:00] is controlled through DSC_GPRCTRL.Bit21 + * + * GPRCTRL is accessed through 2 separate transactions 0x41C80500 for bits [31:0] + * and 0x41C80510 for bits [63:32]. + * Note that we use the clear and the set offsets which are 8 and 4 respectively. + * + */ + +/* Scrub the first 32MB + *sbr_address_start_mask = 0x000000000 + *sbr_address_range_mask = 0x0007FFFFF + */ + +DATA 4 0x41C80508 0xE7200000 //clear all the start/range masks +DATA 4 0x41C80518 0x0000FFFF //clear all the start/range masks +DATA 4 0x41C80504 0xE0200000 //scrub only 32MB at beginning +DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 + +// Scrub the last 32MB +DATA 4 0x41C80508 0xE7200000 //clear all the start/range masks +DATA 4 0x41C80518 0x0000FFFF //clear all the start/range masks +DATA 4 0x41C80504 0xE0200000 //scrub last 32 MB +DATA 4 0x41C80514 0x1F1F //scrub last 32 MB +DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 +CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 + +// Enable AXI port so that we can start to load images into first 32MB and last 32MB +DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0 + + +// Scrub the uninitialized space (i.e. [32MB, 1GB-32MB]) +DATA 4 0x41C80508 0xE7200000 //clear all the start/range masks +DATA 4 0x41C80518 0x0000FFFF //clear all the start/range masks +DATA 4 0x41C80504 0xE0200000 //configure start_mask to 0x800000 and range_mask to 0xF7FFFFF +DATA 4 0x41C80514 0x00001E01 //configure start_mask to 0x800000 and range_mask to 0xF7FFFFF +DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1 + +/* note that at this point only the first and last 32 MB is accessible. + * This is done to help with the boot time of early CPUs that need to use a small portion of DDR. + * Also at this time the DDR controller is scrubbing the remaining DDR. + * So, during this period, there is a competition for ddr bandwidth between "early CPUs access" versus "remaining DDR scrubbing". + */ +//========= End of DCD ==============// +} +else +{ +/* This portion of the DCD is run after any early CPUs + * do this once weve booted early cpus + * This section takes quite a bit ~200 ms + */ + +CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done +CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done +DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0 +//at this time, all the DDR space have been initialized. + +// Enable the ECC protect for full ddr space +DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1 +DATA 4 0x41C80508 0xE7200000 //clear all the start/range masks +DATA 4 0x41C80518 0x0000FFFF //clear all the start/range masks +DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1 + +} diff --git a/platform/board/none/Makefile b/platform/board/none/Makefile new file mode 100755 index 0000000..776f391 --- /dev/null +++ b/platform/board/none/Makefile @@ -0,0 +1,44 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +OBJS += $(OUT)/board/none/board.o $(OUT)/board/board_common.o + +ifneq ($(HW), SIMU) + OBJS += $(OUT)/board/board.o +endif + +DIRS += $(OUT)/board/none + +RSRC_MD += $(SRC)/board/none/resource.txt + +CTRL_MD += $(SRC)/board/none/control.txt + diff --git a/platform/board/none/board.bom b/platform/board/none/board.bom new file mode 100755 index 0000000..dd4ca27 --- /dev/null +++ b/platform/board/none/board.bom @@ -0,0 +1,33 @@ +## ################################################################### +## +## Copyright 2019 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + + diff --git a/platform/board/none/board.c b/platform/board/none/board.c new file mode 100755 index 0000000..da11e44 --- /dev/null +++ b/platform/board/none/board.c @@ -0,0 +1,589 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing empty implementation of the board. + * + * @addtogroup NO_BRD BRD: No Board + * + * Module for no board access. + * + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/build_info.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#ifdef SIMU + #include "main/simu.h" +#endif +#include "all_svc.h" +#include "drivers/lpuart/fsl_lpuart.h" +#include "pads.h" + +/* Local Defines */ + +/*! + * @name Board Configuration + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_NUM_RSRC 11U +#define BRD_NUM_CTRL 6U +/** @} */ + +/*! + * @name Board Resources + * DO NOT CHANGE - must match object code. + */ +/** @{ */ +#define BRD_R_BOARD_PMIC_0 0U +#define BRD_R_BOARD_PMIC_1 1U +#define BRD_R_BOARD_PMIC_2 2U +#define BRD_R_BOARD_R0 3U +#define BRD_R_BOARD_R1 4U +#define BRD_R_BOARD_R2 5U +#define BRD_R_BOARD_R3 6U +#define BRD_R_BOARD_R4 7U +#define BRD_R_BOARD_R5 8U +#define BRD_R_BOARD_R6 9U +#define BRD_R_BOARD_R7 10U +/** @} */ + +/*! Configure debug UART */ +#define LPUART_DEBUG LPUART_SC + +/*! Configure debug UART instance */ +#define LPUART_DEBUG_INST 0 + +#ifdef EMUL + /*! Configure debug baud rate */ + #define DEBUG_BAUD 4000000U +#else + /*! Configure debug baud rate */ + #define DEBUG_BAUD 115200U +#endif + +/* Local Types */ + +/* Local Functions */ + +/* Local Variables */ + +/*! + * This constant contains info to map resources to the board. + * DO NOT CHANGE - must match object code. + */ +const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD] = +{ + RSRC(PMIC_0, 0, 0), + RSRC(PMIC_1, 0, 1), + RSRC(PMIC_2, 0, 2), + RSRC(BOARD_R0, 0, 3), + RSRC(BOARD_R1, 0, 4), + RSRC(BOARD_R2, 0, 5), + RSRC(BOARD_R3, 0, 6), + RSRC(BOARD_R4, 0, 7), + RSRC(BOARD_R5, 0, 8), + RSRC(BOARD_R6, 0, 9), + RSRC(BOARD_R7, 0, 10) +}; + +/* Block of comments that get processed for documentation + DO NOT CHANGE - must match object code. */ +#ifdef DOX + RNFO() /* PMIC 0 */ + RNFO() /* PMIC 1 */ + RNFO() /* PMIC 2 */ + RNFO() /* Misc. board component 0 */ + RNFO() /* Misc. board component 1 */ + RNFO() /* Misc. board component 2 */ + RNFO() /* Misc. board component 3 */ + RNFO() /* Misc. board component 4 */ + RNFO() /* Misc. board component 5 */ + RNFO() /* Misc. board component 6 */ + RNFO() /* Misc. board component 7 */ + TNFO(PMIC_0, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_0, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_1, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_1, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ + TNFO(PMIC_2, TEMP, RO, x, 8) /* Temperature sensor temp */ + TNFO(PMIC_2, TEMP_HI, RW, x, 8) /* Temperature sensor high limit alarm temp */ +#endif + +/* External Variables */ + +const sc_rm_idx_t board_num_rsrc = BRD_NUM_RSRC_BRD; + +/*! + * External variable for specing DDR periodic training. + */ +const uint32_t board_ddr_period_ms = 0U; + +const uint32_t board_ddr_derate_period_ms = 0U; + +/* External Functions */ + +/*--------------------------------------------------------------------------*/ +/* Init */ +/*--------------------------------------------------------------------------*/ +void board_init(boot_phase_t phase) +{ + ss_print(3, "board_init(%d)\n", phase); + +#ifdef SIMU + if (phase == BOOT_PHASE_API_INIT) + { + main_simu_load_board(); + } +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Return the debug UART info */ +/*--------------------------------------------------------------------------*/ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud) +{ + *inst = LPUART_DEBUG_INST; + *baud = DEBUG_BAUD; + + return LPUART_DEBUG; +} + +/*--------------------------------------------------------------------------*/ +/* Configure debug UART */ +/*--------------------------------------------------------------------------*/ +void board_config_debug_uart(sc_bool_t early_phase) +{ + #if defined(DEBUG) && !defined(SIMU) + /* Power up UART */ + pm_force_resource_power_mode_v(SC_R_SC_UART, + SC_PM_PW_MODE_ON); + + /* Return if debug enabled */ + if (SCFW_DBG_READY) + { + return; + } + + /* Configure SCU UART */ + main_config_debug_uart(LPUART_DEBUG, SC_24MHZ); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Disable debug UART */ +/*--------------------------------------------------------------------------*/ +void board_disable_debug_uart(void) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Configure SCFW resource/pins */ +/*--------------------------------------------------------------------------*/ +void board_config_sc(sc_rm_pt_t pt_sc) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Get board parameter */ +/*--------------------------------------------------------------------------*/ +board_parm_rtn_t board_parameter(board_parm_t parm) +{ + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + return main_board_parameter(parm); +} + +/*--------------------------------------------------------------------------*/ +/* Get resource avaiability info */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc) +{ + /* Return SC_FALSE here if a resource isn't available due to board + connections (typically lack of power). Examples incluse DRC_0/1 + and ADC. */ + + /* The value here may be overridden by SoC fuses or emulation config */ + + /* Note return values are usually static. Can be made dynamic by storing + return in a global variable and setting using board_set_control() */ + + return SC_TRUE; +} + +/*--------------------------------------------------------------------------*/ +/* Override QoS configuration */ +/*--------------------------------------------------------------------------*/ +void board_qos_config(sc_sub_t ss) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Init DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initalized) +{ + board_print(3, "board_init_ddr(%d)\n", early); + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Take action on DDR */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action) +{ + /* Note this is called by the ROM before the SCFW is initialized. + * Do NOT make any unqualified calls to any other APIs. + */ + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the system (inc. additional resource partitions) */ +/*--------------------------------------------------------------------------*/ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) +{ + /* This function configures the system. It usually partitions + resources according to the system design. It must be modified by + customers. Partitions should then be specified using the mkimage + -p option. */ + + board_print(3, "board_system_config(%d)\n", early); + + /* Name default partitions */ + PARTITION_NAME(SC_PT, "SCU"); + PARTITION_NAME(SECO_PT, "SECO"); + PARTITION_NAME(pt_boot, "BOOT"); +} + +/*--------------------------------------------------------------------------*/ +/* Early CPU query */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_early_cpu(sc_rsrc_t cpu) +{ + return SC_FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level SoC power domain */ +/*--------------------------------------------------------------------------*/ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_set_power_mode(%s, %d, %d, %d)\n", snames[ss], + pd, from_mode, to_mode); +} + +/*--------------------------------------------------------------------------*/ +/* Set the voltage for the given SS. */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt) +{ + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Set board power supplies when enter/exit low-power mode */ +/*--------------------------------------------------------------------------*/ +void board_lpm(sc_pm_power_mode_t mode) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Transition external board-level supply for board component */ +/*--------------------------------------------------------------------------*/ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode) +{ + board_print(3, "board_trans_resource_power(%d, %s, %d, %d)\n", idx, + rnames[rsrc_idx], from_mode, to_mode); +} + +/*--------------------------------------------------------------------------*/ +/* Reset a board resource */ +/*--------------------------------------------------------------------------*/ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Set board power mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_power(sc_pm_power_mode_t mode) +{ + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Reset board */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt) +{ + #ifndef SIMU + #ifdef DEBUG + /* Dump out caller of reset request */ + always_print("Board reset (%u, caller = 0x%08X)\n", reason, + __builtin_return_address(0)); + + /* Invoke LPUART deinit to drain TX buffers if a warm reset follows */ + LPUART_Deinit(LPUART_DEBUG); + #endif + + /* Request a warm reset */ + soc_set_reset_info(reason, pt); + NVIC_SystemReset(); + #endif + + return SC_ERR_UNAVAILABLE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle CPU reset event */ +/*--------------------------------------------------------------------------*/ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt) +{ + /* Note: Production code should decide the response for each type + * of reset event. Options include allowing the SCFW to + * reset the CPU or forcing a full system reset. Additionally, + * the number of reset attempts can be tracked to determine the + * reset response. + */ + + /* Check for MCU reset event */ + if ((resource == SC_R_MCU_0_PID0) || (resource == SC_R_MCU_1_PID0)) + { + always_print("MCU reset event (rsrc = %d, event = %d)\n", resource, + reset_event); + + /* Treat lockups or parity/ECC reset events as board faults */ + if ((reset_event == BOARD_CPU_RESET_LOCKUP) || + (reset_event == BOARD_CPU_RESET_MEM_ERR)) + { + board_fault(SC_FALSE, BOARD_BFAULT_CPU, pt); + } + } + + /* Returning from this function will result in an attempt reset the + partition or board depending on the event and wdog action. */ +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask) +{ + /* Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + */ + *mask = 0UL; +} + +/*--------------------------------------------------------------------------*/ +/* Trap partition reboot continue */ +/*--------------------------------------------------------------------------*/ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr) +{ + /* Code can modify boot parameters on a reboot. Called after partition + * is powered off but before it is powered back on and started. + */ +} + +/*--------------------------------------------------------------------------*/ +/* Return partition reboot timeout action */ +/*--------------------------------------------------------------------------*/ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt) +{ + /* Return the action to take if a partition reboot requires continue + * ack for others and does not happen before timeout */ + return BOARD_REBOOT_TO_FORCE; +} + +/*--------------------------------------------------------------------------*/ +/* Handle panic temp alarm */ +/*--------------------------------------------------------------------------*/ +void board_panic(sc_dsc_t dsc) +{ + /* See Porting Guide for more info on panic alarms */ + #ifdef DEBUG + error_print("Panic temp (dsc=%d)\n", dsc); + #endif + + board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_TEMP, + SC_PT); +} + +/*--------------------------------------------------------------------------*/ +/* Handle fault or return from main() */ +/*--------------------------------------------------------------------------*/ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt) +{ + /* Note, delete the DEBUG case if fault behavior should be like + typical production build even if DEBUG defined */ + + #ifdef DEBUG + /* Disable the watchdog */ + board_wdog_disable(SC_FALSE); + + board_print(1, "board fault(%u, %u, %u)\n", restarted, reason, pt); + + /* Stop so developer can see WDOG occurred */ + #ifndef SIMU + HALT; + #endif + #else + /* Was this called to report a previous WDOG restart? */ + if (restarted == SC_FALSE) + { + /* Fault just occurred, need to reset */ + board_reset(SC_PM_RESET_TYPE_BOARD, + SC_PM_RESET_REASON_SCFW_FAULT, pt); + + /* Wait for reset */ + HALT; + } + /* Issue was before restart so just return */ + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Handle SECO/SNVS security violation */ +/*--------------------------------------------------------------------------*/ +void board_security_violation(void) +{ + always_print("SNVS security violation\n"); +} + +/*--------------------------------------------------------------------------*/ +/* Get the status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +sc_bool_t board_get_button_status(void) +{ + return SC_FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Set control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NOTFOUND; + + board_print(3, + "board_set_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + +#ifdef SIMU + if (resource == SC_R_PMIC_0) + { + err = SC_ERR_NONE; + } +#endif + + return err;; +} + +/*--------------------------------------------------------------------------*/ +/* Get control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NOTFOUND; + + board_print(3, + "board_get_control(%s, %u)\n", rnames[rsrc_idx], ctrl); + + #ifdef SIMU + if (resource == SC_R_PMIC_0) + { + err = SC_ERR_NONE; + } + #endif + + return err;; +} + +/*--------------------------------------------------------------------------*/ +/* Board tick */ +/*--------------------------------------------------------------------------*/ +void board_tick(uint16_t msec) +{ +} + +/*--------------------------------------------------------------------------*/ +/* Board IOCTL function */ +/*--------------------------------------------------------------------------*/ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + + /* For test_misc */ + if (*parm1 == 0xFFFFFFFEU) + { + *parm1 = *parm2 + *parm3; + *parm2 = mu; + *parm3 = caller_pt; + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/** @} */ + diff --git a/platform/board/none/board.h b/platform/board/none/board.h new file mode 100755 index 0000000..0473288 --- /dev/null +++ b/platform/board/none/board.h @@ -0,0 +1,53 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure board specific features of the SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_H +#define SC_BOARD_H + +/* Includes */ + +/* Defines */ + +#endif /* SC_BOARD_H */ + diff --git a/platform/board/pmic.c b/platform/board/pmic.c new file mode 100755 index 0000000..a53e561 --- /dev/null +++ b/platform/board/pmic.c @@ -0,0 +1,423 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Implementation of the system controller PMIC interface layer including + * dynamic PMIC handling + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/main.h" +#include "test/common/test.h" +#include "board/pmic.h" + +/* Declare a Global PMIC identifier for dynamic functions */ +uint8_t PMIC_TYPE = PMIC_NONE; + +/* Initialize PMIC_TYPE if not done from board file */ +static sc_err_t get_pmic_type(pmic_id_t id); + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t dynamic_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, + uint32_t vol_mv, uint32_t mode_to_set) +{ + sc_err_t rtn = SC_ERR_NONE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_ERR_FAIL; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_ERR_NONE) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_pmic_set_voltage(id, pmic_reg, vol_mv, + mode_to_set); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_set_voltage(id, pmic_reg, vol_mv, + mode_to_set); + break; + default : + rtn = SC_ERR_NOTFOUND; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t dynamic_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t *vol_mv, + uint32_t mode_to_get) +{ + sc_err_t rtn = SC_ERR_NONE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_ERR_FAIL; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_ERR_NONE) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_pmic_get_voltage(id, pmic_reg, vol_mv, mode_to_get); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_get_voltage(id, pmic_reg, vol_mv, mode_to_get); + break; + default : + rtn = SC_ERR_NOTFOUND; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t dynamic_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode) +{ + sc_err_t rtn = SC_ERR_NONE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_ERR_FAIL; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_ERR_NONE) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_pmic_set_mode(id, pmic_reg, mode); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_set_mode(id, pmic_reg, mode); + break; + default : + rtn = SC_ERR_NOTFOUND; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC Regulator Mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t dynamic_pmic_get_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t *mode) +{ + sc_err_t rtn = SC_ERR_NONE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_ERR_FAIL; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_ERR_NONE) + { + switch (PMIC_TYPE) + { + case PF100 : /* get mode not supported for pf100 */ + rtn = SC_ERR_NOTFOUND; + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_get_mode(id, pmic_reg, mode); + break; + default : + rtn = SC_ERR_NOTFOUND; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Service PMIC IRQ */ +/*--------------------------------------------------------------------------*/ +sc_bool_t dynamic_pmic_irq_service(pmic_id_t id) +{ + sc_bool_t rtn = SC_TRUE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_FALSE; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_TRUE) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_pmic_irq_service(id); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_irq_service(id); + break; + default : + rtn = SC_FALSE; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Access PMIC register */ +/*--------------------------------------------------------------------------*/ +sc_err_t dynamic_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value) +{ + sc_err_t rtn = SC_ERR_NONE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = SC_ERR_FAIL; + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == SC_ERR_NONE) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_pmic_register_access(id, address, read_write, value); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_pmic_register_access(id, address, read_write, value); + break; + default : + rtn = SC_ERR_NOTFOUND; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC version */ +/*--------------------------------------------------------------------------*/ +pmic_version_t dynamic_get_pmic_version(pmic_id_t id) +{ + pmic_version_t rtn = {0, 0}; /* initialize to empty as err return */ + sc_bool_t set = SC_TRUE; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + set = SC_FALSE; + } + } + + /* skip switch statement if PMIC type not detected */ + if (set != SC_FALSE) + { + /* Call specific function based on established PMIC_TYPE */ + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_get_pmic_version(id); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_get_pmic_version(id); + break; + default : + /* default case leaves rtn as empty version */ + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC temperature */ +/*--------------------------------------------------------------------------*/ +uint32_t dynamic_get_pmic_temp(pmic_id_t id) +{ + uint32_t rtn = 0U; + uint32_t default_temp = 25U; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = default_temp; /* default to room temp */ + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == 0U) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_get_pmic_temp(id); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_get_pmic_temp(id); + break; + default : + rtn = default_temp; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Temperature Alarm */ +/*--------------------------------------------------------------------------*/ +uint32_t dynamic_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp) +{ + uint32_t rtn = 0U; + + if (PMIC_TYPE == PMIC_NONE) + { + /* Initialize PMIC_TYPE if not already */ + if(get_pmic_type(id) != SC_ERR_NONE) + { + rtn = temp; /* return temp called with */ + } + } + + /* Call specific function based on established PMIC_TYPE */ + if (rtn == 0U) + { + switch (PMIC_TYPE) + { + case PF100 : + rtn = pf100_set_pmic_temp_alarm(id, temp); + break; + case PF8100 : + case PF8200 : + rtn = pf8100_set_pmic_temp_alarm(id, temp); + break; + default : + rtn = temp; + break; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Determine PMIC type at address */ +/*--------------------------------------------------------------------------*/ +static sc_err_t get_pmic_type(pmic_id_t id) +{ + uint8_t dev_id = pmic_get_device_id(id); + sc_err_t rtn = SC_ERR_NONE; + + switch (dev_id) + { + case PF100_DEV_ID : + PMIC_TYPE = PF100; + break; + case PF8100_DEV_ID : + PMIC_TYPE = PF8100; + break; + case PF8200_DEV_ID : + PMIC_TYPE = PF8200; + break; + default : + PMIC_TYPE = PMIC_NONE; + rtn = SC_ERR_NOTFOUND; + break; + } + + return rtn; +} diff --git a/platform/board/pmic.h b/platform/board/pmic.h new file mode 100755 index 0000000..af77562 --- /dev/null +++ b/platform/board/pmic.h @@ -0,0 +1,249 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * PMIC include for PMIC interface layer. This API is used to abstract the + * PMIC driver. It also supports dynamic PMIC identification and function + * binding (normally only used for dev boards). + * + * @addtogroup pmic_driver + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PMIC_H +#define SC_PMIC_H + +/* Includes */ + +#include "main/main.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/pmic/pf100/fsl_pf100.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" + +/* Defines */ + +/*! + * @name Defines for supported PMIC devices + */ +/** @{ */ +#define PMIC_NONE 0U +#define PF100 1U +#define PF8100 2U +#define PF8200 3U +/** @} */ + +/*! + * @name Defines for PMIC configuration + */ +/** @{ */ +#define PF100_DEV_ID 0x10U +#define PF8100_DEV_ID 0x40U +#define PF8200_DEV_ID 0x48U +#define PF8X00_FAM_ID 0x40U +#define PF7X00_FAM_ID 0x80U +#define PF8100_A0_REV 0x10U +#define FAM_ID_MASK 0xF0U +/** @} */ + +/*! Global PMIC type identifier */ +extern uint8_t PMIC_TYPE; + +/* Table for dynamic PMIC functionality */ +#ifdef PMIC /* Replace function prefix with defined PMIC */ + #define FUNC_PRE(name, function) FUNC_PREPRE(name,function) + #define FUNC_PREPRE(name, function) name ## function + #define PMIC_SET_MODE FUNC_PRE(PMIC, _pmic_set_mode) + #define PMIC_GET_MODE FUNC_PRE(PMIC, _pmic_get_mode) + #define PMIC_SET_VOLTAGE FUNC_PRE(PMIC, _pmic_set_voltage) + #define PMIC_GET_VOLTAGE FUNC_PRE(PMIC, _pmic_get_voltage) + #define PMIC_IRQ_SERVICE FUNC_PRE(PMIC, _pmic_irq_service) + #define PMIC_REGISTER_ACCESS FUNC_PRE(PMIC, _pmic_register_access) + #define GET_PMIC_VERSION FUNC_PRE(PMIC, _get_pmic_version) + #define GET_PMIC_TEMP FUNC_PRE(PMIC, _get_pmic_temp) + #define SET_PMIC_TEMP_ALARM FUNC_PRE(PMIC, _set_pmic_temp_alarm) +#else /* Point MACROS at the dynamic function for run time decision */ + #define PMIC_SET_VOLTAGE dynamic_pmic_set_voltage + #define PMIC_GET_VOLTAGE dynamic_pmic_get_voltage + #define PMIC_SET_MODE dynamic_pmic_set_mode + #define PMIC_GET_MODE dynamic_pmic_get_mode + #define PMIC_IRQ_SERVICE dynamic_pmic_irq_service + #define PMIC_REGISTER_ACCESS dynamic_pmic_register_access + #define GET_PMIC_VERSION dynamic_get_pmic_version + #define GET_PMIC_TEMP dynamic_get_pmic_temp + #define SET_PMIC_TEMP_ALARM dynamic_set_pmic_temp_alarm +#endif + +/*! + * This function sets the voltage of a corresponding voltage regulator for the + * supported PMIC types + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator + * e.g [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[in] vol_mv New voltage setpoint for the regulator in millivolts + * @param[in] mode_to_set Which mode to change setpoint for. Refer to each + * PMIC for valid modes + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t dynamic_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t vol_mv, + uint32_t mode_to_set); + +/*! + * This function gets the voltage on a corresponding voltage regulator of the + * PMIC + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator + * e.g [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[out] vol_mv pointer to return voltage in millivolts + * @param[in] mode_to_get Mode for which to get the voltage. Refer to each + * PMIC for valid modes. + * + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + */ +sc_err_t dynamic_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t *vol_mv, + uint32_t mode_to_get); + +/*! + * This function sets the mode of the specified regulator. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + e.g [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[in] mode mode to set the regulator; Refer to each + * PMIC for valid modes. + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t dynamic_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode); + +/*! + * This function gets the mode of the specified regulator. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + e.g [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[in] mode pointer to return mode in raw hex form + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t dynamic_pmic_get_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t *mode); + +/*! + * This function services the interrupt for the temp alarm + * + * @param[in] id I2C address of PMIC device + * + * @return Returns SC_TRUE if there was a temperature interrupt to be cleared + */ +sc_bool_t dynamic_pmic_irq_service(pmic_id_t id); + +/*! + * This function allows access to individual registers of the PMIC + * + * @param[in] id I2C address of PMIC device + * @param[in] address register address to access + * @param[in] read_write bool indicating read(SC_FALSE/0) or write(SC_TRUE/1) + * @param[in,out] value value to read or to set + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + */ +sc_err_t dynamic_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value); + +/*! + * This function returns the device ID and revision for the PMIC. + * + * @param[in] id I2C address of PMIC device + * + * @return Returns a structure with the device ID and revision. + */ +pmic_version_t dynamic_get_pmic_version(pmic_id_t id); + +/*! + * This function gets the current PMIC temperature as sensed by the + * PMIC temperature sensor. + * + * @param[in] id I2C address of PMIC device + * + * @return returns the temp sensed by the PMIC in a UINT32 in Celsius + * + * Note: Refer to Refer to each PMIC for temperature details + * + * Return errors: + * - SC_ERR_CONFIG if temperature monitor is not enabled + * + */ +uint32_t dynamic_get_pmic_temp(pmic_id_t id); + +/*! + * This function sets the temp alarm for the PMIC in Celsius + * + * @param[in] id I2C address of PMIC device + * @param[in] temp Temperature to set the alarm + * + * Note: Refer to Refer to each PMIC for temperature details + * + * @return Returns the temperature that the alarm is set to in Celsius + */ + uint32_t dynamic_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp); + + /** @} */ + + #endif /* SC_PMIC_H */ + diff --git a/platform/config/config.h b/platform/config/config.h new file mode 100755 index 0000000..0be26d3 --- /dev/null +++ b/platform/config/config.h @@ -0,0 +1,118 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure the top-level SCFW. + * + */ +/*==========================================================================*/ + +#ifndef SC_CONFIG_H +#define SC_CONFIG_H + +/* Includes */ + +#include "main/debug.h" +#include "soc.h" +#include "board.h" +#include "pads.h" +#include "pad_data.h" + +/* Test Switches */ + +#if DEBUG_LEVEL > 1 + #define HAS_CHECK_CONFIG +#endif +#if 0 + #define HAS_TEST_PTIM + #define HAS_TEST_PCNT +#endif + +/* Hardware Switches */ + +#define HAS_XRDC_HW +#define HAS_PAD_HW + +/* Configure Debugging & Profiling */ + +#ifdef SIMU + #define TEST_PROF_THRESH_NS 2000U +#else + #define TEST_PROF_THRESH_NS 10000U +#endif + +/* Configure Addressing */ + +#define SC_SADDR_W 32U + +typedef uintptr_t sc_saddr_t; + +/* Configure System Controller */ + +#define SC_PT 0U +#define SC_DID 2U +#define SECO_PT 2U +#define SECO_DID 1U +#define BOOT_PT 1U +#define BOOT_DID 0U +#define SC_STATIC_PT 0U +#define SC_STATIC_DID 2U +#define SC_BYPASS_SID 0U +#define SC_SA SC_RM_SPA_ASSERT +#define SC_PA SC_RM_SPA_PASSTHRU +#define SC_MAX_SS_CLKS 32U + +/* Configure IPC */ + +#define SC_IPC_LOOPBACK SC_IPC_AP_CH0 + +/* Configure Resource Manager */ + +#define SC_RM_IDX_W 16U //!< Width of sc_rm_idx_t +typedef uint16_t sc_rm_idx_t; //!< Unified resource index + +#define SC_RMS_IDX_W 8U //!< Width of sc_rms_idx_t +typedef uint8_t sc_rms_idx_t; //!< Unified small resource index + +#define SC_RM_MATCH_W 16U //!< Width of sc_rm_match_t +typedef uint16_t sc_rm_match_t; //!< RDC match value + +#define SC_RM_SID_MASK 0x3FU //!< Mask for StreamID + +#endif /* SC_CONFIG_H */ + diff --git a/platform/config/mx8dxl/ALL/has_ss.h b/platform/config/mx8dxl/ALL/has_ss.h new file mode 100755 index 0000000..c30fe45 --- /dev/null +++ b/platform/config/mx8dxl/ALL/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 0 +#define HAS_SS_CCI 0 +#define HAS_SS_AP_0 0 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 1 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 0 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 0 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 1 +#define HAS_SS_DMA 0 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 0 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 0 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 0 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 0 +#define HAS_SS_MIPI_1 0 +#define HAS_SS_V2X 1 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8dxl/CORES/has_ss.h b/platform/config/mx8dxl/CORES/has_ss.h new file mode 100755 index 0000000..c30fe45 --- /dev/null +++ b/platform/config/mx8dxl/CORES/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 0 +#define HAS_SS_CCI 0 +#define HAS_SS_AP_0 0 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 1 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 0 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 0 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 1 +#define HAS_SS_DMA 0 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 0 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 0 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 0 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 0 +#define HAS_SS_MIPI_1 0 +#define HAS_SS_V2X 1 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8dxl/iomuxd.h b/platform/config/mx8dxl/iomuxd.h new file mode 100755 index 0000000..19f8511 --- /dev/null +++ b/platform/config/mx8dxl/iomuxd.h @@ -0,0 +1,197 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef IOMUXD_H +#define IOMUXD_H + + +#ifndef IOMUXD_REG_BASE + #ifdef SCU_RESOURCES + #define IOMUXD_REG_BASE 0x41F80000U + #else + #define IOMUXD_REG_BASE 0x33F80000U + #endif +#endif + + // NUM RING GROUP PAD | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +#define IOMUXD__PCIE_CTRL0_PERST_B REG32(IOMUXD_REG_BASE+0x00000000U) // 0 0 0 0 | HSIO.PCIE0.PERST_B | | | | LSIO.GPIO4.IO00 | LSIO.GPIO7.IO00 | | | | +#define IOMUXD__PCIE_CTRL0_CLKREQ_B REG32(IOMUXD_REG_BASE+0x00000040U) // 0 0 0 1 | HSIO.PCIE0.CLKREQ_B | | | | LSIO.GPIO4.IO01 | LSIO.GPIO7.IO01 | | | | +#define IOMUXD__PCIE_CTRL0_WAKE_B REG32(IOMUXD_REG_BASE+0x00000080U) // 0 0 0 2 | HSIO.PCIE0.WAKE_B | | | | LSIO.GPIO4.IO02 | LSIO.GPIO7.IO02 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_PCIESEP REG32(IOMUXD_REG_BASE+0x000000C0U) // 0 0 0 3 | | | | | | | | | | +#define IOMUXD__USB_SS3_TC0 REG32(IOMUXD_REG_BASE+0x00020000U) // 1 1 0 0 | ADMA.I2C1.SCL | CONN.USB_OTG1.PWR | CONN.USB_OTG2.PWR | | LSIO.GPIO4.IO03 | LSIO.GPIO7.IO03 | | | | +#define IOMUXD__USB_SS3_TC1 REG32(IOMUXD_REG_BASE+0x00020040U) // 1 1 0 1 | ADMA.I2C1.SCL | CONN.USB_OTG2.PWR | | | LSIO.GPIO4.IO04 | LSIO.GPIO7.IO04 | | | | +#define IOMUXD__USB_SS3_TC2 REG32(IOMUXD_REG_BASE+0x00020080U) // 1 1 0 2 | ADMA.I2C1.SDA | CONN.USB_OTG1.OC | CONN.USB_OTG2.OC | | LSIO.GPIO4.IO05 | LSIO.GPIO7.IO05 | | | | +#define IOMUXD__USB_SS3_TC3 REG32(IOMUXD_REG_BASE+0x000200C0U) // 1 1 0 3 | ADMA.I2C1.SDA | CONN.USB_OTG2.OC | | | LSIO.GPIO4.IO06 | LSIO.GPIO7.IO06 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_USB3IO REG32(IOMUXD_REG_BASE+0x00020100U) // 1 1 0 4 | | | | | | | | | | +#define IOMUXD__EMMC0_CLK REG32(IOMUXD_REG_BASE+0x00020140U) // 1 1 0 5 | CONN.EMMC0.CLK | CONN.NAND.READY_B | | | LSIO.GPIO4.IO07 | | | | | +#define IOMUXD__EMMC0_CMD REG32(IOMUXD_REG_BASE+0x00020180U) // 1 1 0 6 | CONN.EMMC0.CMD | CONN.NAND.DQS | | | LSIO.GPIO4.IO08 | | | | | +#define IOMUXD__EMMC0_DATA0 REG32(IOMUXD_REG_BASE+0x000201C0U) // 1 1 0 7 | CONN.EMMC0.DATA0 | CONN.NAND.DATA00 | | | LSIO.GPIO4.IO09 | | | | | +#define IOMUXD__EMMC0_DATA1 REG32(IOMUXD_REG_BASE+0x00020200U) // 1 1 0 8 | CONN.EMMC0.DATA1 | CONN.NAND.DATA01 | | | LSIO.GPIO4.IO10 | | | | | +#define IOMUXD__EMMC0_DATA2 REG32(IOMUXD_REG_BASE+0x00020240U) // 1 1 0 9 | CONN.EMMC0.DATA2 | CONN.NAND.DATA02 | | | LSIO.GPIO4.IO11 | | | | | +#define IOMUXD__EMMC0_DATA3 REG32(IOMUXD_REG_BASE+0x00020280U) // 1 1 0 10 | CONN.EMMC0.DATA3 | CONN.NAND.DATA03 | | | LSIO.GPIO4.IO12 | | | | | +#define IOMUXD__EMMC0_DATA4 REG32(IOMUXD_REG_BASE+0x000202C0U) // 1 1 0 11 | CONN.EMMC0.DATA4 | CONN.NAND.DATA04 | | | LSIO.GPIO4.IO13 | | | | | +#define IOMUXD__EMMC0_DATA5 REG32(IOMUXD_REG_BASE+0x00020300U) // 1 1 0 12 | CONN.EMMC0.DATA5 | CONN.NAND.DATA05 | | | LSIO.GPIO4.IO14 | | | | | +#define IOMUXD__EMMC0_DATA6 REG32(IOMUXD_REG_BASE+0x00020340U) // 1 1 0 13 | CONN.EMMC0.DATA6 | CONN.NAND.DATA06 | | | LSIO.GPIO4.IO15 | | | | | +#define IOMUXD__EMMC0_DATA7 REG32(IOMUXD_REG_BASE+0x00020380U) // 1 1 0 14 | CONN.EMMC0.DATA7 | CONN.NAND.DATA07 | | | LSIO.GPIO4.IO16 | | | | | +#define IOMUXD__EMMC0_STROBE REG32(IOMUXD_REG_BASE+0x000203C0U) // 1 1 0 15 | CONN.EMMC0.STROBE | CONN.NAND.CLE | | | LSIO.GPIO4.IO17 | | | | | +#define IOMUXD__EMMC0_RESET_B REG32(IOMUXD_REG_BASE+0x00021000U) // 2 1 1 0 | CONN.EMMC0.RESET_B | CONN.NAND.WP_B | | | LSIO.GPIO4.IO18 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SD1FIX0 REG32(IOMUXD_REG_BASE+0x00021040U) // 2 1 1 1 | | | | | | | | | | +#define IOMUXD__USDHC1_RESET_B REG32(IOMUXD_REG_BASE+0x00021080U) // 2 1 1 2 | CONN.USDHC1.RESET_B | CONN.NAND.RE_N | ADMA.SPI2.SCK | CONN.NAND.WE_B | LSIO.GPIO4.IO19 | LSIO.GPIO7.IO08 | | | | +#define IOMUXD__USDHC1_VSELECT REG32(IOMUXD_REG_BASE+0x000210C0U) // 2 1 1 3 | CONN.USDHC1.VSELECT | CONN.NAND.RE_P | ADMA.SPI2.SDO | CONN.NAND.RE_B | LSIO.GPIO4.IO20 | LSIO.GPIO7.IO09 | | | | +#define IOMUXD__IOMUXD_CTL_NAND_RE_P_N REG32(IOMUXD_REG_BASE+0x00021100U) // 2 1 1 4 | | | | | | | | | | +#define IOMUXD__USDHC1_WP REG32(IOMUXD_REG_BASE+0x00021140U) // 2 1 1 5 | CONN.USDHC1.WP | CONN.NAND.DQS_N | ADMA.SPI2.SDI | CONN.NAND.ALE | LSIO.GPIO4.IO21 | LSIO.GPIO7.IO10 | | | | +#define IOMUXD__USDHC1_CD_B REG32(IOMUXD_REG_BASE+0x00021180U) // 2 1 1 6 | CONN.USDHC1.CD_B | CONN.NAND.DQS_P | ADMA.SPI2.CS0 | CONN.NAND.DQS | LSIO.GPIO4.IO22 | LSIO.GPIO7.IO11 | | | | +#define IOMUXD__IOMUXD_CTL_NAND_DQS_P_N REG32(IOMUXD_REG_BASE+0x000211C0U) // 2 1 1 7 | | | | | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSELSEP REG32(IOMUXD_REG_BASE+0x00021200U) // 2 1 1 8 | | | | | | | | | | +#define IOMUXD__ENET0_RGMII_TXC REG32(IOMUXD_REG_BASE+0x00021240U) // 2 1 1 9 | CONN.ENET0.RGMII_TXC | CONN.ENET0.RCLK50M_OUT | CONN.ENET0.RCLK50M_IN | CONN.NAND.CE1_B | LSIO.GPIO4.IO29 | CONN.USDHC2.CLK | | | | +#define IOMUXD__ENET0_RGMII_TX_CTL REG32(IOMUXD_REG_BASE+0x00021280U) // 2 1 1 10 | CONN.ENET0.RGMII_TX_CTL | | | CONN.USDHC1.RESET_B | LSIO.GPIO4.IO30 | CONN.USDHC2.CMD | | | | +#define IOMUXD__ENET0_RGMII_TXD0 REG32(IOMUXD_REG_BASE+0x000212C0U) // 2 1 1 11 | CONN.ENET0.RGMII_TXD0 | | | CONN.USDHC1.VSELECT | LSIO.GPIO4.IO31 | CONN.USDHC2.DATA0 | | | | +#define IOMUXD__ENET0_RGMII_TXD1 REG32(IOMUXD_REG_BASE+0x00021300U) // 2 1 1 12 | CONN.ENET0.RGMII_TXD1 | | | CONN.USDHC1.WP | LSIO.GPIO5.IO00 | CONN.USDHC2.DATA1 | | | | +#define IOMUXD__ENET0_RGMII_TXD2 REG32(IOMUXD_REG_BASE+0x00021340U) // 2 1 1 13 | CONN.ENET0.RGMII_TXD2 | | CONN.NAND.CE0_B | CONN.USDHC1.CD_B | LSIO.GPIO5.IO01 | CONN.USDHC2.DATA2 | | | | +#define IOMUXD__ENET0_RGMII_TXD3 REG32(IOMUXD_REG_BASE+0x00021380U) // 2 1 1 14 | CONN.ENET0.RGMII_TXD3 | | CONN.NAND.RE_B | | LSIO.GPIO5.IO02 | CONN.USDHC2.DATA3 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB0 REG32(IOMUXD_REG_BASE+0x000213C0U) // 2 1 1 15 | | | | | | | | | | +#define IOMUXD__ENET0_RGMII_RXC REG32(IOMUXD_REG_BASE+0x00022000U) // 3 1 2 0 | CONN.ENET0.RGMII_RXC | | CONN.NAND.WE_B | CONN.USDHC1.CLK | LSIO.GPIO5.IO03 | | | | | +#define IOMUXD__ENET0_RGMII_RX_CTL REG32(IOMUXD_REG_BASE+0x00022040U) // 3 1 2 1 | CONN.ENET0.RGMII_RX_CTL | | | CONN.USDHC1.CMD | LSIO.GPIO5.IO04 | | | | | +#define IOMUXD__ENET0_RGMII_RXD0 REG32(IOMUXD_REG_BASE+0x00022080U) // 3 1 2 2 | CONN.ENET0.RGMII_RXD0 | | | CONN.USDHC1.DATA0 | LSIO.GPIO5.IO05 | | | | | +#define IOMUXD__ENET0_RGMII_RXD1 REG32(IOMUXD_REG_BASE+0x000220C0U) // 3 1 2 3 | CONN.ENET0.RGMII_RXD1 | | | CONN.USDHC1.DATA1 | LSIO.GPIO5.IO06 | | | | | +#define IOMUXD__ENET0_RGMII_RXD2 REG32(IOMUXD_REG_BASE+0x00022100U) // 3 1 2 4 | CONN.ENET0.RGMII_RXD2 | CONN.ENET0.RMII_RX_ER | | CONN.USDHC1.DATA2 | LSIO.GPIO5.IO07 | | | | | +#define IOMUXD__ENET0_RGMII_RXD3 REG32(IOMUXD_REG_BASE+0x00022140U) // 3 1 2 5 | CONN.ENET0.RGMII_RXD3 | | CONN.NAND.ALE | CONN.USDHC1.DATA3 | LSIO.GPIO5.IO08 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB1 REG32(IOMUXD_REG_BASE+0x00022180U) // 3 1 2 6 | | | | | | | | | | +#define IOMUXD__ENET0_REFCLK_125M_25M REG32(IOMUXD_REG_BASE+0x000221C0U) // 3 1 2 7 | CONN.ENET0.REFCLK_125M_25M | CONN.ENET0.PPS | CONN.EQOS.PPS_IN | CONN.EQOS.PPS_OUT | LSIO.GPIO5.IO09 | | | | | +#define IOMUXD__ENET0_MDIO REG32(IOMUXD_REG_BASE+0x00022200U) // 3 1 2 8 | CONN.ENET0.MDIO | ADMA.I2C3.SDA | CONN.EQOS.MDIO | | LSIO.GPIO5.IO10 | LSIO.GPIO7.IO16 | | | | +#define IOMUXD__ENET0_MDC REG32(IOMUXD_REG_BASE+0x00022240U) // 3 1 2 9 | CONN.ENET0.MDC | ADMA.I2C3.SCL | CONN.EQOS.MDC | | LSIO.GPIO5.IO11 | LSIO.GPIO7.IO17 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOCT REG32(IOMUXD_REG_BASE+0x00022280U) // 3 1 2 10 | | | | | | | | | | +#define IOMUXD__ENET1_RGMII_TXC REG32(IOMUXD_REG_BASE+0x00023000U) // 4 1 3 0 | LSIO.GPIO0.IO00 | CONN.EQOS.RCLK50M_OUT | ADMA.LCDIF.D00 | CONN.EQOS.RGMII_TXC | CONN.EQOS.RCLK50M_IN | | | | | +#define IOMUXD__ENET1_RGMII_TXD2 REG32(IOMUXD_REG_BASE+0x00023040U) // 4 1 3 1 | | | ADMA.LCDIF.D01 | CONN.EQOS.RGMII_TXD2 | LSIO.GPIO0.IO01 | | | | | +#define IOMUXD__ENET1_RGMII_TX_CTL REG32(IOMUXD_REG_BASE+0x00023080U) // 4 1 3 2 | | | ADMA.LCDIF.D02 | CONN.EQOS.RGMII_TX_CTL | LSIO.GPIO0.IO02 | | | | | +#define IOMUXD__ENET1_RGMII_TXD3 REG32(IOMUXD_REG_BASE+0x000230C0U) // 4 1 3 3 | | | ADMA.LCDIF.D03 | CONN.EQOS.RGMII_TXD3 | LSIO.GPIO0.IO03 | | | | | +#define IOMUXD__ENET1_RGMII_RXC REG32(IOMUXD_REG_BASE+0x00023100U) // 4 1 3 4 | | | ADMA.LCDIF.D04 | CONN.EQOS.RGMII_RXC | LSIO.GPIO0.IO04 | | | | | +#define IOMUXD__ENET1_RGMII_RXD3 REG32(IOMUXD_REG_BASE+0x00023140U) // 4 1 3 5 | | | ADMA.LCDIF.D05 | CONN.EQOS.RGMII_RXD3 | LSIO.GPIO0.IO05 | | | | | +#define IOMUXD__ENET1_RGMII_RXD2 REG32(IOMUXD_REG_BASE+0x00023180U) // 4 1 3 6 | | | ADMA.LCDIF.D06 | CONN.EQOS.RGMII_RXD2 | LSIO.GPIO0.IO06 | LSIO.GPIO6.IO00 | | | | +#define IOMUXD__ENET1_RGMII_RXD1 REG32(IOMUXD_REG_BASE+0x000231C0U) // 4 1 3 7 | | | ADMA.LCDIF.D07 | CONN.EQOS.RGMII_RXD1 | LSIO.GPIO0.IO07 | LSIO.GPIO6.IO01 | | | | +#define IOMUXD__ENET1_RGMII_TXD0 REG32(IOMUXD_REG_BASE+0x00023200U) // 4 1 3 8 | | | ADMA.LCDIF.D08 | CONN.EQOS.RGMII_TXD0 | LSIO.GPIO0.IO08 | LSIO.GPIO6.IO02 | | | | +#define IOMUXD__ENET1_RGMII_TXD1 REG32(IOMUXD_REG_BASE+0x00023240U) // 4 1 3 9 | | | ADMA.LCDIF.D09 | CONN.EQOS.RGMII_TXD1 | LSIO.GPIO0.IO09 | LSIO.GPIO6.IO03 | | | | +#define IOMUXD__ENET1_RGMII_RXD0 REG32(IOMUXD_REG_BASE+0x00023280U) // 4 1 3 10 | ADMA.SPDIF0.RX | ADMA.MQS.R | ADMA.LCDIF.D10 | CONN.EQOS.RGMII_RXD0 | LSIO.GPIO0.IO10 | LSIO.GPIO6.IO04 | | | | +#define IOMUXD__ENET1_RGMII_RX_CTL REG32(IOMUXD_REG_BASE+0x000232C0U) // 4 1 3 11 | ADMA.SPDIF0.TX | ADMA.MQS.L | ADMA.LCDIF.D11 | CONN.EQOS.RGMII_RX_CTL | LSIO.GPIO0.IO11 | LSIO.GPIO6.IO05 | | | | +#define IOMUXD__ENET1_REFCLK_125M_25M REG32(IOMUXD_REG_BASE+0x00023300U) // 4 1 3 12 | ADMA.SPDIF0.EXT_CLK | | ADMA.LCDIF.D12 | CONN.EQOS.REFCLK_125M_25M | LSIO.GPIO0.IO12 | LSIO.GPIO6.IO06 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHB REG32(IOMUXD_REG_BASE+0x00023340U) // 4 1 3 13 | | | | | | | | | | +#define IOMUXD__SPI3_SCK REG32(IOMUXD_REG_BASE+0x00040000U) // 5 2 0 0 | ADMA.SPI3.SCK | | ADMA.LCDIF.D13 | | LSIO.GPIO0.IO13 | ADMA.LCDIF.D00 | | | | +#define IOMUXD__SPI3_SDO REG32(IOMUXD_REG_BASE+0x00040040U) // 5 2 0 1 | ADMA.SPI3.SDO | | ADMA.LCDIF.D14 | | LSIO.GPIO0.IO14 | ADMA.LCDIF.D01 | | | | +#define IOMUXD__SPI3_SDI REG32(IOMUXD_REG_BASE+0x00040080U) // 5 2 0 2 | ADMA.SPI3.SDI | | ADMA.LCDIF.D15 | | LSIO.GPIO0.IO15 | ADMA.LCDIF.D02 | | | | +#define IOMUXD__SPI3_CS0 REG32(IOMUXD_REG_BASE+0x000400C0U) // 5 2 0 3 | ADMA.SPI3.CS0 | ADMA.ACM.MCLK_OUT1 | ADMA.LCDIF.HSYNC | | LSIO.GPIO0.IO16 | ADMA.LCDIF.CS | | | | +#define IOMUXD__SPI3_CS1 REG32(IOMUXD_REG_BASE+0x00040100U) // 5 2 0 4 | ADMA.SPI3.CS1 | ADMA.I2C3.SCL | ADMA.LCDIF.RESET | ADMA.SPI2.CS0 | ADMA.LCDIF.D16 | ADMA.LCDIF.RD_E | | | | +#define IOMUXD__MCLK_IN1 REG32(IOMUXD_REG_BASE+0x00040140U) // 5 2 0 5 | ADMA.ACM.MCLK_IN1 | ADMA.I2C3.SDA | ADMA.LCDIF.EN | ADMA.SPI2.SCK | ADMA.LCDIF.D17 | ADMA.LCDIF.D03 | | | | +#define IOMUXD__MCLK_IN0 REG32(IOMUXD_REG_BASE+0x00040180U) // 5 2 0 6 | ADMA.ACM.MCLK_IN0 | | ADMA.LCDIF.VSYNC | ADMA.SPI2.SDI | LSIO.GPIO0.IO19 | ADMA.LCDIF.RS | | | | +#define IOMUXD__MCLK_OUT0 REG32(IOMUXD_REG_BASE+0x000401C0U) // 5 2 0 7 | ADMA.ACM.MCLK_OUT0 | | ADMA.LCDIF.CLK | ADMA.SPI2.SDO | LSIO.GPIO0.IO20 | ADMA.LCDIF.WR_RWN | | | | +#define IOMUXD__UART1_TX REG32(IOMUXD_REG_BASE+0x00040200U) // 5 2 0 8 | ADMA.UART1.TX | LSIO.PWM0.OUT | LSIO.GPT0.CAPTURE | | LSIO.GPIO0.IO21 | ADMA.LCDIF.D04 | | | | +#define IOMUXD__UART1_RX REG32(IOMUXD_REG_BASE+0x00040240U) // 5 2 0 9 | ADMA.UART1.RX | LSIO.PWM1.OUT | LSIO.GPT0.COMPARE | LSIO.GPT1.CLK | LSIO.GPIO0.IO22 | ADMA.LCDIF.D05 | | | | +#define IOMUXD__UART1_RTS_B REG32(IOMUXD_REG_BASE+0x00040280U) // 5 2 0 10 | ADMA.UART1.RTS_B | LSIO.PWM2.OUT | ADMA.LCDIF.D16 | LSIO.GPT1.CAPTURE | LSIO.GPT0.CLK | ADMA.LCDIF.D06 | | | | +#define IOMUXD__UART1_CTS_B REG32(IOMUXD_REG_BASE+0x000402C0U) // 5 2 0 11 | ADMA.UART1.CTS_B | LSIO.PWM3.OUT | ADMA.LCDIF.D17 | LSIO.GPT1.COMPARE | LSIO.GPIO0.IO24 | ADMA.LCDIF.D07 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHK REG32(IOMUXD_REG_BASE+0x00040300U) // 5 2 0 12 | | | | | | | | | | +#define IOMUXD__SPI0_SCK REG32(IOMUXD_REG_BASE+0x00040340U) // 5 2 0 13 | ADMA.SPI0.SCK | ADMA.SAI0.TXC | M40.I2C0.SCL | M40.GPIO0.IO00 | LSIO.GPIO1.IO04 | ADMA.LCDIF.D08 | | | | +#define IOMUXD__SPI0_SDI REG32(IOMUXD_REG_BASE+0x00040380U) // 5 2 0 14 | ADMA.SPI0.SDI | ADMA.SAI0.TXD | M40.TPM0.CH0 | M40.GPIO0.IO02 | LSIO.GPIO1.IO05 | ADMA.LCDIF.D09 | | | | +#define IOMUXD__SPI0_SDO REG32(IOMUXD_REG_BASE+0x000403C0U) // 5 2 0 15 | ADMA.SPI0.SDO | ADMA.SAI0.TXFS | M40.I2C0.SDA | M40.GPIO0.IO01 | LSIO.GPIO1.IO06 | ADMA.LCDIF.D10 | | | | +#define IOMUXD__SPI0_CS1 REG32(IOMUXD_REG_BASE+0x00041000U) // 6 2 1 0 | ADMA.SPI0.CS1 | ADMA.SAI0.RXC | ADMA.SAI1.TXD | ADMA.LCD_PWM0.OUT | LSIO.GPIO1.IO07 | ADMA.LCDIF.D11 | | | | +#define IOMUXD__SPI0_CS0 REG32(IOMUXD_REG_BASE+0x00041040U) // 6 2 1 1 | ADMA.SPI0.CS0 | ADMA.SAI0.RXD | M40.TPM0.CH1 | M40.GPIO0.IO03 | LSIO.GPIO1.IO08 | ADMA.LCDIF.D12 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHT REG32(IOMUXD_REG_BASE+0x00041080U) // 6 2 1 2 | | | | | | | | | | +#define IOMUXD__ADC_IN1 REG32(IOMUXD_REG_BASE+0x000410C0U) // 6 2 1 3 | ADMA.ADC.IN1 | M40.I2C0.SDA | M40.GPIO0.IO01 | ADMA.I2C0.SDA | LSIO.GPIO1.IO09 | ADMA.LCDIF.D13 | | | | +#define IOMUXD__ADC_IN0 REG32(IOMUXD_REG_BASE+0x00041100U) // 6 2 1 4 | ADMA.ADC.IN0 | M40.I2C0.SCL | M40.GPIO0.IO00 | ADMA.I2C0.SCL | LSIO.GPIO1.IO10 | ADMA.LCDIF.D14 | | | | +#define IOMUXD__ADC_IN3 REG32(IOMUXD_REG_BASE+0x00041140U) // 6 2 1 5 | ADMA.ADC.IN3 | M40.UART0.TX | M40.GPIO0.IO03 | ADMA.ACM.MCLK_OUT0 | LSIO.GPIO1.IO11 | ADMA.LCDIF.D15 | | | | +#define IOMUXD__ADC_IN2 REG32(IOMUXD_REG_BASE+0x00041180U) // 6 2 1 6 | ADMA.ADC.IN2 | M40.UART0.RX | M40.GPIO0.IO02 | ADMA.ACM.MCLK_IN0 | LSIO.GPIO1.IO12 | ADMA.LCDIF.D16 | | | | +#define IOMUXD__ADC_IN5 REG32(IOMUXD_REG_BASE+0x000411C0U) // 6 2 1 7 | ADMA.ADC.IN5 | M40.TPM0.CH1 | M40.GPIO0.IO05 | ADMA.LCDIF.LCDBUSY | LSIO.GPIO1.IO13 | ADMA.LCDIF.D17 | | | | +#define IOMUXD__ADC_IN4 REG32(IOMUXD_REG_BASE+0x00041200U) // 6 2 1 8 | ADMA.ADC.IN4 | M40.TPM0.CH0 | M40.GPIO0.IO04 | ADMA.LCDIF.LCDRESET | LSIO.GPIO1.IO14 | | | | | +#define IOMUXD__FLEXCAN0_RX REG32(IOMUXD_REG_BASE+0x00041240U) // 6 2 1 9 | ADMA.FLEXCAN0.RX | ADMA.SAI2.RXC | ADMA.UART0.RTS_B | ADMA.SAI1.TXC | LSIO.GPIO1.IO15 | LSIO.GPIO6.IO08 | | | | +#define IOMUXD__FLEXCAN0_TX REG32(IOMUXD_REG_BASE+0x00041280U) // 6 2 1 10 | ADMA.FLEXCAN0.TX | ADMA.SAI2.RXD | ADMA.UART0.CTS_B | ADMA.SAI1.TXFS | LSIO.GPIO1.IO16 | LSIO.GPIO6.IO09 | | | | +#define IOMUXD__FLEXCAN1_RX REG32(IOMUXD_REG_BASE+0x000412C0U) // 6 2 1 11 | ADMA.FLEXCAN1.RX | ADMA.SAI2.RXFS | ADMA.FTM.CH2 | ADMA.SAI1.TXD | LSIO.GPIO1.IO17 | LSIO.GPIO6.IO10 | | | | +#define IOMUXD__FLEXCAN1_TX REG32(IOMUXD_REG_BASE+0x00041300U) // 6 2 1 12 | ADMA.FLEXCAN1.TX | ADMA.SAI3.RXC | ADMA.DMA0.REQ_IN0 | ADMA.SAI1.RXD | LSIO.GPIO1.IO18 | LSIO.GPIO6.IO11 | | | | +#define IOMUXD__FLEXCAN2_RX REG32(IOMUXD_REG_BASE+0x00041340U) // 6 2 1 13 | ADMA.FLEXCAN2.RX | ADMA.SAI3.RXD | ADMA.UART3.RX | ADMA.SAI1.RXFS | LSIO.GPIO1.IO19 | LSIO.GPIO6.IO12 | | | | +#define IOMUXD__FLEXCAN2_TX REG32(IOMUXD_REG_BASE+0x00041380U) // 6 2 1 14 | ADMA.FLEXCAN2.TX | ADMA.SAI3.RXFS | ADMA.UART3.TX | ADMA.SAI1.RXC | LSIO.GPIO1.IO20 | LSIO.GPIO6.IO13 | | | | +#define IOMUXD__UART0_RX REG32(IOMUXD_REG_BASE+0x000413C0U) // 6 2 1 15 | ADMA.UART0.RX | ADMA.MQS.R | ADMA.FLEXCAN0.RX | SCU.UART0.RX | LSIO.GPIO1.IO21 | LSIO.GPIO6.IO14 | | | | +#define IOMUXD__UART0_TX REG32(IOMUXD_REG_BASE+0x00042000U) // 7 2 2 0 | ADMA.UART0.TX | ADMA.MQS.L | ADMA.FLEXCAN0.TX | SCU.UART0.TX | LSIO.GPIO1.IO22 | LSIO.GPIO6.IO15 | | | | +#define IOMUXD__UART2_TX REG32(IOMUXD_REG_BASE+0x00042040U) // 7 2 2 1 | ADMA.UART2.TX | ADMA.FTM.CH1 | ADMA.FLEXCAN1.TX | | LSIO.GPIO1.IO23 | LSIO.GPIO6.IO16 | | | | +#define IOMUXD__UART2_RX REG32(IOMUXD_REG_BASE+0x00042080U) // 7 2 2 2 | ADMA.UART2.RX | ADMA.FTM.CH0 | ADMA.FLEXCAN1.RX | | LSIO.GPIO1.IO24 | LSIO.GPIO6.IO17 | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLH REG32(IOMUXD_REG_BASE+0x000420C0U) // 7 2 2 3 | | | | | | | | | | +#define IOMUXD__JTAG_TRST_B REG32(IOMUXD_REG_BASE+0x00042100U) // 7 2 2 4 | SCU.JTAG.TRST_B | SCU.WDOG0.WDOG_OUT | | | | | | | | +#define IOMUXD__PMIC_I2C_SCL REG32(IOMUXD_REG_BASE+0x00042140U) // 7 2 2 5 | SCU.PMIC_I2C.SCL | SCU.GPIO0.IOXX_PMIC_A35_ON | | | LSIO.GPIO2.IO01 | | | | | +#define IOMUXD__PMIC_I2C_SDA REG32(IOMUXD_REG_BASE+0x00042180U) // 7 2 2 6 | SCU.PMIC_I2C.SDA | SCU.GPIO0.IOXX_PMIC_GPU_ON | | | LSIO.GPIO2.IO02 | | | | | +#define IOMUXD__PMIC_INT_B REG32(IOMUXD_REG_BASE+0x000421C0U) // 7 2 2 7 | SCU.DSC.PMIC_INT_B | | | | | | | | | +#define IOMUXD__SCU_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00042200U) // 7 2 2 8 | SCU.GPIO0.IO00 | SCU.UART0.RX | M40.UART0.RX | ADMA.UART3.RX | LSIO.GPIO2.IO03 | | | | | +#define IOMUXD__SCU_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00042240U) // 7 2 2 9 | SCU.GPIO0.IO01 | SCU.UART0.TX | M40.UART0.TX | ADMA.UART3.TX | SCU.WDOG0.WDOG_OUT | | | | | +#define IOMUXD__SCU_PMIC_STANDBY REG32(IOMUXD_REG_BASE+0x00042280U) // 7 2 2 10 | SCU.DSC.PMIC_STANDBY | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE1 REG32(IOMUXD_REG_BASE+0x000422C0U) // 7 2 2 11 | SCU.DSC.BOOT_MODE1 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE0 REG32(IOMUXD_REG_BASE+0x00042300U) // 7 2 2 12 | SCU.DSC.BOOT_MODE0 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE2 REG32(IOMUXD_REG_BASE+0x00042340U) // 7 2 2 13 | SCU.DSC.BOOT_MODE2 | SCU.DSC.RTC_CLOCK_OUTPUT_32K | | | | | | | | +#define IOMUXD__SNVS_TAMPER_OUT1 REG32(IOMUXD_REG_BASE+0x00060000U) // 8 3 0 0 | | | | | LSIO.GPIO2.IO05_IN | LSIO.GPIO6.IO19_IN | | | | +#define IOMUXD__SNVS_TAMPER_OUT2 REG32(IOMUXD_REG_BASE+0x00060040U) // 8 3 0 1 | | | | | LSIO.GPIO2.IO06_IN | LSIO.GPIO6.IO20_IN | | | | +#define IOMUXD__SNVS_TAMPER_OUT3 REG32(IOMUXD_REG_BASE+0x00060080U) // 8 3 0 2 | | | ADMA.SAI2.RXC | | LSIO.GPIO2.IO07_IN | LSIO.GPIO6.IO21_IN | | | | +#define IOMUXD__SNVS_TAMPER_OUT4 REG32(IOMUXD_REG_BASE+0x000600C0U) // 8 3 0 3 | | | ADMA.SAI2.RXD | | LSIO.GPIO2.IO08_IN | LSIO.GPIO6.IO22_IN | | | | +#define IOMUXD__SNVS_TAMPER_IN0 REG32(IOMUXD_REG_BASE+0x00060100U) // 8 3 0 4 | | | ADMA.SAI2.RXFS | | LSIO.GPIO2.IO09_IN | LSIO.GPIO6.IO23_IN | | | | +#define IOMUXD__SNVS_TAMPER_IN1 REG32(IOMUXD_REG_BASE+0x00060140U) // 8 3 0 5 | | | ADMA.SAI3.RXC | | LSIO.GPIO2.IO10_IN | LSIO.GPIO6.IO24_IN | | | | +#define IOMUXD__SNVS_TAMPER_IN2 REG32(IOMUXD_REG_BASE+0x00060180U) // 8 3 0 6 | | | ADMA.SAI3.RXD | | LSIO.GPIO2.IO11_IN | LSIO.GPIO6.IO25_IN | | | | +#define IOMUXD__SNVS_TAMPER_IN3 REG32(IOMUXD_REG_BASE+0x000601C0U) // 8 3 0 7 | | | ADMA.SAI3.RXFS | | LSIO.GPIO2.IO12_IN | LSIO.GPIO6.IO26_IN | | | | +#define IOMUXD__SPI1_SCK REG32(IOMUXD_REG_BASE+0x00060200U) // 8 3 0 8 | | | ADMA.I2C2.SDA | ADMA.SPI1.SCK | LSIO.GPIO3.IO00 | | | | | +#define IOMUXD__SPI1_SDO REG32(IOMUXD_REG_BASE+0x00060240U) // 8 3 0 9 | | | ADMA.I2C2.SCL | ADMA.SPI1.SDO | LSIO.GPIO3.IO01 | | | | | +#define IOMUXD__SPI1_SDI REG32(IOMUXD_REG_BASE+0x00060280U) // 8 3 0 10 | | | ADMA.I2C3.SCL | ADMA.SPI1.SDI | LSIO.GPIO3.IO02 | | | | | +#define IOMUXD__SPI1_CS0 REG32(IOMUXD_REG_BASE+0x000602C0U) // 8 3 0 11 | | | ADMA.I2C3.SDA | ADMA.SPI1.CS0 | LSIO.GPIO3.IO03 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHD REG32(IOMUXD_REG_BASE+0x00060300U) // 8 3 0 12 | | | | | | | | | | +#define IOMUXD__QSPI0A_DATA1 REG32(IOMUXD_REG_BASE+0x00061000U) // 9 3 1 0 | LSIO.QSPI0A.DATA1 | | | | LSIO.GPIO3.IO10 | | | | | +#define IOMUXD__QSPI0A_DATA0 REG32(IOMUXD_REG_BASE+0x00061040U) // 9 3 1 1 | LSIO.QSPI0A.DATA0 | | | | LSIO.GPIO3.IO09 | | | | | +#define IOMUXD__QSPI0A_DATA3 REG32(IOMUXD_REG_BASE+0x00061080U) // 9 3 1 2 | LSIO.QSPI0A.DATA3 | | | | LSIO.GPIO3.IO12 | | | | | +#define IOMUXD__QSPI0A_DATA2 REG32(IOMUXD_REG_BASE+0x000610C0U) // 9 3 1 3 | LSIO.QSPI0A.DATA2 | | | | LSIO.GPIO3.IO11 | | | | | +#define IOMUXD__QSPI0A_SS0_B REG32(IOMUXD_REG_BASE+0x00061100U) // 9 3 1 4 | LSIO.QSPI0A.SS0_B | | | | LSIO.GPIO3.IO14 | | | | | +#define IOMUXD__QSPI0A_DQS REG32(IOMUXD_REG_BASE+0x00061140U) // 9 3 1 5 | LSIO.QSPI0A.DQS | | | | LSIO.GPIO3.IO13 | | | | | +#define IOMUXD__QSPI0A_SCLK REG32(IOMUXD_REG_BASE+0x00061180U) // 9 3 1 6 | LSIO.QSPI0A.SCLK | | | | LSIO.GPIO3.IO16 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0A REG32(IOMUXD_REG_BASE+0x000611C0U) // 9 3 1 7 | | | | | | | | | | +#define IOMUXD__QSPI0B_SCLK REG32(IOMUXD_REG_BASE+0x00061200U) // 9 3 1 8 | LSIO.QSPI0B.SCLK | | | | LSIO.GPIO3.IO17 | | | | | +#define IOMUXD__QSPI0B_DQS REG32(IOMUXD_REG_BASE+0x00061240U) // 9 3 1 9 | LSIO.QSPI0B.DQS | | | | LSIO.GPIO3.IO22 | | | | | +#define IOMUXD__QSPI0B_DATA1 REG32(IOMUXD_REG_BASE+0x00061280U) // 9 3 1 10 | LSIO.QSPI0B.DATA1 | | | | LSIO.GPIO3.IO19 | | | | | +#define IOMUXD__QSPI0B_DATA0 REG32(IOMUXD_REG_BASE+0x000612C0U) // 9 3 1 11 | LSIO.QSPI0B.DATA0 | | | | LSIO.GPIO3.IO18 | | | | | +#define IOMUXD__QSPI0B_DATA3 REG32(IOMUXD_REG_BASE+0x00061300U) // 9 3 1 12 | LSIO.QSPI0B.DATA3 | | | | LSIO.GPIO3.IO21 | | | | | +#define IOMUXD__QSPI0B_DATA2 REG32(IOMUXD_REG_BASE+0x00061340U) // 9 3 1 13 | LSIO.QSPI0B.DATA2 | | | | LSIO.GPIO3.IO20 | | | | | +#define IOMUXD__QSPI0B_SS0_B REG32(IOMUXD_REG_BASE+0x00061380U) // 9 3 1 14 | LSIO.QSPI0B.SS0_B | | | | LSIO.GPIO3.IO23 | LSIO.QSPI0A.SS1_B | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0B REG32(IOMUXD_REG_BASE+0x000613C0U) // 9 3 1 15 | | | | | | | | | | + +// GROUP REGISTERS FOR WAKEUP CONTROL +#define IOMUXD__GROUP_0_0 REG32(IOMUXD_REG_BASE+0x00000400U) // 0 0 0 0 | +#define IOMUXD__GROUP_1_0 REG32(IOMUXD_REG_BASE+0x00020400U) // 1 1 0 0 | +#define IOMUXD__GROUP_1_1 REG32(IOMUXD_REG_BASE+0x00021400U) // 2 1 1 0 | +#define IOMUXD__GROUP_1_2 REG32(IOMUXD_REG_BASE+0x00022400U) // 3 1 2 0 | +#define IOMUXD__GROUP_1_3 REG32(IOMUXD_REG_BASE+0x00023400U) // 4 1 3 0 | +#define IOMUXD__GROUP_2_0 REG32(IOMUXD_REG_BASE+0x00040400U) // 5 2 0 0 | +#define IOMUXD__GROUP_2_1 REG32(IOMUXD_REG_BASE+0x00041400U) // 6 2 1 0 | +#define IOMUXD__GROUP_2_2 REG32(IOMUXD_REG_BASE+0x00042400U) // 7 2 2 0 | +#define IOMUXD__GROUP_3_0 REG32(IOMUXD_REG_BASE+0x00060400U) // 8 3 0 0 | +#define IOMUXD__GROUP_3_1 REG32(IOMUXD_REG_BASE+0x00061400U) // 9 3 1 0 | + +#endif diff --git a/platform/config/mx8dxl/lpcg.h b/platform/config/mx8dxl/lpcg.h new file mode 100755 index 0000000..d0e0a18 --- /dev/null +++ b/platform/config/mx8dxl/lpcg.h @@ -0,0 +1,148 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef LPCG_H +#define LPCG_H + +// NOTE: Content below comes from cprog file of the SCU design database + +// LPCG______REG +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__REG 0x0000 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__BIT 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__REG 0x0004 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__BIT 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__STOP 3 + +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__REG 0x0000 // IPS_SLOT=CLK_MMCAU_HCLK +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM4__TCMC_HCLK__REG 0x0000 // IPS_SLOT=CLK_TCMC_HCLK +#define LPCG__SS_SCU__CM4__TCMC_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__STOP 3 + +#define LPCG__SS_SCU__TPM1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__TPM1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__TPM1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__BIT 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__HWEN 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__SWEN 1 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__RSVD 2 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__STOP 3 + +#endif + diff --git a/platform/config/mx8dxl/soc.bom b/platform/config/mx8dxl/soc.bom new file mode 100755 index 0000000..4cb4282 --- /dev/null +++ b/platform/config/mx8dxl/soc.bom @@ -0,0 +1,52 @@ + +SOC = MX8DXL + +DRV += \ + analog \ + csr \ + dsc \ + mtr \ + otp \ + pad \ + reset \ + snvs/v2 \ + seco/v2 \ + sysctr \ + xrdc2 \ + v2x + +DRV2 += \ + rgpio \ + igpio \ + lmem \ + lpi2c \ + lpit \ + lpcg \ + lpuart \ + mu \ + systick \ + drc \ + wdog32 \ + nic400 + +SS += \ + a35/v2 \ + adma/v3 \ + base/v1 \ + conn/v2 \ + db/v4 \ + drc/v3 \ + hsio/v2 \ + lsio/v2 \ + m4/v1 \ + sc/v2 + +SVC += \ + irq \ + misc \ + pad \ + pm \ + rm \ + seco \ + timer + diff --git a/platform/config/mx8dxl/soc.h b/platform/config/mx8dxl/soc.h new file mode 100755 index 0000000..37317fc --- /dev/null +++ b/platform/config/mx8dxl/soc.h @@ -0,0 +1,575 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure SoC specific features of the SCFW. + * Includes info on memory map, DSC mapping, subsystem mapping, etc. + * + */ +/*==========================================================================*/ + +#ifndef SC_SOC_H +#define SC_SOC_H + +/* Includes */ +#include "main/types.h" +#include "has_ss.h" +#include "fsl_device_registers.h" +#include "ss/drc/v3/dsc.h" + +/* Configure DSCs */ + +/*! Macro to calculate DSC index */ +#define DSC_IDX(X) ((sc_dsc_t) ((((uint32_t) (X)) - ((uint32_t) MSI0_BASE)) / 131072U)) + +/*! Macro to define AI_READ/WRITE */ +#define ANA_READ(BASE_IDX, TOG, ADDRESS, RDATA) DSC_AIRegisterRead(BASE_IDX, TOG, ADDRESS, RDATA) +#define ANA_WRITE(BASE_IDX, TOG, ADDRESS, DATAWORD) DSC_AIRegisterWrite(BASE_IDX, TOG, ADDRESS, DATAWORD) +#define ANA_ENABLE_ANAMIX_AI(BASE_IDX) DSC_EnableAnamixAI(BASE_IDX) +#define ANA_ENABLE_PHYMIX_AI(BASE_IDX) DSC_EnablePhymixAI(BASE_IDX) + +/*! Define for Refgen default trim in case of unfused part */ +#define REFGEN_DEFAULT_TRIM 0x2BU + +/*! + * @name Defines for sc_dsc_t + */ +/** @{ */ +#define SC_DSC_SC DSC_IDX(DSC_SC) /* 0x01 */ +#define SC_DSC_ADMA DSC_IDX(DSC_ADMA) /* 0x13 */ +#define SC_DSC_MCU_0 DSC_IDX(DSC_MCU_0) /* 0x16 */ +#define SC_DSC_CONN DSC_IDX(DSC_CONN) /* 0x19 */ +#define SC_DSC_DRC_0 DSC_IDX(DSC_DRC_0) /* 0x24 */ +#define SC_DSC_HSIO DSC_IDX(DSC_HSIO) /* 0x26 */ +#define SC_DSC_DB DSC_IDX(DSC_DB) /* 0x32 */ +#define SC_DSC_AP_2 DSC_IDX(DSC_AP_2) /* 0x35 */ +#define SC_DSC_LSIO DSC_IDX(DSC_LSIO) /* 0x38 */ +#define SC_DSC_LAST 0x3FU +#define SC_DSC_DRC_1 0x3FU +#define SC_DSC_NA SC_DSC_LAST +#define SC_DSC_W 6U +/** @} */ + +/*! + * DSC Type. This type is a used to indicate a Distributed Slave + * Controller (DSC). + */ +typedef uint8_t sc_dsc_t; + +/*! + * @name Defines for sc_ai_t + */ +/** @{ */ +#define SC_AI_HP_PLL 0U +#define SC_AI_DIG_PLL 1U +#define SC_AI_AV_PLL 2U +#define SC_AI_LVDS_TRANS 3U +#define SC_AI_BANDGAP_REF 4U +#define SC_AI_VA_REFGEN 5U +#define SC_AI_NEG_CHARGE_PUMP 6U +#define SC_AI_WELL_LEVEL_SOURCE 7U +#define SC_AI_DIFFCLK_ROOT 8U +#define SC_AI_DIFFCLK_RPTR 9U +#define SC_AI_DIFFCLK_TERM 10U +#define SC_AI_PHY_LDO 11U +#define SC_AI_OSC24M 12U +#define SC_AI_RC200OSC 13U +#define SC_AI_TEMP_SENSE 14U +#define SC_AI_VDROP_PROCMON 15U +#define SC_AI_LAST 16U +/** @} */ + +/*! + * Analog Interface Modules Types. + */ +typedef uint8_t sc_ai_t; + +/* Configure Subsystems */ + +typedef uint8_t sc_ss_inst_t; + +#define SC_SS_INST_W 1U + +/*! + * @name Defines for sc_sub_t + */ +/** @{ */ +#define SC_SUBSYS_SC 0U +#define SC_SUBSYS_MCU_0 1U +#define SC_SUBSYS_A35 2U +#define SC_SUBSYS_ADMA 3U +#define SC_SUBSYS_CONN 4U +#define SC_SUBSYS_DB 5U +#define SC_SUBSYS_DRC_0 6U +#define SC_SUBSYS_LSIO 7U +#define SC_SUBSYS_HSIO 8U +#define SC_SUBSYS_LAST SC_SUBSYS_HSIO +#define SC_SUBSYS_W 4U +#define SC_SUBSYS_NA 15U +/** @} */ + +/*! + * Subsystem Type. This type is used to indicate a subsystem. + */ +typedef uint8_t sc_sub_t; + +#define SC_PGP_00 0U +#define SC_PGP_01 1U +#define SC_PGP_02 2U +#define SC_PGP_03 3U +#define SC_PGP_04 4U +#define SC_PGP_05 5U +#define SC_PGP_06 6U + +#define SC_PGP_W 3U +#define SC_PGP_NA 7U + +#define MTR_PWR_PLAN_SEL_SCU0 0U +#define MTR_PWR_PLAN_SEL_DB 1U +#define MTR_PWR_PLAN_SEL_HSIO 2U +#define MTR_PWR_PLAN_SEL_MCU_0 3U +#define MTR_PWR_PLAN_SEL_LSIO 4U +#define MTR_PWR_PLAN_SEL_CA35 6U +#define MTR_PWR_PLAN_SEL_CONNECTIVITY 7U +#define MTR_PWR_PLAN_SEL_DRC_0 9U +#define MTR_PWR_PLAN_SEL_ADMA 13U + +#define SC_SS_INFO_INIT \ + {HAS_SS_SC, 0, SC_PGP_00, SC_SUBSYS_NA, 0, 0, SC_DSC_SC}, /* SC_SUBSYS_SC */ \ + {HAS_SS_MCU_0, 0, SC_PGP_01, SC_SUBSYS_NA, 0, 0, SC_DSC_MCU_0}, /* SC_SUBSYS_MCU_0 */ \ + {HAS_SS_AP_2, 0, SC_PGP_06, SC_SUBSYS_NA, 0, 0, SC_DSC_AP_2}, /* SC_SUBSYS_A35 */ \ + {HAS_SS_ADMA, 0, SC_PGP_02, SC_SUBSYS_NA, 0, 0, SC_DSC_ADMA}, /* SC_SUBSYS_ADMA */ \ + {HAS_SS_CONN, 0, SC_PGP_03, SC_SUBSYS_NA, 0, 0, SC_DSC_CONN}, /* SC_SUBSYS_CONN */ \ + {HAS_SS_DB, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DB}, /* SC_SUBSYS_DB */ \ + {HAS_SS_DRC_0, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DRC_0}, /* SC_SUBSYS_DRC_0 */ \ + {HAS_SS_LSIO, 0, SC_PGP_05, SC_SUBSYS_NA, 0, 0, SC_DSC_LSIO}, /* SC_SUBSYS_LSIO */ \ + {HAS_SS_HSIO_0, 0, SC_PGP_04, SC_SUBSYS_NA, 0, 0, SC_DSC_HSIO} /* SC_SUBSYS_HSIO */ + +/*! Number of DB */ +#define SC_NUM_DB 1U + +/*! + * DB Connect Type. Stores a subsystem connection mask. + */ +typedef uint32_t sc_db_connect_t; + +/*! DB connect mask */ +#define SC_DB_CONNECT \ + ( BIT(SC_SUBSYS_SC) \ + | BIT(SC_SUBSYS_MCU_0) \ + | BIT(SC_SUBSYS_A35) \ + | BIT(SC_SUBSYS_ADMA) \ + | BIT(SC_SUBSYS_CONN) \ + | BIT(SC_SUBSYS_DRC_0) \ + | BIT(SC_SUBSYS_LSIO) \ + | BIT(SC_SUBSYS_HSIO)) + +/*! Init order of DB (SCU outward) */ +#define SC_DB_INIT \ + {SC_R_DB, SC_SUBSYS_DB, SC_DB_CONNECT} + +#define SC_SS_EP_INIT \ + SS_EP_INIT_SC, /* SC_SUBSYS_SC */ \ + SS_EP_INIT_M4, /* SC_SUBSYS_MCU_0 */ \ + SS_EP_INIT_A35, /* SC_SUBSYS_A35 */ \ + SS_EP_INIT_ADMA, /* SC_SUBSYS_ADMA */ \ + SS_EP_INIT_CONN, /* SC_SUBSYS_CONN */ \ + SS_EP_INIT_DB, /* SC_SUBSYS_DB */ \ + SS_EP_INIT_DRC, /* SC_SUBSYS_DRC_0 */ \ + SS_EP_INIT_LSIO, /* SC_SUBSYS_LSIO */ \ + SS_EP_INIT_HSIO /* SC_SUBSYS_HSIO */ + +#define SC_SS_BASE_INFO_INIT \ + &ss_base_info_sc, /* SC_SUBSYS_SC */ \ + &ss_base_info_m4, /* SC_SUBSYS_MCU_0 */ \ + &ss_base_info_a35, /* SC_SUBSYS_A35 */ \ + &ss_base_info_adma, /* SC_SUBSYS_ADMA */ \ + &ss_base_info_conn, /* SC_SUBSYS_CONN */ \ + &ss_base_info_db, /* SC_SUBSYS_DB */ \ + &ss_base_info_drc, /* SC_SUBSYS_DRC_0 */ \ + &ss_base_info_lsio, /* SC_SUBSYS_LSIO */ \ + &ss_base_info_hsio /* SC_SUBSYS_HSIO */ + +#ifdef DEBUG + #define SNAME_INIT \ + "SC", \ + "M4_0", \ + "A35", \ + "ADMA", \ + "CONN", \ + "DB", \ + "DRC_0", \ + "LSIO", \ + "HSIO" + + #define RNAME_INIT \ + RNAME_INIT_SC_0 \ + RNAME_INIT_M4_0 \ + RNAME_INIT_A35_0 \ + RNAME_INIT_ADMA_0 \ + RNAME_INIT_CONN_0 \ + RNAME_INIT_DB_0 \ + RNAME_INIT_DRC_0 \ + RNAME_INIT_LSIO_0 \ + RNAME_INIT_HSIO_0 \ + RNAME_INIT_BRD + +#endif + +#define SC_R_DDR SC_R_DRC_0 +#define SC_R_DDR_PLL SC_R_DRC_0_PLL + +/*! Chip versions */ +#define CHIP_VER_A0 0x0U +#define CHIP_VER_A1 0x1U + +/*! Macro to get JTAG ID */ +#ifndef SIMU + #define JTAG_ID (DSC_SC->GPR_STAT[2].RW & 0x1FFU) +#else + #ifdef SREV_A0 + #define JTAG_ID ((CHIP_VER_A0 << 5U) | CHIP_ID_DXL) + #endif + #ifdef SREV_A1 + #define JTAG_ID ((CHIP_VER_A1 << 5U) | CHIP_ID_DXL) + #endif +#endif + +/*! Macros to get chip ID and version */ +#define CHIP_ID ((JTAG_ID >> 0U) & 0x1FU) +#define CHIP_VER ((JTAG_ID >> 5U) & 0xFU) + +/* Configure Top Level Memory Map */ + +#define SC_MEMMAP_INIT \ + { LSIO_SS_BASE1, 0x1C000000U, 1, 1, 30, 1, 0x00, SC_SUBSYS_LSIO}, \ + { SCU_SS_BASE0, 0x4000000U, 0, 1, 26, 0, 0x00, SC_SUBSYS_SC}, \ + { MCU_0_SS_BASE0, 0x4000000U, 1, 1, 26, 0, 0x00, SC_SUBSYS_MCU_0}, \ + {HSIO_0_SS_BASE2, 0x10000000U, 1, 1, 28, 2, 0x00, SC_SUBSYS_HSIO}, \ + { DDR_BASE0, 0x80000000U, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { DDR_BASE1, 0x780000000ULL, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { SC_NA, SC_NA, 0, 0, 0, 0, 0, 0} + +#define SC_BOOT_ADDR_INIT \ + {OCRAM_ALIAS_BASE, 0x17FFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { OCRAM_BASE, 0x3FFFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { FSPI0_MEM_BASE, 0x10000000U, SC_R_FSPI_0, SC_SUBSYS_LSIO}, \ + { TCML_MCU_0, 0x4000000U, SC_R_MCU_0_PID0, SC_SUBSYS_MCU_0}, \ + { DDR_BASE0, 0x80000000U, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { DDR_BASE1, 0x780000000ULL, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { SC_NA, SC_NA, 0U, 0U} + +/* Configure Features */ + +/* Configure RM */ +#define SC_RM_NUM_PARTITION 20U //!< Number of resource partitions +#define SC_RM_NUM_MEMREG 64U //!< Number of memory regions +#define SC_RM_NUM_DOMAIN 16U //!< Number of resource domains + +/*! PLL frequencies */ +#define MIN_PLL_RATE 648000000U +#define MAX_PLL_RATE 1344000000U +#define MIN_HP_PLL_RATE 1250000000U +#define MAX_HP_PLL_RATE 2500000000U +#define MIN_HP_PLL_1P5_RATE 833333333U +#define PLL_RATE_DEN 960000U +#define DIV_FACTOR_NUM 2U +#define DIV_FACTOR_DEN 3U + +/*! + * Define operating points for A35. + */ +#define NUM_A35_OPP 1 + +/*! Has 28FDSOI in SCFW API */ +#define API_HAS_28FDSOI + +/*! Has V2X in SCFW API */ +#define API_HAS_V2X + +/*! Has V2X in DB */ +#define V2X_IN_DB + +/*! Requires V2X FW copy from FlexSPI */ +#define FLEXSPI_V2X_ADDR 0x1400UL +#define FLEXSPI_DUMMY_ADDR 0x1800UL + +/*! Support partitioning naming for debug */ +#define HAS_PARTITION_NAMES + +/*! Enhanced monitor support */ +#define MONITOR_HAS_CMD_OFF +#define MONITOR_HAS_CMD_MSG +#define MONITOR_HAS_CMD_VDETECT +#define MONITOR_HAS_CMD_WDOG +#define MONITOR_HAS_CMD_PANIC +#define MONITOR_HAS_CMD_MRC +#define MONITOR_HAS_CMD_BOOT +#define MONITOR_HAS_CMD_WAKE +#define MONITOR_HAS_CMD_GRANT + +/*! Define to use SECO FW */ +#define HAS_SECO_FW + +/*! Defines for FW versions */ +#define SECO_FW_VERSION ((0UL << 16) | (7UL << 4) | 4UL) +#define V2X_FW_VERSION ((0UL << 16) | (0UL << 4) | 7UL) + +/*! Define DDR DATX8 Lanes */ +#define DWC_NO_OF_BYTES 2U + +/*! Defines for AI temp sensor */ +#define FUSE_TEMP_AUTO 0x0 +#define FUSE_TEMP_INDUSL 0x1 +#define FUSE_TEMP_CONS 0x2 +#define FUSE_TEMP_EX_CONS 0x3 +#define AI_TEMP_RATE 1000U +#define AI_TEMP_NP 1915 +#define AI_TEMP_NT 25 +#define AI_TEMP_PANIC 127 +#define AI_TEMP_PANIC_AUTO 127 +#define AI_TEMP_PANIC_INDUS 107 +#define AI_TEMP_PANIC_CONS 97 +#define AI_TEMP_PANIC_EX_CONS 107 + +/*! Define to indicate timer services required */ +#define HAS_TIMER_SERVICES + +/*! Number of boot images supported by ROM */ +#define SC_BOOT_MAX_LIST 8U + +/* Define boot cpu and address based on whether or + not we're running the DDR stress test */ +#ifdef M4_BOOT + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_SRC 0x00040000U + #define BOOT_DST 0x34FE0000U + #define BOOT_SIZE 0x20000U + #define BOOT_FLAGS 0x00000000U +#elif defined(TEST_BOOTTIME) + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00400000U +#else + #define BOOT_CPU SC_R_AP_2_0 + #define BOOT_ADDR 0x080000000UL + #define BOOT_MU SC_R_MU_0A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00000000U +#endif + +/* Boot data address */ +#define SC_BOOT_DATA_ADDR_PTR 0x000005F0U +#define SC_BOOT_DATA_ADDR 0x2001FC00U +#define SC_BOOT_DATA2_ADDR 0x2001FD00U + +/*! Rom uses patch headers */ +#define ROM_PATCH_HEADER + +/*! OTP patch areas */ +#define SOC_PATCH_AREA_CNT 3U + +/*! OTP patch area list */ +#define SOC_PATCH_AREA_INIT \ + {OTP_ROM_PATCH, OTP_ROM_PATCH_SIZE}, \ + {OTP_SECO_PATCH2, OTP_SECO_PATCH2_SIZE}, \ + {OTP_SECO_PATCH, OTP_SECO_PATCH_SIZE} + +/*! Rom boot device mappings */ +/** @{ */ +#define ROM_SDHC_0 SC_R_SDHC_0 +#define ROM_SDHC_1 SC_R_SDHC_1 +#define ROM_SDHC_2 SC_R_SDHC_2 +#define ROM_FSPI_0 SC_R_FSPI_0 +#define ROM_FSPI_1 SC_R_FSPI_1 +#define ROM_USB_0 SC_R_USB_0 +#define ROM_USB_1 SC_R_USB_0 +#define ROM_USB_2 SC_R_USB_1 +/** @} */ + +/* Configure Tests */ +#define TEST_HSIO0_PCIE SC_R_PCIE_B +#define TEST_HSIO0_SERDES SC_R_SERDES_1 +#define TEST_HSIO0_MATCH_0 SC_R_MATCH_0 +#define SC_P_TEST_PAD SC_P_UART1_RX +#define SC_P_TEST_PAD_COMP SC_P_COMP_CTL_GPIO_3V3_USB3IO +#define TEST_LSIO HAS_SS_LSIO +#define TEST_DMA HAS_SS_ADMA +#define TEST_BOARD_ALT2 SC_FALSE + +/* Max MRC regions */ +#define SC_MAX_NUM_MEMREG \ +( \ + 16U /* DB */ \ + + 32U /* HSIO */ \ + + 48U /* LSIO */ \ + + 4U /* MCU */ \ + + 4U /* SC */ \ +) + +/*! Define to indicate number of CAAM job rings */ +#define SC_CAAM_JR 4U + +/*! Define to indicate number of MU */ +#define SC_SECO_MU 4U + +/*! Enable FAKE_TBU use by MCU */ +#define SC_FAKE_TBU + +/*! Disable AP access to LSIO memory for ERR050601 */ +#define ERR050601_WORKAROUND + +/* Configure Resources */ +#define SC_NO_DTCP + +/* Define CPU topology */ +#define SOC_NUM_CLUSTER 1U +#define SOC_IDX_AP_2 0U +#define SOC_NUM_AP_2 2U +#define SOC_NUM_DIG_AUD_PLL 2U + +/* Define MCU topology */ +#define SOC_NUM_MCU 1U +#define SOC_IDX_MCU_0 0U + +/* Define auxiliary processor topology */ +#define SOC_NUM_AUX 1U +#define SOC_IDX_AUX_0 0U /* AUX_0 is mapped to V2X */ + +/* Define HMP topology */ +#define SOC_NUM_HMP_NODES 4U +#define SOC_HMP_IDX_SCU 0U /* SCU must be index 0 */ +#define SOC_HMP_IDX_MCU_0 1U /* MCU order must follow topology above */ +#define SOC_HMP_IDX_AP_2 2U +#define SOC_HMP_IDX_AUX_0 3U +#define SOC_HMP_IDX_MCU SOC_HMP_IDX_MCU_0 +#define SOC_HMP_IDX_AP SOC_HMP_IDX_AP_2 +#define SOC_HMP_IDX_AUX SOC_HMP_IDX_AUX_0 + +/* Define system-level interface topology */ +#define SOC_NUM_SYS_IF 4U /* Number of system-level interfaces */ +#define SOC_SYS_IF_MU_RSRC 5U /* Number of AP -> SCU message unit resources */ +#define SOC_SYS_IF_ICN_RSRC 1U /* Number of interconnect resources */ +#define SOC_SYS_IF_OCMEM_RSRC 3U /* Number of on-chip memory resources */ +#define SOC_SYS_IF_DDR_RSRC 1U /* Number of DDR resources */ +#define SOC_SYS_IF_CPU_HPM SC_PM_PW_MODE_LP /* CPU power mode threshold for HPM */ + +/* Define wakeup bindings */ +#define SOC_GIC_DSC SC_DSC_ADMA /* DSC for GIC wakeups */ +#define SOC_IRQSTEER_DSC SC_DSC_ADMA /* DSC for IRQSTEER wakeup */ +#define SOC_GIC_WAKEUP00 REGBIT64(1, 0) /* DSC IRQ for GIC wakeups */ +#define SOC_IRQSTEER_AP_WAKEUP REGBIT64(1, 11) /* DSC IRQ for AP IRQSTEER wakeup */ +#define SOC_IRQSTEER_MCU_WAKEUP REGBIT64(1, 9) /* DSC IRQ for MCU IRQSTEER wakeup */ +#define SOC_WAKEUP_PW_MODE SC_PM_PW_MODE_STBY /* CPU power mode limit for GIC wakeup */ +#define SOC_RESUME_PW_MODE SC_PM_PW_MODE_ON /* CPU power mode for resume */ +#define SOC_MCU_STOPM_PDN 3U /* STOPM >= 3 will power down MCU core */ +#define SOC_MCU_STOPM_MEMSR 3U /* STOPM == 3 will retain memories */ +#define SOC_SNVS_PWR_ON_WAKEUP REGBIT64(1, 10) /* DSC IRQ for SNVS_LP set_pwr_on_irq */ + +/* Define ADMA mbist */ +#define SS_ADMA_BIST1 (((uint32_t)DSC_ADMA) + 0x8020U) +#define SS_ADMA_BIST1_START 230U +#define SS_ADMA_BIST1_END 233U + +#define SS_ADMA_BIST3 (((uint32_t)DSC_ADMA) + 0x8040U) +#define SS_ADMA_BIST3_START 234U +#define SS_ADMA_BIST3_END 266U + +/* Defines for DDR training */ +#define DQS_TIMER_DURATION_512 1U /* 512 * tCK = 2048 * (1/1200) = 1 us (round up) */ +#define DQS_TIMER_DURATION_1008 1U /* 1008 * tCK = 1008 * (1/1200) = 1 us (round up) */ +#define DQS_TIMER_DURATION_2048 2U /* 2048 * tCK = 2048 * (1/1200) = 2 us (round up) */ +#define DQS_TIMER_DURATION_8192 7U /* 8192 * tCK = 8192 * (1/1200) = 7 us (round up) */ + +/* Include SS configs */ + +#include "all_config.h" +#include "board/config.h" +#include "handlers_MX8DXL.h" /* Device specific handlers */ + +/* Configure Resources */ + +#define SC_NUM_RSRC \ + (SS_NUM_RSRC_SC \ + + SS_NUM_RSRC_M4 \ + + SS_NUM_RSRC_A35 \ + + SS_NUM_RSRC_ADMA \ + + SS_NUM_RSRC_CONN \ + + SS_NUM_RSRC_DB \ + + SS_NUM_RSRC_DRC \ + + SS_NUM_RSRC_LSIO \ + + SS_NUM_RSRC_HSIO \ + + BRD_NUM_RSRC_BRD) + +#define SC_PAD_INIT_INIT \ + {SC_P_USB_SS3_TC0, 4, 0}, \ + {SC_P_USB_SS3_TC1, 4, 0}, \ + {SC_P_USB_SS3_TC2, 4, 0}, \ + {SC_P_USB_SS3_TC3, 4, 0}, \ + {SC_P_USDHC1_RESET_B, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_VSELECT, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_WP, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_CD_B, 4, SC_R_SDHC_1}, \ + {SC_P_MCLK_IN0, 4, 0}, \ + {SC_P_MCLK_OUT0, 4, 0}, \ + {SC_P_FLEXCAN0_RX, 4, SC_R_CAN_0}, \ + {SC_P_FLEXCAN0_TX, 4, SC_R_CAN_0}, \ + {SC_P_FLEXCAN1_RX, 4, SC_R_CAN_1}, \ + {SC_P_FLEXCAN1_TX, 4, SC_R_CAN_1}, \ + {0, 0, 0} + +#define SC_ROM_SS_INIT \ + 0, /* SC_SUBSYS_SC */ \ + 1, /* SC_SUBSYS_MCU_0 */ \ + 2, /* SC_SUBSYS_A35 */ \ + 7, /* SC_SUBSYS_ADMA */ \ + 8, /* SC_SUBSYS_CONN */ \ + 9, /* SC_SUBSYS_DB */ \ + 10, /* SC_SUBSYS_DRC_0 */ \ + 11, /* SC_SUBSYS_LSIO */ \ + 12 /* SC_SUBSYS_HSIO */ + +#define DB_NIC0_AP_PORT_IDX 6 + +#endif /* SC_SOC_H */ + diff --git a/platform/config/mx8qm/ALL/has_ss.h b/platform/config/mx8qm/ALL/has_ss.h new file mode 100755 index 0000000..8bbea8a --- /dev/null +++ b/platform/config/mx8qm/ALL/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 1 +#define HAS_SS_CCI 1 +#define HAS_SS_AP_0 1 +#define HAS_SS_AP_1 1 +#define HAS_SS_AP_2 0 +#define HAS_SS_GPU_0 1 +#define HAS_SS_GPU_1 1 +#define HAS_SS_VPU 1 +#define HAS_SS_DC_0 1 +#define HAS_SS_DC_1 1 +#define HAS_SS_IMG_0 1 +#define HAS_SS_AUDIO 1 +#define HAS_SS_ADMA 0 +#define HAS_SS_DMA 1 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 1 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 1 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 1 +#define HAS_SS_LVDS_1 1 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 1 +#define HAS_SS_CSI_1 1 +#define HAS_SS_HDMI_RX 1 +#define HAS_SS_HDMI 1 +#define HAS_SS_MIPI_0 1 +#define HAS_SS_MIPI_1 1 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qm/AP/has_ss.h b/platform/config/mx8qm/AP/has_ss.h new file mode 100755 index 0000000..7204607 --- /dev/null +++ b/platform/config/mx8qm/AP/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 0 +#define HAS_SS_MCU_1 0 +#define HAS_SS_CCI 1 +#define HAS_SS_AP_0 1 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 0 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 0 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 0 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 0 +#define HAS_SS_DMA 1 +#define HAS_SS_CONN 0 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 1 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 1 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 0 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 0 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 0 +#define HAS_SS_MIPI_1 0 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qm/AV/has_ss.h b/platform/config/mx8qm/AV/has_ss.h new file mode 100755 index 0000000..ea40407 --- /dev/null +++ b/platform/config/mx8qm/AV/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 1 +#define HAS_SS_CCI 1 +#define HAS_SS_AP_0 1 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 0 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 1 +#define HAS_SS_DC_0 1 +#define HAS_SS_DC_1 1 +#define HAS_SS_IMG_0 1 +#define HAS_SS_AUDIO 1 +#define HAS_SS_ADMA 0 +#define HAS_SS_DMA 1 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 1 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 1 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 0 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 1 +#define HAS_SS_LVDS_1 1 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 1 +#define HAS_SS_CSI_1 1 +#define HAS_SS_HDMI_RX 1 +#define HAS_SS_HDMI 1 +#define HAS_SS_MIPI_0 1 +#define HAS_SS_MIPI_1 1 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qm/CORES/has_ss.h b/platform/config/mx8qm/CORES/has_ss.h new file mode 100755 index 0000000..5802aa9 --- /dev/null +++ b/platform/config/mx8qm/CORES/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 1 +#define HAS_SS_CCI 1 +#define HAS_SS_AP_0 1 +#define HAS_SS_AP_1 1 +#define HAS_SS_AP_2 0 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 0 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 0 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 0 +#define HAS_SS_DMA 1 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 1 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 1 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 0 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 0 +#define HAS_SS_MIPI_1 0 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qm/GFX/has_ss.h b/platform/config/mx8qm/GFX/has_ss.h new file mode 100755 index 0000000..2257ede --- /dev/null +++ b/platform/config/mx8qm/GFX/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 1 +#define HAS_SS_CCI 1 +#define HAS_SS_AP_0 1 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 0 +#define HAS_SS_GPU_0 1 +#define HAS_SS_GPU_1 1 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 1 +#define HAS_SS_DC_1 1 +#define HAS_SS_IMG_0 1 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 0 +#define HAS_SS_DMA 1 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 1 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 1 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 0 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 1 +#define HAS_SS_LVDS_1 1 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 1 +#define HAS_SS_CSI_1 1 +#define HAS_SS_HDMI_RX 1 +#define HAS_SS_HDMI 1 +#define HAS_SS_MIPI_0 1 +#define HAS_SS_MIPI_1 1 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qm/all_api.h b/platform/config/mx8qm/all_api.h new file mode 100644 index 0000000..1098e72 --- /dev/null +++ b/platform/config/mx8qm/all_api.h @@ -0,0 +1,60 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing includes. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/include_h.pl */ + +#ifndef SC_PLATFORM_CONFIG_MX8QM_ALL_API_H +#define SC_PLATFORM_CONFIG_MX8QM_ALL_API_H + +/* Includes */ + +#include "svc/irq/api.h" +#include "svc/misc/api.h" +#include "svc/pad/api.h" +#include "svc/pm/api.h" +#include "svc/rm/api.h" +#include "svc/seco/api.h" +#include "svc/timer/api.h" + +#endif /* SC_PLATFORM_CONFIG_MX8QM_ALL_API_H */ + diff --git a/platform/config/mx8qm/all_config.h b/platform/config/mx8qm/all_config.h new file mode 100644 index 0000000..f46508f --- /dev/null +++ b/platform/config/mx8qm/all_config.h @@ -0,0 +1,76 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing includes. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/include_h.pl */ + +#ifndef SC_PLATFORM_CONFIG_MX8QM_ALL_CONFIG_H +#define SC_PLATFORM_CONFIG_MX8QM_ALL_CONFIG_H + +/* Includes */ + +#include "ss/a53/v1/config.h" +#include "ss/a72/v1/config.h" +#include "ss/audio/v1/config.h" +#include "ss/base/v1/config.h" +#include "ss/cci/v1/config.h" +#include "ss/conn/v1/config.h" +#include "ss/csi/v1/config.h" +#include "ss/db/v1/config.h" +#include "ss/dblogic/v1/config.h" +#include "ss/dc/v1/config.h" +#include "ss/dma/v1/config.h" +#include "ss/drc/v1/config.h" +#include "ss/gpu/v1/config.h" +#include "ss/hdmi/v1/config.h" +#include "ss/hdmi_rx/v1/config.h" +#include "ss/hsio/v1/config.h" +#include "ss/img/v1/config.h" +#include "ss/lsio/v2/config.h" +#include "ss/lvds/v1/config.h" +#include "ss/m4/v1/config.h" +#include "ss/mipi/v1/config.h" +#include "ss/sc/v2/config.h" +#include "ss/vpu/v3/config.h" + +#endif /* SC_PLATFORM_CONFIG_MX8QM_ALL_CONFIG_H */ + diff --git a/platform/config/mx8qm/all_ss.h b/platform/config/mx8qm/all_ss.h new file mode 100644 index 0000000..3ac851e --- /dev/null +++ b/platform/config/mx8qm/all_ss.h @@ -0,0 +1,76 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing includes. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/include_h.pl */ + +#ifndef SC_PLATFORM_CONFIG_MX8QM_ALL_SS_H +#define SC_PLATFORM_CONFIG_MX8QM_ALL_SS_H + +/* Includes */ + +#include "ss/a53/v1/ss.h" +#include "ss/a72/v1/ss.h" +#include "ss/audio/v1/ss.h" +#include "ss/base/v1/ss.h" +#include "ss/cci/v1/ss.h" +#include "ss/conn/v1/ss.h" +#include "ss/csi/v1/ss.h" +#include "ss/db/v1/ss.h" +#include "ss/dblogic/v1/ss.h" +#include "ss/dc/v1/ss.h" +#include "ss/dma/v1/ss.h" +#include "ss/drc/v1/ss.h" +#include "ss/gpu/v1/ss.h" +#include "ss/hdmi/v1/ss.h" +#include "ss/hdmi_rx/v1/ss.h" +#include "ss/hsio/v1/ss.h" +#include "ss/img/v1/ss.h" +#include "ss/lsio/v2/ss.h" +#include "ss/lvds/v1/ss.h" +#include "ss/m4/v1/ss.h" +#include "ss/mipi/v1/ss.h" +#include "ss/sc/v2/ss.h" +#include "ss/vpu/v3/ss.h" + +#endif /* SC_PLATFORM_CONFIG_MX8QM_ALL_SS_H */ + diff --git a/platform/config/mx8qm/all_svc.h b/platform/config/mx8qm/all_svc.h new file mode 100644 index 0000000..0ba8d62 --- /dev/null +++ b/platform/config/mx8qm/all_svc.h @@ -0,0 +1,60 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing includes. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/include_h.pl */ + +#ifndef SC_PLATFORM_CONFIG_MX8QM_ALL_SVC_H +#define SC_PLATFORM_CONFIG_MX8QM_ALL_SVC_H + +/* Includes */ + +#include "svc/irq/svc.h" +#include "svc/misc/svc.h" +#include "svc/pad/svc.h" +#include "svc/pm/svc.h" +#include "svc/rm/svc.h" +#include "svc/seco/svc.h" +#include "svc/timer/svc.h" + +#endif /* SC_PLATFORM_CONFIG_MX8QM_ALL_SVC_H */ + diff --git a/platform/config/mx8qm/iomuxd.h b/platform/config/mx8qm/iomuxd.h new file mode 100755 index 0000000..552c6c3 --- /dev/null +++ b/platform/config/mx8qm/iomuxd.h @@ -0,0 +1,342 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef IOMUXD_H +#define IOMUXD_H + +#ifndef IOMUXD_REG_BASE + #ifdef SCU_RESOURCES + #define IOMUXD_REG_BASE 0x41F80000U + #else + #define IOMUXD_REG_BASE 0x33F80000U + #endif +#endif + + // NUM RING GROUP PAD | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +#define IOMUXD__SIM0_CLK REG32(IOMUXD_REG_BASE+0x00000000U) // 0 0 0 0 | DMA.SIM0.CLK | | | LSIO.GPIO0.IO00 | | | | | | +#define IOMUXD__SIM0_RST REG32(IOMUXD_REG_BASE+0x00000040U) // 0 0 0 1 | DMA.SIM0.RST | | | LSIO.GPIO0.IO01 | | | | | | +#define IOMUXD__SIM0_IO REG32(IOMUXD_REG_BASE+0x00000080U) // 0 0 0 2 | DMA.SIM0.IO | | | LSIO.GPIO0.IO02 | | | | | | +#define IOMUXD__SIM0_PD REG32(IOMUXD_REG_BASE+0x000000C0U) // 0 0 0 3 | DMA.SIM0.PD | DMA.I2C3.SCL | | LSIO.GPIO0.IO03 | | | | | | +#define IOMUXD__SIM0_POWER_EN REG32(IOMUXD_REG_BASE+0x00000100U) // 0 0 0 4 | DMA.SIM0.POWER_EN | DMA.I2C3.SDA | | LSIO.GPIO0.IO04 | | | | | | +#define IOMUXD__SIM0_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00000140U) // 0 0 0 5 | DMA.SIM0.POWER_EN | | | LSIO.GPIO0.IO05 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SIM REG32(IOMUXD_REG_BASE+0x00000180U) // 0 0 0 6 | | | | | | | | | | +#define IOMUXD__M40_I2C0_SCL REG32(IOMUXD_REG_BASE+0x000001C0U) // 0 0 0 7 | M40.I2C0.SCL | M40.UART0.RX | M40.GPIO0.IO02 | LSIO.GPIO0.IO06 | | | | | | +#define IOMUXD__M40_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00000200U) // 0 0 0 8 | M40.I2C0.SDA | M40.UART0.TX | M40.GPIO0.IO03 | LSIO.GPIO0.IO07 | | | | | | +#define IOMUXD__M40_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00000240U) // 0 0 0 9 | M40.GPIO0.IO00 | M40.TPM0.CH0 | DMA.UART4.RX | LSIO.GPIO0.IO08 | | | | | | +#define IOMUXD__M40_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00000280U) // 0 0 0 10 | M40.GPIO0.IO01 | M40.TPM0.CH1 | DMA.UART4.TX | LSIO.GPIO0.IO09 | | | | | | +#define IOMUXD__M41_I2C0_SCL REG32(IOMUXD_REG_BASE+0x000002C0U) // 0 0 0 11 | M41.I2C0.SCL | M41.UART0.RX | M41.GPIO0.IO02 | LSIO.GPIO0.IO10 | | | | | | +#define IOMUXD__M41_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00000300U) // 0 0 0 12 | M41.I2C0.SDA | M41.UART0.TX | M41.GPIO0.IO03 | LSIO.GPIO0.IO11 | | | | | | +#define IOMUXD__M41_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00000340U) // 0 0 0 13 | M41.GPIO0.IO00 | M41.TPM0.CH0 | DMA.UART3.RX | LSIO.GPIO0.IO12 | | | | | | +#define IOMUXD__M41_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00000380U) // 0 0 0 14 | M41.GPIO0.IO01 | M41.TPM0.CH1 | DMA.UART3.TX | LSIO.GPIO0.IO13 | | | | | | +#define IOMUXD__GPT0_CLK REG32(IOMUXD_REG_BASE+0x00001000U) // 1 0 1 0 | LSIO.GPT0.CLK | DMA.I2C1.SCL | LSIO.KPP0.COL4 | LSIO.GPIO0.IO14 | | | | | | +#define IOMUXD__GPT0_CAPTURE REG32(IOMUXD_REG_BASE+0x00001040U) // 1 0 1 1 | LSIO.GPT0.CAPTURE | DMA.I2C1.SDA | LSIO.KPP0.COL5 | LSIO.GPIO0.IO15 | | | | | | +#define IOMUXD__GPT0_COMPARE REG32(IOMUXD_REG_BASE+0x00001080U) // 1 0 1 2 | LSIO.GPT0.COMPARE | LSIO.PWM3.OUT | LSIO.KPP0.COL6 | LSIO.GPIO0.IO16 | | | | | | +#define IOMUXD__GPT1_CLK REG32(IOMUXD_REG_BASE+0x000010C0U) // 1 0 1 3 | LSIO.GPT1.CLK | DMA.I2C2.SCL | LSIO.KPP0.COL7 | LSIO.GPIO0.IO17 | | | | | | +#define IOMUXD__GPT1_CAPTURE REG32(IOMUXD_REG_BASE+0x00001100U) // 1 0 1 4 | LSIO.GPT1.CAPTURE | DMA.I2C2.SDA | LSIO.KPP0.ROW4 | LSIO.GPIO0.IO18 | | | | | | +#define IOMUXD__GPT1_COMPARE REG32(IOMUXD_REG_BASE+0x00001140U) // 1 0 1 5 | LSIO.GPT1.COMPARE | LSIO.PWM2.OUT | LSIO.KPP0.ROW5 | LSIO.GPIO0.IO19 | | | | | | +#define IOMUXD__UART0_RX REG32(IOMUXD_REG_BASE+0x00001180U) // 1 0 1 6 | DMA.UART0.RX | SCU.UART0.RX | | LSIO.GPIO0.IO20 | | | | | | +#define IOMUXD__UART0_TX REG32(IOMUXD_REG_BASE+0x000011C0U) // 1 0 1 7 | DMA.UART0.TX | SCU.UART0.TX | | LSIO.GPIO0.IO21 | | | | | | +#define IOMUXD__UART0_RTS_B REG32(IOMUXD_REG_BASE+0x00001200U) // 1 0 1 8 | DMA.UART0.RTS_B | LSIO.PWM0.OUT | DMA.UART2.RX | LSIO.GPIO0.IO22 | | | | | | +#define IOMUXD__UART0_CTS_B REG32(IOMUXD_REG_BASE+0x00001240U) // 1 0 1 9 | DMA.UART0.CTS_B | LSIO.PWM1.OUT | DMA.UART2.TX | LSIO.GPIO0.IO23 | | | | | | +#define IOMUXD__UART1_TX REG32(IOMUXD_REG_BASE+0x00001280U) // 1 0 1 10 | DMA.UART1.TX | DMA.SPI3.SCK | | LSIO.GPIO0.IO24 | | | | | | +#define IOMUXD__UART1_RX REG32(IOMUXD_REG_BASE+0x000012C0U) // 1 0 1 11 | DMA.UART1.RX | DMA.SPI3.SDO | | LSIO.GPIO0.IO25 | | | | | | +#define IOMUXD__UART1_RTS_B REG32(IOMUXD_REG_BASE+0x00001300U) // 1 0 1 12 | DMA.UART1.RTS_B | DMA.SPI3.SDI | DMA.UART1.CTS_B | LSIO.GPIO0.IO26 | | | | | | +#define IOMUXD__UART1_CTS_B REG32(IOMUXD_REG_BASE+0x00001340U) // 1 0 1 13 | DMA.UART1.CTS_B | DMA.SPI3.CS0 | DMA.UART1.RTS_B | LSIO.GPIO0.IO27 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLH REG32(IOMUXD_REG_BASE+0x00001380U) // 1 0 1 14 | | | | | | | | | | +#define IOMUXD__SCU_PMIC_MEMC_ON REG32(IOMUXD_REG_BASE+0x000013C0U) // 1 0 1 15 | SCU.GPIO0.IOXX_PMIC_MEMC_ON | | | | | | | | | +#define IOMUXD__SCU_WDOG_OUT REG32(IOMUXD_REG_BASE+0x00002000U) // 2 0 2 0 | SCU.WDOG0.WDOG_OUT | | | | | | | | | +#define IOMUXD__PMIC_I2C_SDA REG32(IOMUXD_REG_BASE+0x00002040U) // 2 0 2 1 | SCU.PMIC_I2C.SDA | | | | | | | | | +#define IOMUXD__PMIC_I2C_SCL REG32(IOMUXD_REG_BASE+0x00002080U) // 2 0 2 2 | SCU.PMIC_I2C.SCL | | | | | | | | | +#define IOMUXD__PMIC_EARLY_WARNING REG32(IOMUXD_REG_BASE+0x000020C0U) // 2 0 2 3 | SCU.PMIC_EARLY_WARNING | | | | | | | | | +#define IOMUXD__PMIC_INT_B REG32(IOMUXD_REG_BASE+0x00002100U) // 2 0 2 4 | SCU.DSC.PMIC_INT_B | | | | | | | | | +#define IOMUXD__SCU_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00002140U) // 2 0 2 5 | SCU.GPIO0.IO00 | SCU.UART0.RX | | LSIO.GPIO0.IO28 | | | | | | +#define IOMUXD__SCU_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00002180U) // 2 0 2 6 | SCU.GPIO0.IO01 | SCU.UART0.TX | | LSIO.GPIO0.IO29 | | | | | | +#define IOMUXD__SCU_GPIO0_02 REG32(IOMUXD_REG_BASE+0x00003000U) // 3 0 3 0 | SCU.GPIO0.IO02 | SCU.GPIO0.IOXX_PMIC_GPU0_ON | | LSIO.GPIO0.IO30 | | | | | | +#define IOMUXD__SCU_GPIO0_03 REG32(IOMUXD_REG_BASE+0x00003040U) // 3 0 3 1 | SCU.GPIO0.IO03 | SCU.GPIO0.IOXX_PMIC_GPU1_ON | | LSIO.GPIO0.IO31 | | | | | | +#define IOMUXD__SCU_GPIO0_04 REG32(IOMUXD_REG_BASE+0x00003080U) // 3 0 3 2 | SCU.GPIO0.IO04 | SCU.GPIO0.IOXX_PMIC_A72_ON | | LSIO.GPIO1.IO00 | | | | | | +#define IOMUXD__SCU_GPIO0_05 REG32(IOMUXD_REG_BASE+0x000030C0U) // 3 0 3 3 | SCU.GPIO0.IO05 | SCU.GPIO0.IOXX_PMIC_A53_ON | | LSIO.GPIO1.IO01 | | | | | | +#define IOMUXD__SCU_GPIO0_06 REG32(IOMUXD_REG_BASE+0x00003100U) // 3 0 3 4 | SCU.GPIO0.IO06 | SCU.TPM0.CH0 | | LSIO.GPIO1.IO02 | | | | | | +#define IOMUXD__SCU_GPIO0_07 REG32(IOMUXD_REG_BASE+0x00003140U) // 3 0 3 5 | SCU.GPIO0.IO07 | SCU.TPM0.CH1 | SCU.DSC.RTC_CLOCK_OUTPUT_32K | LSIO.GPIO1.IO03 | | | | | | +#define IOMUXD__SCU_BOOT_MODE0 REG32(IOMUXD_REG_BASE+0x00003180U) // 3 0 3 6 | SCU.DSC.BOOT_MODE0 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE1 REG32(IOMUXD_REG_BASE+0x000031C0U) // 3 0 3 7 | SCU.DSC.BOOT_MODE1 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE2 REG32(IOMUXD_REG_BASE+0x00003200U) // 3 0 3 8 | SCU.DSC.BOOT_MODE2 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE3 REG32(IOMUXD_REG_BASE+0x00003240U) // 3 0 3 9 | SCU.DSC.BOOT_MODE3 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE4 REG32(IOMUXD_REG_BASE+0x00003280U) // 3 0 3 10 | SCU.DSC.BOOT_MODE4 | SCU.PMIC_I2C.SCL | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE5 REG32(IOMUXD_REG_BASE+0x000032C0U) // 3 0 3 11 | SCU.DSC.BOOT_MODE5 | SCU.PMIC_I2C.SDA | | | | | | | | +#define IOMUXD__LVDS0_GPIO00 REG32(IOMUXD_REG_BASE+0x00004000U) // 4 0 4 0 | LVDS0.GPIO0.IO00 | LVDS0.PWM0.OUT | | LSIO.GPIO1.IO04 | | | | | | +#define IOMUXD__LVDS0_GPIO01 REG32(IOMUXD_REG_BASE+0x00004040U) // 4 0 4 1 | LVDS0.GPIO0.IO01 | | | LSIO.GPIO1.IO05 | | | | | | +#define IOMUXD__LVDS0_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00004080U) // 4 0 4 2 | LVDS0.I2C0.SCL | LVDS0.GPIO0.IO02 | | LSIO.GPIO1.IO06 | | | | | | +#define IOMUXD__LVDS0_I2C0_SDA REG32(IOMUXD_REG_BASE+0x000040C0U) // 4 0 4 3 | LVDS0.I2C0.SDA | LVDS0.GPIO0.IO03 | | LSIO.GPIO1.IO07 | | | | | | +#define IOMUXD__LVDS0_I2C1_SCL REG32(IOMUXD_REG_BASE+0x00004100U) // 4 0 4 4 | LVDS0.I2C1.SCL | DMA.UART2.TX | | LSIO.GPIO1.IO08 | | | | | | +#define IOMUXD__LVDS0_I2C1_SDA REG32(IOMUXD_REG_BASE+0x00004140U) // 4 0 4 5 | LVDS0.I2C1.SDA | DMA.UART2.RX | | LSIO.GPIO1.IO09 | | | | | | +#define IOMUXD__LVDS1_GPIO00 REG32(IOMUXD_REG_BASE+0x00004180U) // 4 0 4 6 | LVDS1.GPIO0.IO00 | LVDS1.PWM0.OUT | | LSIO.GPIO1.IO10 | | | | | | +#define IOMUXD__LVDS1_GPIO01 REG32(IOMUXD_REG_BASE+0x000041C0U) // 4 0 4 7 | LVDS1.GPIO0.IO01 | | | LSIO.GPIO1.IO11 | | | | | | +#define IOMUXD__LVDS1_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00004200U) // 4 0 4 8 | LVDS1.I2C0.SCL | LVDS1.GPIO0.IO02 | | LSIO.GPIO1.IO12 | | | | | | +#define IOMUXD__LVDS1_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00004240U) // 4 0 4 9 | LVDS1.I2C0.SDA | LVDS1.GPIO0.IO03 | | LSIO.GPIO1.IO13 | | | | | | +#define IOMUXD__LVDS1_I2C1_SCL REG32(IOMUXD_REG_BASE+0x00004280U) // 4 0 4 10 | LVDS1.I2C1.SCL | DMA.UART3.TX | | LSIO.GPIO1.IO14 | | | | | | +#define IOMUXD__LVDS1_I2C1_SDA REG32(IOMUXD_REG_BASE+0x000042C0U) // 4 0 4 11 | LVDS1.I2C1.SDA | DMA.UART3.RX | | LSIO.GPIO1.IO15 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_LVDSGPIO REG32(IOMUXD_REG_BASE+0x00004300U) // 4 0 4 12 | | | | | | | | | | +#define IOMUXD__MIPI_DSI0_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00020000U) // 5 1 0 0 | MIPI_DSI0.I2C0.SCL | | | LSIO.GPIO1.IO16 | | | | | | +#define IOMUXD__MIPI_DSI0_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00020040U) // 5 1 0 1 | MIPI_DSI0.I2C0.SDA | | | LSIO.GPIO1.IO17 | | | | | | +#define IOMUXD__MIPI_DSI0_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00020080U) // 5 1 0 2 | MIPI_DSI0.GPIO0.IO00 | MIPI_DSI0.PWM0.OUT | | LSIO.GPIO1.IO18 | | | | | | +#define IOMUXD__MIPI_DSI0_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000200C0U) // 5 1 0 3 | MIPI_DSI0.GPIO0.IO01 | | | LSIO.GPIO1.IO19 | | | | | | +#define IOMUXD__MIPI_DSI1_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00020100U) // 5 1 0 4 | MIPI_DSI1.I2C0.SCL | | | LSIO.GPIO1.IO20 | | | | | | +#define IOMUXD__MIPI_DSI1_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00020140U) // 5 1 0 5 | MIPI_DSI1.I2C0.SDA | | | LSIO.GPIO1.IO21 | | | | | | +#define IOMUXD__MIPI_DSI1_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00020180U) // 5 1 0 6 | MIPI_DSI1.GPIO0.IO00 | MIPI_DSI1.PWM0.OUT | | LSIO.GPIO1.IO22 | | | | | | +#define IOMUXD__MIPI_DSI1_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000201C0U) // 5 1 0 7 | MIPI_DSI1.GPIO0.IO01 | | | LSIO.GPIO1.IO23 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_MIPIDSIGPIO REG32(IOMUXD_REG_BASE+0x00020200U) // 5 1 0 8 | | | | | | | | | | +#define IOMUXD__MIPI_CSI0_MCLK_OUT REG32(IOMUXD_REG_BASE+0x00021000U) // 6 1 1 0 | MIPI_CSI0.ACM.MCLK_OUT | | | LSIO.GPIO1.IO24 | | | | | | +#define IOMUXD__MIPI_CSI0_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00021040U) // 6 1 1 1 | MIPI_CSI0.I2C0.SCL | | | LSIO.GPIO1.IO25 | | | | | | +#define IOMUXD__MIPI_CSI0_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00021080U) // 6 1 1 2 | MIPI_CSI0.I2C0.SDA | | | LSIO.GPIO1.IO26 | | | | | | +#define IOMUXD__MIPI_CSI0_GPIO0_00 REG32(IOMUXD_REG_BASE+0x000210C0U) // 6 1 1 3 | MIPI_CSI0.GPIO0.IO00 | DMA.I2C0.SCL | MIPI_CSI1.I2C0.SCL | LSIO.GPIO1.IO27 | | | | | | +#define IOMUXD__MIPI_CSI0_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00021100U) // 6 1 1 4 | MIPI_CSI0.GPIO0.IO01 | DMA.I2C0.SDA | MIPI_CSI1.I2C0.SDA | LSIO.GPIO1.IO28 | | | | | | +#define IOMUXD__MIPI_CSI1_MCLK_OUT REG32(IOMUXD_REG_BASE+0x00021140U) // 6 1 1 5 | MIPI_CSI1.ACM.MCLK_OUT | | | LSIO.GPIO1.IO29 | | | | | | +#define IOMUXD__MIPI_CSI1_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00021180U) // 6 1 1 6 | MIPI_CSI1.GPIO0.IO00 | DMA.UART4.RX | | LSIO.GPIO1.IO30 | | | | | | +#define IOMUXD__MIPI_CSI1_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000211C0U) // 6 1 1 7 | MIPI_CSI1.GPIO0.IO01 | DMA.UART4.TX | | LSIO.GPIO1.IO31 | | | | | | +#define IOMUXD__MIPI_CSI1_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00021200U) // 6 1 1 8 | MIPI_CSI1.I2C0.SCL | | | LSIO.GPIO2.IO00 | | | | | | +#define IOMUXD__MIPI_CSI1_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00021240U) // 6 1 1 9 | MIPI_CSI1.I2C0.SDA | | | LSIO.GPIO2.IO01 | | | | | | +#define IOMUXD__HDMI_TX0_TS_SCL REG32(IOMUXD_REG_BASE+0x00021280U) // 6 1 1 10 | HDMI_TX0.I2C0.SCL | DMA.I2C0.SCL | | LSIO.GPIO2.IO02 | | | | | | +#define IOMUXD__HDMI_TX0_TS_SDA REG32(IOMUXD_REG_BASE+0x000212C0U) // 6 1 1 11 | HDMI_TX0.I2C0.SDA | DMA.I2C0.SDA | | LSIO.GPIO2.IO03 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_HDMIGPIO REG32(IOMUXD_REG_BASE+0x00021300U) // 6 1 1 12 | | | | | | | | | | +#define IOMUXD__ESAI1_FSR REG32(IOMUXD_REG_BASE+0x00022000U) // 7 1 2 0 | AUD.ESAI1.FSR | | | LSIO.GPIO2.IO04 | | | | | | +#define IOMUXD__ESAI1_FST REG32(IOMUXD_REG_BASE+0x00022040U) // 7 1 2 1 | AUD.ESAI1.FST | AUD.SPDIF0.EXT_CLK | | LSIO.GPIO2.IO05 | | | | | | +#define IOMUXD__ESAI1_SCKR REG32(IOMUXD_REG_BASE+0x00022080U) // 7 1 2 2 | AUD.ESAI1.SCKR | | | LSIO.GPIO2.IO06 | | | | | | +#define IOMUXD__ESAI1_SCKT REG32(IOMUXD_REG_BASE+0x000220C0U) // 7 1 2 3 | AUD.ESAI1.SCKT | AUD.SAI2.RXC | AUD.SPDIF0.EXT_CLK | LSIO.GPIO2.IO07 | | | | | | +#define IOMUXD__ESAI1_TX0 REG32(IOMUXD_REG_BASE+0x00022100U) // 7 1 2 4 | AUD.ESAI1.TX0 | AUD.SAI2.RXD | AUD.SPDIF0.RX | LSIO.GPIO2.IO08 | | | | | | +#define IOMUXD__ESAI1_TX1 REG32(IOMUXD_REG_BASE+0x00022140U) // 7 1 2 5 | AUD.ESAI1.TX1 | AUD.SAI2.RXFS | AUD.SPDIF0.TX | LSIO.GPIO2.IO09 | | | | | | +#define IOMUXD__ESAI1_TX2_RX3 REG32(IOMUXD_REG_BASE+0x00022180U) // 7 1 2 6 | AUD.ESAI1.TX2_RX3 | AUD.SPDIF0.RX | | LSIO.GPIO2.IO10 | | | | | | +#define IOMUXD__ESAI1_TX3_RX2 REG32(IOMUXD_REG_BASE+0x000221C0U) // 7 1 2 7 | AUD.ESAI1.TX3_RX2 | AUD.SPDIF0.TX | | LSIO.GPIO2.IO11 | | | | | | +#define IOMUXD__ESAI1_TX4_RX1 REG32(IOMUXD_REG_BASE+0x00022200U) // 7 1 2 8 | AUD.ESAI1.TX4_RX1 | | | LSIO.GPIO2.IO12 | | | | | | +#define IOMUXD__ESAI1_TX5_RX0 REG32(IOMUXD_REG_BASE+0x00022240U) // 7 1 2 9 | AUD.ESAI1.TX5_RX0 | | | LSIO.GPIO2.IO13 | | | | | | +#define IOMUXD__SPDIF0_RX REG32(IOMUXD_REG_BASE+0x00022280U) // 7 1 2 10 | AUD.SPDIF0.RX | AUD.MQS.R | AUD.ACM.MCLK_IN1 | LSIO.GPIO2.IO14 | | | | | | +#define IOMUXD__SPDIF0_TX REG32(IOMUXD_REG_BASE+0x000222C0U) // 7 1 2 11 | AUD.SPDIF0.TX | AUD.MQS.L | AUD.ACM.MCLK_OUT1 | LSIO.GPIO2.IO15 | | | | | | +#define IOMUXD__SPDIF0_EXT_CLK REG32(IOMUXD_REG_BASE+0x00022300U) // 7 1 2 12 | AUD.SPDIF0.EXT_CLK | DMA.DMA0.REQ_IN0 | | LSIO.GPIO2.IO16 | | | | | | +#define IOMUXD__SPI3_SCK REG32(IOMUXD_REG_BASE+0x00022340U) // 7 1 2 13 | DMA.SPI3.SCK | | | LSIO.GPIO2.IO17 | | | | | | +#define IOMUXD__SPI3_SDO REG32(IOMUXD_REG_BASE+0x00022380U) // 7 1 2 14 | DMA.SPI3.SDO | DMA.FTM.CH0 | | LSIO.GPIO2.IO18 | | | | | | +#define IOMUXD__SPI3_SDI REG32(IOMUXD_REG_BASE+0x00023000U) // 8 1 3 0 | DMA.SPI3.SDI | DMA.FTM.CH1 | | LSIO.GPIO2.IO19 | | | | | | +#define IOMUXD__SPI3_CS0 REG32(IOMUXD_REG_BASE+0x00023040U) // 8 1 3 1 | DMA.SPI3.CS0 | DMA.FTM.CH2 | | LSIO.GPIO2.IO20 | | | | | | +#define IOMUXD__SPI3_CS1 REG32(IOMUXD_REG_BASE+0x00023080U) // 8 1 3 2 | DMA.SPI3.CS1 | | | LSIO.GPIO2.IO21 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHB REG32(IOMUXD_REG_BASE+0x000230C0U) // 8 1 3 3 | | | | | | | | | | +#define IOMUXD__ESAI0_FSR REG32(IOMUXD_REG_BASE+0x00023100U) // 8 1 3 4 | AUD.ESAI0.FSR | | | LSIO.GPIO2.IO22 | | | | | | +#define IOMUXD__ESAI0_FST REG32(IOMUXD_REG_BASE+0x00023140U) // 8 1 3 5 | AUD.ESAI0.FST | | | LSIO.GPIO2.IO23 | | | | | | +#define IOMUXD__ESAI0_SCKR REG32(IOMUXD_REG_BASE+0x00023180U) // 8 1 3 6 | AUD.ESAI0.SCKR | | | LSIO.GPIO2.IO24 | | | | | | +#define IOMUXD__ESAI0_SCKT REG32(IOMUXD_REG_BASE+0x000231C0U) // 8 1 3 7 | AUD.ESAI0.SCKT | | | LSIO.GPIO2.IO25 | | | | | | +#define IOMUXD__ESAI0_TX0 REG32(IOMUXD_REG_BASE+0x00023200U) // 8 1 3 8 | AUD.ESAI0.TX0 | | | LSIO.GPIO2.IO26 | | | | | | +#define IOMUXD__ESAI0_TX1 REG32(IOMUXD_REG_BASE+0x00023240U) // 8 1 3 9 | AUD.ESAI0.TX1 | | | LSIO.GPIO2.IO27 | | | | | | +#define IOMUXD__ESAI0_TX2_RX3 REG32(IOMUXD_REG_BASE+0x00023280U) // 8 1 3 10 | AUD.ESAI0.TX2_RX3 | | | LSIO.GPIO2.IO28 | | | | | | +#define IOMUXD__ESAI0_TX3_RX2 REG32(IOMUXD_REG_BASE+0x000232C0U) // 8 1 3 11 | AUD.ESAI0.TX3_RX2 | | | LSIO.GPIO2.IO29 | | | | | | +#define IOMUXD__ESAI0_TX4_RX1 REG32(IOMUXD_REG_BASE+0x00023300U) // 8 1 3 12 | AUD.ESAI0.TX4_RX1 | | | LSIO.GPIO2.IO30 | | | | | | +#define IOMUXD__ESAI0_TX5_RX0 REG32(IOMUXD_REG_BASE+0x00023340U) // 8 1 3 13 | AUD.ESAI0.TX5_RX0 | | | LSIO.GPIO2.IO31 | | | | | | +#define IOMUXD__MCLK_IN0 REG32(IOMUXD_REG_BASE+0x00023380U) // 8 1 3 14 | AUD.ACM.MCLK_IN0 | AUD.ESAI0.RX_HF_CLK | AUD.ESAI1.RX_HF_CLK | LSIO.GPIO3.IO00 | | | | | | +#define IOMUXD__MCLK_OUT0 REG32(IOMUXD_REG_BASE+0x00024000U) // 9 1 4 0 | AUD.ACM.MCLK_OUT0 | AUD.ESAI0.TX_HF_CLK | AUD.ESAI1.TX_HF_CLK | LSIO.GPIO3.IO01 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHC REG32(IOMUXD_REG_BASE+0x00024040U) // 9 1 4 1 | | | | | | | | | | +#define IOMUXD__SPI0_SCK REG32(IOMUXD_REG_BASE+0x00024080U) // 9 1 4 2 | DMA.SPI0.SCK | AUD.SAI0.RXC | | LSIO.GPIO3.IO02 | | | | | | +#define IOMUXD__SPI0_SDO REG32(IOMUXD_REG_BASE+0x000240C0U) // 9 1 4 3 | DMA.SPI0.SDO | AUD.SAI0.TXD | | LSIO.GPIO3.IO03 | | | | | | +#define IOMUXD__SPI0_SDI REG32(IOMUXD_REG_BASE+0x00024100U) // 9 1 4 4 | DMA.SPI0.SDI | AUD.SAI0.RXD | | LSIO.GPIO3.IO04 | | | | | | +#define IOMUXD__SPI0_CS0 REG32(IOMUXD_REG_BASE+0x00024140U) // 9 1 4 5 | DMA.SPI0.CS0 | AUD.SAI0.RXFS | | LSIO.GPIO3.IO05 | | | | | | +#define IOMUXD__SPI0_CS1 REG32(IOMUXD_REG_BASE+0x00024180U) // 9 1 4 6 | DMA.SPI0.CS1 | AUD.SAI0.TXC | | LSIO.GPIO3.IO06 | | | | | | +#define IOMUXD__SPI2_SCK REG32(IOMUXD_REG_BASE+0x000241C0U) // 9 1 4 7 | DMA.SPI2.SCK | | | LSIO.GPIO3.IO07 | | | | | | +#define IOMUXD__SPI2_SDO REG32(IOMUXD_REG_BASE+0x00024200U) // 9 1 4 8 | DMA.SPI2.SDO | | | LSIO.GPIO3.IO08 | | | | | | +#define IOMUXD__SPI2_SDI REG32(IOMUXD_REG_BASE+0x00024240U) // 9 1 4 9 | DMA.SPI2.SDI | | | LSIO.GPIO3.IO09 | | | | | | +#define IOMUXD__SPI2_CS0 REG32(IOMUXD_REG_BASE+0x00024280U) // 9 1 4 10 | DMA.SPI2.CS0 | | | LSIO.GPIO3.IO10 | | | | | | +#define IOMUXD__SPI2_CS1 REG32(IOMUXD_REG_BASE+0x000242C0U) // 9 1 4 11 | DMA.SPI2.CS1 | AUD.SAI0.TXFS | | LSIO.GPIO3.IO11 | | | | | | +#define IOMUXD__SAI1_RXC REG32(IOMUXD_REG_BASE+0x00024300U) // 9 1 4 12 | AUD.SAI1.RXC | AUD.SAI0.TXD | | LSIO.GPIO3.IO12 | | | | | | +#define IOMUXD__SAI1_RXD REG32(IOMUXD_REG_BASE+0x00024340U) // 9 1 4 13 | AUD.SAI1.RXD | AUD.SAI0.TXFS | | LSIO.GPIO3.IO13 | | | | | | +#define IOMUXD__SAI1_RXFS REG32(IOMUXD_REG_BASE+0x00024380U) // 9 1 4 14 | AUD.SAI1.RXFS | AUD.SAI0.RXD | | LSIO.GPIO3.IO14 | | | | | | +#define IOMUXD__SAI1_TXC REG32(IOMUXD_REG_BASE+0x00025000U) // 10 1 5 0 | AUD.SAI1.TXC | AUD.SAI0.TXC | | LSIO.GPIO3.IO15 | | | | | | +#define IOMUXD__SAI1_TXD REG32(IOMUXD_REG_BASE+0x00025040U) // 10 1 5 1 | AUD.SAI1.TXD | AUD.SAI1.RXC | | LSIO.GPIO3.IO16 | | | | | | +#define IOMUXD__SAI1_TXFS REG32(IOMUXD_REG_BASE+0x00025080U) // 10 1 5 2 | AUD.SAI1.TXFS | AUD.SAI1.RXFS | | LSIO.GPIO3.IO17 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHT REG32(IOMUXD_REG_BASE+0x000250C0U) // 10 1 5 3 | | | | | | | | | | +#define IOMUXD__ADC_IN7 REG32(IOMUXD_REG_BASE+0x00025100U) // 10 1 5 4 | DMA.ADC1.IN3 | DMA.SPI1.CS1 | LSIO.KPP0.ROW3 | LSIO.GPIO3.IO25 | | | | | | +#define IOMUXD__ADC_IN6 REG32(IOMUXD_REG_BASE+0x00025140U) // 10 1 5 5 | DMA.ADC1.IN2 | DMA.SPI1.CS0 | LSIO.KPP0.ROW2 | LSIO.GPIO3.IO24 | | | | | | +#define IOMUXD__ADC_IN5 REG32(IOMUXD_REG_BASE+0x00025180U) // 10 1 5 6 | DMA.ADC1.IN1 | DMA.SPI1.SDI | LSIO.KPP0.ROW1 | LSIO.GPIO3.IO23 | | | | | | +#define IOMUXD__ADC_IN4 REG32(IOMUXD_REG_BASE+0x000251C0U) // 10 1 5 7 | DMA.ADC1.IN0 | DMA.SPI1.SDO | LSIO.KPP0.ROW0 | LSIO.GPIO3.IO22 | | | | | | +#define IOMUXD__ADC_IN3 REG32(IOMUXD_REG_BASE+0x00025200U) // 10 1 5 8 | DMA.ADC0.IN3 | DMA.SPI1.SCK | LSIO.KPP0.COL3 | LSIO.GPIO3.IO21 | | | | | | +#define IOMUXD__ADC_IN2 REG32(IOMUXD_REG_BASE+0x00025240U) // 10 1 5 9 | DMA.ADC0.IN2 | | LSIO.KPP0.COL2 | LSIO.GPIO3.IO20 | | | | | | +#define IOMUXD__ADC_IN1 REG32(IOMUXD_REG_BASE+0x00025280U) // 10 1 5 10 | DMA.ADC0.IN1 | | LSIO.KPP0.COL1 | LSIO.GPIO3.IO19 | | | | | | +#define IOMUXD__ADC_IN0 REG32(IOMUXD_REG_BASE+0x000252C0U) // 10 1 5 11 | DMA.ADC0.IN0 | | LSIO.KPP0.COL0 | LSIO.GPIO3.IO18 | | | | | | +#define IOMUXD__MLB_SIG REG32(IOMUXD_REG_BASE+0x00040000U) // 11 2 0 0 | CONN.MLB.SIG | AUD.SAI3.RXC | | LSIO.GPIO3.IO26 | | | | | | +#define IOMUXD__MLB_CLK REG32(IOMUXD_REG_BASE+0x00040040U) // 11 2 0 1 | CONN.MLB.CLK | AUD.SAI3.RXFS | | LSIO.GPIO3.IO27 | | | | | | +#define IOMUXD__MLB_DATA REG32(IOMUXD_REG_BASE+0x00040080U) // 11 2 0 2 | CONN.MLB.DATA | AUD.SAI3.RXD | | LSIO.GPIO3.IO28 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLHT REG32(IOMUXD_REG_BASE+0x000400C0U) // 11 2 0 3 | | | | | | | | | | +#define IOMUXD__FLEXCAN0_RX REG32(IOMUXD_REG_BASE+0x00040100U) // 11 2 0 4 | DMA.FLEXCAN0.RX | | | LSIO.GPIO3.IO29 | | | | | | +#define IOMUXD__FLEXCAN0_TX REG32(IOMUXD_REG_BASE+0x00040140U) // 11 2 0 5 | DMA.FLEXCAN0.TX | | | LSIO.GPIO3.IO30 | | | | | | +#define IOMUXD__FLEXCAN1_RX REG32(IOMUXD_REG_BASE+0x00040180U) // 11 2 0 6 | DMA.FLEXCAN1.RX | | | LSIO.GPIO3.IO31 | | | | | | +#define IOMUXD__FLEXCAN1_TX REG32(IOMUXD_REG_BASE+0x000401C0U) // 11 2 0 7 | DMA.FLEXCAN1.TX | | | LSIO.GPIO4.IO00 | | | | | | +#define IOMUXD__FLEXCAN2_RX REG32(IOMUXD_REG_BASE+0x00040200U) // 11 2 0 8 | DMA.FLEXCAN2.RX | | | LSIO.GPIO4.IO01 | | | | | | +#define IOMUXD__FLEXCAN2_TX REG32(IOMUXD_REG_BASE+0x00040240U) // 11 2 0 9 | DMA.FLEXCAN2.TX | | | LSIO.GPIO4.IO02 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOTHR REG32(IOMUXD_REG_BASE+0x00040280U) // 11 2 0 10 | | | | | | | | | | +#define IOMUXD__USB_SS3_TC0 REG32(IOMUXD_REG_BASE+0x000402C0U) // 11 2 0 11 | DMA.I2C1.SCL | CONN.USB_OTG1.PWR | | LSIO.GPIO4.IO03 | | | | | | +#define IOMUXD__USB_SS3_TC1 REG32(IOMUXD_REG_BASE+0x00040300U) // 11 2 0 12 | DMA.I2C1.SCL | CONN.USB_OTG2.PWR | | LSIO.GPIO4.IO04 | | | | | | +#define IOMUXD__USB_SS3_TC2 REG32(IOMUXD_REG_BASE+0x00040340U) // 11 2 0 13 | DMA.I2C1.SDA | CONN.USB_OTG1.OC | | LSIO.GPIO4.IO05 | | | | | | +#define IOMUXD__USB_SS3_TC3 REG32(IOMUXD_REG_BASE+0x00040380U) // 11 2 0 14 | DMA.I2C1.SDA | CONN.USB_OTG2.OC | | LSIO.GPIO4.IO06 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_USB3IO REG32(IOMUXD_REG_BASE+0x000403C0U) // 11 2 0 15 | | | | | | | | | | +#define IOMUXD__USDHC1_RESET_B REG32(IOMUXD_REG_BASE+0x00041000U) // 12 2 1 0 | CONN.USDHC1.RESET_B | | | LSIO.GPIO4.IO07 | | | | | | +#define IOMUXD__USDHC1_VSELECT REG32(IOMUXD_REG_BASE+0x00041040U) // 12 2 1 1 | CONN.USDHC1.VSELECT | | | LSIO.GPIO4.IO08 | | | | | | +#define IOMUXD__USDHC2_RESET_B REG32(IOMUXD_REG_BASE+0x00041080U) // 12 2 1 2 | CONN.USDHC2.RESET_B | | | LSIO.GPIO4.IO09 | | | | | | +#define IOMUXD__USDHC2_VSELECT REG32(IOMUXD_REG_BASE+0x000410C0U) // 12 2 1 3 | CONN.USDHC2.VSELECT | | | LSIO.GPIO4.IO10 | | | | | | +#define IOMUXD__USDHC2_WP REG32(IOMUXD_REG_BASE+0x00041100U) // 12 2 1 4 | CONN.USDHC2.WP | | | LSIO.GPIO4.IO11 | | | | | | +#define IOMUXD__USDHC2_CD_B REG32(IOMUXD_REG_BASE+0x00041140U) // 12 2 1 5 | CONN.USDHC2.CD_B | | | LSIO.GPIO4.IO12 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSELSEP REG32(IOMUXD_REG_BASE+0x00041180U) // 12 2 1 6 | | | | | | | | | | +#define IOMUXD__ENET0_MDIO REG32(IOMUXD_REG_BASE+0x000411C0U) // 12 2 1 7 | CONN.ENET0.MDIO | DMA.I2C4.SDA | | LSIO.GPIO4.IO13 | | | | | | +#define IOMUXD__ENET0_MDC REG32(IOMUXD_REG_BASE+0x00041200U) // 12 2 1 8 | CONN.ENET0.MDC | DMA.I2C4.SCL | | LSIO.GPIO4.IO14 | | | | | | +#define IOMUXD__ENET0_REFCLK_125M_25M REG32(IOMUXD_REG_BASE+0x00041240U) // 12 2 1 9 | CONN.ENET0.REFCLK_125M_25M | CONN.ENET0.PPS | | LSIO.GPIO4.IO15 | | | | | | +#define IOMUXD__ENET1_REFCLK_125M_25M REG32(IOMUXD_REG_BASE+0x00041280U) // 12 2 1 10 | CONN.ENET1.REFCLK_125M_25M | CONN.ENET1.PPS | | LSIO.GPIO4.IO16 | | | | | | +#define IOMUXD__ENET1_MDIO REG32(IOMUXD_REG_BASE+0x000412C0U) // 12 2 1 11 | CONN.ENET1.MDIO | DMA.I2C4.SDA | | LSIO.GPIO4.IO17 | | | | | | +#define IOMUXD__ENET1_MDC REG32(IOMUXD_REG_BASE+0x00041300U) // 12 2 1 12 | CONN.ENET1.MDC | DMA.I2C4.SCL | | LSIO.GPIO4.IO18 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOCT REG32(IOMUXD_REG_BASE+0x00041340U) // 12 2 1 13 | | | | | | | | | | +#define IOMUXD__QSPI1A_SS0_B REG32(IOMUXD_REG_BASE+0x00041380U) // 12 2 1 14 | LSIO.QSPI1A.SS0_B | | | LSIO.GPIO4.IO19 | | | | | | +#define IOMUXD__QSPI1A_SS1_B REG32(IOMUXD_REG_BASE+0x00042000U) // 13 2 2 0 | LSIO.QSPI1A.SS1_B | LSIO.QSPI1A.SCLK2 | | LSIO.GPIO4.IO20 | | | | | | +#define IOMUXD__QSPI1A_SCLK REG32(IOMUXD_REG_BASE+0x00042040U) // 13 2 2 1 | LSIO.QSPI1A.SCLK | | | LSIO.GPIO4.IO21 | | | | | | +#define IOMUXD__QSPI1A_DQS REG32(IOMUXD_REG_BASE+0x00042080U) // 13 2 2 2 | LSIO.QSPI1A.DQS | | | LSIO.GPIO4.IO22 | | | | | | +#define IOMUXD__QSPI1A_DATA3 REG32(IOMUXD_REG_BASE+0x000420C0U) // 13 2 2 3 | LSIO.QSPI1A.DATA3 | DMA.I2C1.SDA | CONN.USB_OTG1.OC | LSIO.GPIO4.IO23 | | | | | | +#define IOMUXD__QSPI1A_DATA2 REG32(IOMUXD_REG_BASE+0x00042100U) // 13 2 2 4 | LSIO.QSPI1A.DATA2 | DMA.I2C1.SCL | CONN.USB_OTG2.PWR | LSIO.GPIO4.IO24 | | | | | | +#define IOMUXD__QSPI1A_DATA1 REG32(IOMUXD_REG_BASE+0x00042140U) // 13 2 2 5 | LSIO.QSPI1A.DATA1 | DMA.I2C1.SDA | CONN.USB_OTG2.OC | LSIO.GPIO4.IO25 | | | | | | +#define IOMUXD__QSPI1A_DATA0 REG32(IOMUXD_REG_BASE+0x00042180U) // 13 2 2 6 | LSIO.QSPI1A.DATA0 | | | LSIO.GPIO4.IO26 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI1 REG32(IOMUXD_REG_BASE+0x000421C0U) // 13 2 2 7 | | | | | | | | | | +#define IOMUXD__QSPI0A_DATA0 REG32(IOMUXD_REG_BASE+0x00043000U) // 14 2 3 0 | LSIO.QSPI0A.DATA0 | | | | | | | | | +#define IOMUXD__QSPI0A_DATA1 REG32(IOMUXD_REG_BASE+0x00043040U) // 14 2 3 1 | LSIO.QSPI0A.DATA1 | | | | | | | | | +#define IOMUXD__QSPI0A_DATA2 REG32(IOMUXD_REG_BASE+0x00043080U) // 14 2 3 2 | LSIO.QSPI0A.DATA2 | | | | | | | | | +#define IOMUXD__QSPI0A_DATA3 REG32(IOMUXD_REG_BASE+0x000430C0U) // 14 2 3 3 | LSIO.QSPI0A.DATA3 | | | | | | | | | +#define IOMUXD__QSPI0A_DQS REG32(IOMUXD_REG_BASE+0x00043100U) // 14 2 3 4 | LSIO.QSPI0A.DQS | | | | | | | | | +#define IOMUXD__QSPI0A_SS0_B REG32(IOMUXD_REG_BASE+0x00043140U) // 14 2 3 5 | LSIO.QSPI0A.SS0_B | | | | | | | | | +#define IOMUXD__QSPI0A_SS1_B REG32(IOMUXD_REG_BASE+0x00043180U) // 14 2 3 6 | LSIO.QSPI0A.SS1_B | LSIO.QSPI0A.SCLK2 | | | | | | | | +#define IOMUXD__QSPI0A_SCLK REG32(IOMUXD_REG_BASE+0x000431C0U) // 14 2 3 7 | LSIO.QSPI0A.SCLK | | | | | | | | | +#define IOMUXD__QSPI0B_SCLK REG32(IOMUXD_REG_BASE+0x00043200U) // 14 2 3 8 | LSIO.QSPI0B.SCLK | | | | | | | | | +#define IOMUXD__QSPI0B_DATA0 REG32(IOMUXD_REG_BASE+0x00043240U) // 14 2 3 9 | LSIO.QSPI0B.DATA0 | | | | | | | | | +#define IOMUXD__QSPI0B_DATA1 REG32(IOMUXD_REG_BASE+0x00043280U) // 14 2 3 10 | LSIO.QSPI0B.DATA1 | | | | | | | | | +#define IOMUXD__QSPI0B_DATA2 REG32(IOMUXD_REG_BASE+0x000432C0U) // 14 2 3 11 | LSIO.QSPI0B.DATA2 | | | | | | | | | +#define IOMUXD__QSPI0B_DATA3 REG32(IOMUXD_REG_BASE+0x00043300U) // 14 2 3 12 | LSIO.QSPI0B.DATA3 | | | | | | | | | +#define IOMUXD__QSPI0B_DQS REG32(IOMUXD_REG_BASE+0x00043340U) // 14 2 3 13 | LSIO.QSPI0B.DQS | | | | | | | | | +#define IOMUXD__QSPI0B_SS0_B REG32(IOMUXD_REG_BASE+0x00043380U) // 14 2 3 14 | LSIO.QSPI0B.SS0_B | | | | | | | | | +#define IOMUXD__QSPI0B_SS1_B REG32(IOMUXD_REG_BASE+0x00044000U) // 15 2 4 0 | LSIO.QSPI0B.SS1_B | LSIO.QSPI0B.SCLK2 | | | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0 REG32(IOMUXD_REG_BASE+0x00044040U) // 15 2 4 1 | | | | | | | | | | +#define IOMUXD__PCIE_CTRL0_CLKREQ_B REG32(IOMUXD_REG_BASE+0x00044080U) // 15 2 4 2 | HSIO.PCIE0.CLKREQ_B | | | LSIO.GPIO4.IO27 | | | | | | +#define IOMUXD__PCIE_CTRL0_WAKE_B REG32(IOMUXD_REG_BASE+0x000440C0U) // 15 2 4 3 | HSIO.PCIE0.WAKE_B | | | LSIO.GPIO4.IO28 | | | | | | +#define IOMUXD__PCIE_CTRL0_PERST_B REG32(IOMUXD_REG_BASE+0x00044100U) // 15 2 4 4 | HSIO.PCIE0.PERST_B | | | LSIO.GPIO4.IO29 | | | | | | +#define IOMUXD__PCIE_CTRL1_CLKREQ_B REG32(IOMUXD_REG_BASE+0x00044140U) // 15 2 4 5 | HSIO.PCIE1.CLKREQ_B | DMA.I2C1.SDA | CONN.USB_OTG2.OC | LSIO.GPIO4.IO30 | | | | | | +#define IOMUXD__PCIE_CTRL1_WAKE_B REG32(IOMUXD_REG_BASE+0x00044180U) // 15 2 4 6 | HSIO.PCIE1.WAKE_B | DMA.I2C1.SCL | CONN.USB_OTG2.PWR | LSIO.GPIO4.IO31 | | | | | | +#define IOMUXD__PCIE_CTRL1_PERST_B REG32(IOMUXD_REG_BASE+0x000441C0U) // 15 2 4 7 | HSIO.PCIE1.PERST_B | DMA.I2C1.SCL | CONN.USB_OTG1.PWR | LSIO.GPIO5.IO00 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_PCIESEP REG32(IOMUXD_REG_BASE+0x00044200U) // 15 2 4 8 | | | | | | | | | | +#define IOMUXD__USB_HSIC0_DATA REG32(IOMUXD_REG_BASE+0x00045000U) // 16 2 5 0 | CONN.USB_HSIC0.DATA | DMA.I2C1.SDA | | LSIO.GPIO5.IO01 | | | | | | +#define IOMUXD__USB_HSIC0_STROBE REG32(IOMUXD_REG_BASE+0x00045040U) // 16 2 5 1 | CONN.USB_HSIC0.STROBE | DMA.I2C1.SCL | | LSIO.GPIO5.IO02 | | | | | | +#define IOMUXD__IOMUXD_CALIBRATION_0_HSIC REG32(IOMUXD_REG_BASE+0x00045080U) // 16 2 5 2 | | | | | | | | | | +#define IOMUXD__IOMUXD_CALIBRATION_1_HSIC REG32(IOMUXD_REG_BASE+0x000450C0U) // 16 2 5 3 | | | | | | | | | | +#define IOMUXD__EMMC0_CLK REG32(IOMUXD_REG_BASE+0x00060000U) // 17 3 0 0 | CONN.EMMC0.CLK | CONN.NAND.READY_B | | | | | | | | +#define IOMUXD__EMMC0_CMD REG32(IOMUXD_REG_BASE+0x00060040U) // 17 3 0 1 | CONN.EMMC0.CMD | CONN.NAND.DQS | AUD.MQS.R | LSIO.GPIO5.IO03 | | | | | | +#define IOMUXD__EMMC0_DATA0 REG32(IOMUXD_REG_BASE+0x00060080U) // 17 3 0 2 | CONN.EMMC0.DATA0 | CONN.NAND.DATA00 | | LSIO.GPIO5.IO04 | | | | | | +#define IOMUXD__EMMC0_DATA1 REG32(IOMUXD_REG_BASE+0x000600C0U) // 17 3 0 3 | CONN.EMMC0.DATA1 | CONN.NAND.DATA01 | | LSIO.GPIO5.IO05 | | | | | | +#define IOMUXD__EMMC0_DATA2 REG32(IOMUXD_REG_BASE+0x00060100U) // 17 3 0 4 | CONN.EMMC0.DATA2 | CONN.NAND.DATA02 | | LSIO.GPIO5.IO06 | | | | | | +#define IOMUXD__EMMC0_DATA3 REG32(IOMUXD_REG_BASE+0x00060140U) // 17 3 0 5 | CONN.EMMC0.DATA3 | CONN.NAND.DATA03 | | LSIO.GPIO5.IO07 | | | | | | +#define IOMUXD__EMMC0_DATA4 REG32(IOMUXD_REG_BASE+0x00060180U) // 17 3 0 6 | CONN.EMMC0.DATA4 | CONN.NAND.DATA04 | | LSIO.GPIO5.IO08 | | | | | | +#define IOMUXD__EMMC0_DATA5 REG32(IOMUXD_REG_BASE+0x000601C0U) // 17 3 0 7 | CONN.EMMC0.DATA5 | CONN.NAND.DATA05 | | LSIO.GPIO5.IO09 | | | | | | +#define IOMUXD__EMMC0_DATA6 REG32(IOMUXD_REG_BASE+0x00060200U) // 17 3 0 8 | CONN.EMMC0.DATA6 | CONN.NAND.DATA06 | | LSIO.GPIO5.IO10 | | | | | | +#define IOMUXD__EMMC0_DATA7 REG32(IOMUXD_REG_BASE+0x00060240U) // 17 3 0 9 | CONN.EMMC0.DATA7 | CONN.NAND.DATA07 | | LSIO.GPIO5.IO11 | | | | | | +#define IOMUXD__EMMC0_STROBE REG32(IOMUXD_REG_BASE+0x00060280U) // 17 3 0 10 | CONN.EMMC0.STROBE | CONN.NAND.CLE | | LSIO.GPIO5.IO12 | | | | | | +#define IOMUXD__EMMC0_RESET_B REG32(IOMUXD_REG_BASE+0x000602C0U) // 17 3 0 11 | CONN.EMMC0.RESET_B | CONN.NAND.WP_B | CONN.USDHC1.VSELECT | LSIO.GPIO5.IO13 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SD1FIX REG32(IOMUXD_REG_BASE+0x00060300U) // 17 3 0 12 | | | | | | | | | | +#define IOMUXD__USDHC1_CLK REG32(IOMUXD_REG_BASE+0x00060340U) // 17 3 0 13 | CONN.USDHC1.CLK | AUD.MQS.R | | | | | | | | +#define IOMUXD__USDHC1_CMD REG32(IOMUXD_REG_BASE+0x00060380U) // 17 3 0 14 | CONN.USDHC1.CMD | AUD.MQS.L | | LSIO.GPIO5.IO14 | | | | | | +#define IOMUXD__USDHC1_DATA0 REG32(IOMUXD_REG_BASE+0x000603C0U) // 17 3 0 15 | CONN.USDHC1.DATA0 | CONN.NAND.RE_N | | LSIO.GPIO5.IO15 | | | | | | +#define IOMUXD__USDHC1_DATA1 REG32(IOMUXD_REG_BASE+0x00061000U) // 18 3 1 0 | CONN.USDHC1.DATA1 | CONN.NAND.RE_P | | LSIO.GPIO5.IO16 | | | | | | +#define IOMUXD__IOMUXD_CTL_NAND_RE_P_N REG32(IOMUXD_REG_BASE+0x00061040U) // 18 3 1 1 | | | | | | | | | | +#define IOMUXD__USDHC1_DATA2 REG32(IOMUXD_REG_BASE+0x00061080U) // 18 3 1 2 | CONN.USDHC1.DATA2 | CONN.NAND.DQS_N | | LSIO.GPIO5.IO17 | | | | | | +#define IOMUXD__USDHC1_DATA3 REG32(IOMUXD_REG_BASE+0x000610C0U) // 18 3 1 3 | CONN.USDHC1.DATA3 | CONN.NAND.DQS_P | | LSIO.GPIO5.IO18 | | | | | | +#define IOMUXD__IOMUXD_CTL_NAND_DQS_P_N REG32(IOMUXD_REG_BASE+0x00061100U) // 18 3 1 4 | | | | | | | | | | +#define IOMUXD__USDHC1_DATA4 REG32(IOMUXD_REG_BASE+0x00061140U) // 18 3 1 5 | CONN.USDHC1.DATA4 | CONN.NAND.CE0_B | AUD.MQS.R | LSIO.GPIO5.IO19 | | | | | | +#define IOMUXD__USDHC1_DATA5 REG32(IOMUXD_REG_BASE+0x00061180U) // 18 3 1 6 | CONN.USDHC1.DATA5 | CONN.NAND.RE_B | AUD.MQS.L | LSIO.GPIO5.IO20 | | | | | | +#define IOMUXD__USDHC1_DATA6 REG32(IOMUXD_REG_BASE+0x000611C0U) // 18 3 1 7 | CONN.USDHC1.DATA6 | CONN.NAND.WE_B | CONN.USDHC1.WP | LSIO.GPIO5.IO21 | | | | | | +#define IOMUXD__USDHC1_DATA7 REG32(IOMUXD_REG_BASE+0x00061200U) // 18 3 1 8 | CONN.USDHC1.DATA7 | CONN.NAND.ALE | CONN.USDHC1.CD_B | LSIO.GPIO5.IO22 | | | | | | +#define IOMUXD__USDHC1_STROBE REG32(IOMUXD_REG_BASE+0x00061240U) // 18 3 1 9 | CONN.USDHC1.STROBE | CONN.NAND.CE1_B | CONN.USDHC1.RESET_B | LSIO.GPIO5.IO23 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSEL2 REG32(IOMUXD_REG_BASE+0x00061280U) // 18 3 1 10 | | | | | | | | | | +#define IOMUXD__USDHC2_CLK REG32(IOMUXD_REG_BASE+0x000612C0U) // 18 3 1 11 | CONN.USDHC2.CLK | AUD.MQS.R | | LSIO.GPIO5.IO24 | | | | | | +#define IOMUXD__USDHC2_CMD REG32(IOMUXD_REG_BASE+0x00061300U) // 18 3 1 12 | CONN.USDHC2.CMD | AUD.MQS.L | | LSIO.GPIO5.IO25 | | | | | | +#define IOMUXD__USDHC2_DATA0 REG32(IOMUXD_REG_BASE+0x00061340U) // 18 3 1 13 | CONN.USDHC2.DATA0 | DMA.UART4.RX | | LSIO.GPIO5.IO26 | | | | | | +#define IOMUXD__USDHC2_DATA1 REG32(IOMUXD_REG_BASE+0x00061380U) // 18 3 1 14 | CONN.USDHC2.DATA1 | DMA.UART4.TX | | LSIO.GPIO5.IO27 | | | | | | +#define IOMUXD__USDHC2_DATA2 REG32(IOMUXD_REG_BASE+0x000613C0U) // 18 3 1 15 | CONN.USDHC2.DATA2 | DMA.UART4.CTS_B | | LSIO.GPIO5.IO28 | | | | | | +#define IOMUXD__USDHC2_DATA3 REG32(IOMUXD_REG_BASE+0x00062000U) // 19 3 2 0 | CONN.USDHC2.DATA3 | DMA.UART4.RTS_B | | LSIO.GPIO5.IO29 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSEL3 REG32(IOMUXD_REG_BASE+0x00062040U) // 19 3 2 1 | | | | | | | | | | +#define IOMUXD__ENET0_RGMII_TXC REG32(IOMUXD_REG_BASE+0x00062080U) // 19 3 2 2 | CONN.ENET0.RGMII_TXC | CONN.ENET0.RCLK50M_OUT | CONN.ENET0.RCLK50M_IN | LSIO.GPIO5.IO30 | | | | | | +#define IOMUXD__ENET0_RGMII_TX_CTL REG32(IOMUXD_REG_BASE+0x000620C0U) // 19 3 2 3 | CONN.ENET0.RGMII_TX_CTL | | | LSIO.GPIO5.IO31 | | | | | | +#define IOMUXD__ENET0_RGMII_TXD0 REG32(IOMUXD_REG_BASE+0x00062100U) // 19 3 2 4 | CONN.ENET0.RGMII_TXD0 | | | LSIO.GPIO6.IO00 | | | | | | +#define IOMUXD__ENET0_RGMII_TXD1 REG32(IOMUXD_REG_BASE+0x00062140U) // 19 3 2 5 | CONN.ENET0.RGMII_TXD1 | | | LSIO.GPIO6.IO01 | | | | | | +#define IOMUXD__ENET0_RGMII_TXD2 REG32(IOMUXD_REG_BASE+0x00062180U) // 19 3 2 6 | CONN.ENET0.RGMII_TXD2 | DMA.UART3.TX | VPU.TSI_S1.VID | LSIO.GPIO6.IO02 | | | | | | +#define IOMUXD__ENET0_RGMII_TXD3 REG32(IOMUXD_REG_BASE+0x000621C0U) // 19 3 2 7 | CONN.ENET0.RGMII_TXD3 | DMA.UART3.RTS_B | VPU.TSI_S1.SYNC | LSIO.GPIO6.IO03 | | | | | | +#define IOMUXD__ENET0_RGMII_RXC REG32(IOMUXD_REG_BASE+0x00062200U) // 19 3 2 8 | CONN.ENET0.RGMII_RXC | DMA.UART3.CTS_B | VPU.TSI_S1.DATA | LSIO.GPIO6.IO04 | | | | | | +#define IOMUXD__ENET0_RGMII_RX_CTL REG32(IOMUXD_REG_BASE+0x00062240U) // 19 3 2 9 | CONN.ENET0.RGMII_RX_CTL | | VPU.TSI_S0.VID | LSIO.GPIO6.IO05 | | | | | | +#define IOMUXD__ENET0_RGMII_RXD0 REG32(IOMUXD_REG_BASE+0x00062280U) // 19 3 2 10 | CONN.ENET0.RGMII_RXD0 | | VPU.TSI_S0.SYNC | LSIO.GPIO6.IO06 | | | | | | +#define IOMUXD__ENET0_RGMII_RXD1 REG32(IOMUXD_REG_BASE+0x000622C0U) // 19 3 2 11 | CONN.ENET0.RGMII_RXD1 | | VPU.TSI_S0.DATA | LSIO.GPIO6.IO07 | | | | | | +#define IOMUXD__ENET0_RGMII_RXD2 REG32(IOMUXD_REG_BASE+0x00062300U) // 19 3 2 12 | CONN.ENET0.RGMII_RXD2 | CONN.ENET0.RMII_RX_ER | VPU.TSI_S0.CLK | LSIO.GPIO6.IO08 | | | | | | +#define IOMUXD__ENET0_RGMII_RXD3 REG32(IOMUXD_REG_BASE+0x00062340U) // 19 3 2 13 | CONN.ENET0.RGMII_RXD3 | DMA.UART3.RX | VPU.TSI_S1.CLK | LSIO.GPIO6.IO09 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB REG32(IOMUXD_REG_BASE+0x00062380U) // 19 3 2 14 | | | | | | | | | | +#define IOMUXD__ENET1_RGMII_TXC REG32(IOMUXD_REG_BASE+0x000623C0U) // 19 3 2 15 | CONN.ENET1.RGMII_TXC | CONN.ENET1.RCLK50M_OUT | CONN.ENET1.RCLK50M_IN | LSIO.GPIO6.IO10 | | | | | | +#define IOMUXD__ENET1_RGMII_TX_CTL REG32(IOMUXD_REG_BASE+0x00063000U) // 20 3 3 0 | CONN.ENET1.RGMII_TX_CTL | | | LSIO.GPIO6.IO11 | | | | | | +#define IOMUXD__ENET1_RGMII_TXD0 REG32(IOMUXD_REG_BASE+0x00063040U) // 20 3 3 1 | CONN.ENET1.RGMII_TXD0 | | | LSIO.GPIO6.IO12 | | | | | | +#define IOMUXD__ENET1_RGMII_TXD1 REG32(IOMUXD_REG_BASE+0x00063080U) // 20 3 3 2 | CONN.ENET1.RGMII_TXD1 | | | LSIO.GPIO6.IO13 | | | | | | +#define IOMUXD__ENET1_RGMII_TXD2 REG32(IOMUXD_REG_BASE+0x000630C0U) // 20 3 3 3 | CONN.ENET1.RGMII_TXD2 | DMA.UART3.TX | VPU.TSI_S1.VID | LSIO.GPIO6.IO14 | | | | | | +#define IOMUXD__ENET1_RGMII_TXD3 REG32(IOMUXD_REG_BASE+0x00063100U) // 20 3 3 4 | CONN.ENET1.RGMII_TXD3 | DMA.UART3.RTS_B | VPU.TSI_S1.SYNC | LSIO.GPIO6.IO15 | | | | | | +#define IOMUXD__ENET1_RGMII_RXC REG32(IOMUXD_REG_BASE+0x00063140U) // 20 3 3 5 | CONN.ENET1.RGMII_RXC | DMA.UART3.CTS_B | VPU.TSI_S1.DATA | LSIO.GPIO6.IO16 | | | | | | +#define IOMUXD__ENET1_RGMII_RX_CTL REG32(IOMUXD_REG_BASE+0x00063180U) // 20 3 3 6 | CONN.ENET1.RGMII_RX_CTL | | VPU.TSI_S0.VID | LSIO.GPIO6.IO17 | | | | | | +#define IOMUXD__ENET1_RGMII_RXD0 REG32(IOMUXD_REG_BASE+0x000631C0U) // 20 3 3 7 | CONN.ENET1.RGMII_RXD0 | | VPU.TSI_S0.SYNC | LSIO.GPIO6.IO18 | | | | | | +#define IOMUXD__ENET1_RGMII_RXD1 REG32(IOMUXD_REG_BASE+0x00063200U) // 20 3 3 8 | CONN.ENET1.RGMII_RXD1 | | VPU.TSI_S0.DATA | LSIO.GPIO6.IO19 | | | | | | +#define IOMUXD__ENET1_RGMII_RXD2 REG32(IOMUXD_REG_BASE+0x00063240U) // 20 3 3 9 | CONN.ENET1.RGMII_RXD2 | CONN.ENET1.RMII_RX_ER | VPU.TSI_S0.CLK | LSIO.GPIO6.IO20 | | | | | | +#define IOMUXD__ENET1_RGMII_RXD3 REG32(IOMUXD_REG_BASE+0x00063280U) // 20 3 3 10 | CONN.ENET1.RGMII_RXD3 | DMA.UART3.RX | VPU.TSI_S1.CLK | LSIO.GPIO6.IO21 | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETA REG32(IOMUXD_REG_BASE+0x000632C0U) // 20 3 3 11 | | | | | | | | | | + +// GROUP REGISTERS FOR WAKEUP CONTROL +#define IOMUXD__GROUP_0_0 REG32(IOMUXD_REG_BASE+0x00000400U) // 0 0 0 0 | +#define IOMUXD__GROUP_0_1 REG32(IOMUXD_REG_BASE+0x00001400U) // 1 0 1 0 | +#define IOMUXD__GROUP_0_2 REG32(IOMUXD_REG_BASE+0x00002400U) // 2 0 2 0 | +#define IOMUXD__GROUP_0_3 REG32(IOMUXD_REG_BASE+0x00003400U) // 3 0 3 0 | +#define IOMUXD__GROUP_0_4 REG32(IOMUXD_REG_BASE+0x00004400U) // 4 0 4 0 | +#define IOMUXD__GROUP_1_0 REG32(IOMUXD_REG_BASE+0x00020400U) // 5 1 0 0 | +#define IOMUXD__GROUP_1_1 REG32(IOMUXD_REG_BASE+0x00021400U) // 6 1 1 0 | +#define IOMUXD__GROUP_1_2 REG32(IOMUXD_REG_BASE+0x00022400U) // 7 1 2 0 | +#define IOMUXD__GROUP_1_3 REG32(IOMUXD_REG_BASE+0x00023400U) // 8 1 3 0 | +#define IOMUXD__GROUP_1_4 REG32(IOMUXD_REG_BASE+0x00024400U) // 9 1 4 0 | +#define IOMUXD__GROUP_1_5 REG32(IOMUXD_REG_BASE+0x00025400U) // 10 1 5 0 | +#define IOMUXD__GROUP_2_0 REG32(IOMUXD_REG_BASE+0x00040400U) // 11 2 0 0 | +#define IOMUXD__GROUP_2_1 REG32(IOMUXD_REG_BASE+0x00041400U) // 12 2 1 0 | +#define IOMUXD__GROUP_2_2 REG32(IOMUXD_REG_BASE+0x00042400U) // 13 2 2 0 | +#define IOMUXD__GROUP_2_3 REG32(IOMUXD_REG_BASE+0x00043400U) // 14 2 3 0 | +#define IOMUXD__GROUP_2_4 REG32(IOMUXD_REG_BASE+0x00044400U) // 15 2 4 0 | +#define IOMUXD__GROUP_2_5 REG32(IOMUXD_REG_BASE+0x00045400U) // 16 2 5 0 | +#define IOMUXD__GROUP_3_0 REG32(IOMUXD_REG_BASE+0x00060400U) // 17 3 0 0 | +#define IOMUXD__GROUP_3_1 REG32(IOMUXD_REG_BASE+0x00061400U) // 18 3 1 0 | +#define IOMUXD__GROUP_3_2 REG32(IOMUXD_REG_BASE+0x00062400U) // 19 3 2 0 | +#define IOMUXD__GROUP_3_3 REG32(IOMUXD_REG_BASE+0x00063400U) // 20 3 3 0 | + +#endif + diff --git a/platform/config/mx8qm/lpcg.h b/platform/config/mx8qm/lpcg.h new file mode 100755 index 0000000..d0e0a18 --- /dev/null +++ b/platform/config/mx8qm/lpcg.h @@ -0,0 +1,148 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef LPCG_H +#define LPCG_H + +// NOTE: Content below comes from cprog file of the SCU design database + +// LPCG______REG +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__REG 0x0000 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__BIT 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__REG 0x0004 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__BIT 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__STOP 3 + +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__REG 0x0000 // IPS_SLOT=CLK_MMCAU_HCLK +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM4__TCMC_HCLK__REG 0x0000 // IPS_SLOT=CLK_TCMC_HCLK +#define LPCG__SS_SCU__CM4__TCMC_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__STOP 3 + +#define LPCG__SS_SCU__TPM1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__TPM1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__TPM1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__BIT 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__HWEN 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__SWEN 1 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__RSVD 2 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__STOP 3 + +#endif + diff --git a/platform/config/mx8qm/pad_data.h b/platform/config/mx8qm/pad_data.h new file mode 100644 index 0000000..bb36565 --- /dev/null +++ b/platform/config/mx8qm/pad_data.h @@ -0,0 +1,643 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to map pads and print debug output. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/pad_data_h.pl */ + +#ifndef SC_PAD_DATA_H +#define SC_PAD_DATA_H + +/* Defines */ + +/*! + * This define is used to initialize the pad mapping array. + */ +#define SC_SVC_PAD_INIT \ + U16((IOMUXD__SIM0_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SIM0_RST >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SIM0_IO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SIM0_PD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SIM0_POWER_EN >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SIM0_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SIM >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M40_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M40_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M40_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M40_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M41_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M41_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M41_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__M41_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT0_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT0_CAPTURE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT0_COMPARE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT1_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT1_CAPTURE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__GPT1_COMPARE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART0_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART0_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART0_RTS_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART0_CTS_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART1_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART1_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART1_RTS_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__UART1_CTS_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLH >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_PMIC_MEMC_ON >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_WDOG_OUT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PMIC_I2C_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PMIC_I2C_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PMIC_EARLY_WARNING >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PMIC_INT_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_02 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_03 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_04 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_05 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_06 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_GPIO0_07 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE4 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SCU_BOOT_MODE5 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_GPIO00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_GPIO01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_I2C1_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS0_I2C1_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_GPIO00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_GPIO01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_I2C1_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__LVDS1_I2C1_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_LVDSGPIO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI0_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI0_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI0_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI0_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI1_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI1_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI1_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_DSI1_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_MIPIDSIGPIO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI0_MCLK_OUT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI0_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI0_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI0_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI0_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI1_MCLK_OUT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI1_GPIO0_00 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI1_GPIO0_01 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI1_I2C0_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MIPI_CSI1_I2C0_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__HDMI_TX0_TS_SCL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__HDMI_TX0_TS_SDA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_HDMIGPIO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_FSR >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_FST >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_SCKR >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_SCKT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX2_RX3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX3_RX2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX4_RX1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI1_TX5_RX0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPDIF0_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPDIF0_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPDIF0_EXT_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI3_SCK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI3_SDO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI3_SDI >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI3_CS0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI3_CS1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHB >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_FSR >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_FST >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_SCKR >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_SCKT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX2_RX3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX3_RX2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX4_RX1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ESAI0_TX5_RX0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MCLK_IN0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MCLK_OUT0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI0_SCK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI0_SDO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI0_SDI >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI0_CS0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI0_CS1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI2_SCK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI2_SDO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI2_SDI >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI2_CS0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SPI2_CS1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_RXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_RXD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_RXFS >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_TXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_TXD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__SAI1_TXFS >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN7 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN6 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN5 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN4 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ADC_IN0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MLB_SIG >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MLB_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__MLB_DATA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLHT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN0_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN0_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN1_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN1_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN2_RX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__FLEXCAN2_TX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOTHR >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_SS3_TC0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_SS3_TC1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_SS3_TC2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_SS3_TC3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_USB3IO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_RESET_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_VSELECT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_RESET_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_VSELECT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_WP >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_CD_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSELSEP >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_MDIO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_MDC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_REFCLK_125M_25M >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_REFCLK_125M_25M >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_MDIO >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_MDC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOCT >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_SS0_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_SS1_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_SCLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_DQS >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI1A_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_DQS >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_SS0_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_SS1_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0A_SCLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_SCLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_DQS >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_SS0_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__QSPI0B_SS1_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL0_CLKREQ_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL0_WAKE_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL0_PERST_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL1_CLKREQ_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL1_WAKE_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__PCIE_CTRL1_PERST_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_PCIESEP >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_HSIC0_DATA >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USB_HSIC0_STROBE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_CALIBRATION_0_HSIC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_CALIBRATION_1_HSIC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_CMD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA4 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA5 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA6 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_DATA7 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_STROBE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__EMMC0_RESET_B >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SD1FIX >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_CMD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_CTL_NAND_RE_P_N >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_CTL_NAND_DQS_P_N >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA4 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA5 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA6 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_DATA7 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC1_STROBE >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSEL2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_CLK >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_CMD >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_DATA0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_DATA1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_DATA2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__USDHC2_DATA3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSEL3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TX_CTL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TXD0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TXD1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TXD2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_TXD3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RX_CTL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RXD0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RXD1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RXD2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET0_RGMII_RXD3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TX_CTL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TXD0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TXD1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TXD2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_TXD3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RXC >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RX_CTL >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RXD0 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RXD1 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RXD2 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__ENET1_RGMII_RXD3 >> 4U) & 0xFFFFU), \ + U16((IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETA >> 4U) & 0xFFFFU) + +/*! + * This define is used indicate the number of pads. + */ +#define SC_NUM_PAD 269U + +/*! + * This define is used to indicate the bit width required to contain a pad. + */ +#define SC_PAD_W 9 + +/*! + * This define is used to initialize the pad group array. + */ +#define SC_SVC_PAD_IRQ_INIT \ + SC_P_SIM0_CLK, \ + SC_P_GPT0_CLK, \ + SC_P_SCU_WDOG_OUT, \ + SC_P_SCU_GPIO0_02, \ + SC_P_LVDS0_GPIO00, \ + SC_P_MIPI_DSI0_I2C0_SCL, \ + SC_P_MIPI_CSI0_MCLK_OUT, \ + SC_P_ESAI1_FSR, \ + SC_P_SPI3_SDI, \ + SC_P_MCLK_OUT0, \ + SC_P_SAI1_TXC, \ + SC_P_MLB_SIG, \ + SC_P_USDHC1_RESET_B, \ + SC_P_QSPI1A_SS1_B, \ + SC_P_QSPI0A_DATA0, \ + SC_P_QSPI0B_SS1_B, \ + SC_P_USB_HSIC0_DATA, \ + SC_P_EMMC0_CLK, \ + SC_P_USDHC1_DATA1, \ + SC_P_USDHC2_DATA3, \ + SC_P_ENET1_RGMII_TX_CTL + +/*! + * This define is used indicate the number of pad interrupts. + */ +#define SC_NUM_PAD_IRQS 21U + +/*! + * This define is used to initialize the pad debug output array. + */ +#ifdef DEBUG + #define PNAME_INIT \ + "SIM0_CLK", \ + "SIM0_RST", \ + "SIM0_IO", \ + "SIM0_PD", \ + "SIM0_POWER_EN", \ + "SIM0_GPIO0_00", \ + "COMP_CTL_GPIO_1V8_3V3_SIM", \ + "M40_I2C0_SCL", \ + "M40_I2C0_SDA", \ + "M40_GPIO0_00", \ + "M40_GPIO0_01", \ + "M41_I2C0_SCL", \ + "M41_I2C0_SDA", \ + "M41_GPIO0_00", \ + "M41_GPIO0_01", \ + "GPT0_CLK", \ + "GPT0_CAPTURE", \ + "GPT0_COMPARE", \ + "GPT1_CLK", \ + "GPT1_CAPTURE", \ + "GPT1_COMPARE", \ + "UART0_RX", \ + "UART0_TX", \ + "UART0_RTS_B", \ + "UART0_CTS_B", \ + "UART1_TX", \ + "UART1_RX", \ + "UART1_RTS_B", \ + "UART1_CTS_B", \ + "COMP_CTL_GPIO_1V8_3V3_GPIOLH", \ + "SCU_PMIC_MEMC_ON", \ + "SCU_WDOG_OUT", \ + "PMIC_I2C_SDA", \ + "PMIC_I2C_SCL", \ + "PMIC_EARLY_WARNING", \ + "PMIC_INT_B", \ + "SCU_GPIO0_00", \ + "SCU_GPIO0_01", \ + "SCU_GPIO0_02", \ + "SCU_GPIO0_03", \ + "SCU_GPIO0_04", \ + "SCU_GPIO0_05", \ + "SCU_GPIO0_06", \ + "SCU_GPIO0_07", \ + "SCU_BOOT_MODE0", \ + "SCU_BOOT_MODE1", \ + "SCU_BOOT_MODE2", \ + "SCU_BOOT_MODE3", \ + "SCU_BOOT_MODE4", \ + "SCU_BOOT_MODE5", \ + "LVDS0_GPIO00", \ + "LVDS0_GPIO01", \ + "LVDS0_I2C0_SCL", \ + "LVDS0_I2C0_SDA", \ + "LVDS0_I2C1_SCL", \ + "LVDS0_I2C1_SDA", \ + "LVDS1_GPIO00", \ + "LVDS1_GPIO01", \ + "LVDS1_I2C0_SCL", \ + "LVDS1_I2C0_SDA", \ + "LVDS1_I2C1_SCL", \ + "LVDS1_I2C1_SDA", \ + "COMP_CTL_GPIO_1V8_3V3_LVDSGPIO", \ + "MIPI_DSI0_I2C0_SCL", \ + "MIPI_DSI0_I2C0_SDA", \ + "MIPI_DSI0_GPIO0_00", \ + "MIPI_DSI0_GPIO0_01", \ + "MIPI_DSI1_I2C0_SCL", \ + "MIPI_DSI1_I2C0_SDA", \ + "MIPI_DSI1_GPIO0_00", \ + "MIPI_DSI1_GPIO0_01", \ + "COMP_CTL_GPIO_1V8_3V3_MIPIDSIGPIO", \ + "MIPI_CSI0_MCLK_OUT", \ + "MIPI_CSI0_I2C0_SCL", \ + "MIPI_CSI0_I2C0_SDA", \ + "MIPI_CSI0_GPIO0_00", \ + "MIPI_CSI0_GPIO0_01", \ + "MIPI_CSI1_MCLK_OUT", \ + "MIPI_CSI1_GPIO0_00", \ + "MIPI_CSI1_GPIO0_01", \ + "MIPI_CSI1_I2C0_SCL", \ + "MIPI_CSI1_I2C0_SDA", \ + "HDMI_TX0_TS_SCL", \ + "HDMI_TX0_TS_SDA", \ + "COMP_CTL_GPIO_3V3_HDMIGPIO", \ + "ESAI1_FSR", \ + "ESAI1_FST", \ + "ESAI1_SCKR", \ + "ESAI1_SCKT", \ + "ESAI1_TX0", \ + "ESAI1_TX1", \ + "ESAI1_TX2_RX3", \ + "ESAI1_TX3_RX2", \ + "ESAI1_TX4_RX1", \ + "ESAI1_TX5_RX0", \ + "SPDIF0_RX", \ + "SPDIF0_TX", \ + "SPDIF0_EXT_CLK", \ + "SPI3_SCK", \ + "SPI3_SDO", \ + "SPI3_SDI", \ + "SPI3_CS0", \ + "SPI3_CS1", \ + "COMP_CTL_GPIO_1V8_3V3_GPIORHB", \ + "ESAI0_FSR", \ + "ESAI0_FST", \ + "ESAI0_SCKR", \ + "ESAI0_SCKT", \ + "ESAI0_TX0", \ + "ESAI0_TX1", \ + "ESAI0_TX2_RX3", \ + "ESAI0_TX3_RX2", \ + "ESAI0_TX4_RX1", \ + "ESAI0_TX5_RX0", \ + "MCLK_IN0", \ + "MCLK_OUT0", \ + "COMP_CTL_GPIO_1V8_3V3_GPIORHC", \ + "SPI0_SCK", \ + "SPI0_SDO", \ + "SPI0_SDI", \ + "SPI0_CS0", \ + "SPI0_CS1", \ + "SPI2_SCK", \ + "SPI2_SDO", \ + "SPI2_SDI", \ + "SPI2_CS0", \ + "SPI2_CS1", \ + "SAI1_RXC", \ + "SAI1_RXD", \ + "SAI1_RXFS", \ + "SAI1_TXC", \ + "SAI1_TXD", \ + "SAI1_TXFS", \ + "COMP_CTL_GPIO_1V8_3V3_GPIORHT", \ + "ADC_IN7", \ + "ADC_IN6", \ + "ADC_IN5", \ + "ADC_IN4", \ + "ADC_IN3", \ + "ADC_IN2", \ + "ADC_IN1", \ + "ADC_IN0", \ + "MLB_SIG", \ + "MLB_CLK", \ + "MLB_DATA", \ + "COMP_CTL_GPIO_1V8_3V3_GPIOLHT", \ + "FLEXCAN0_RX", \ + "FLEXCAN0_TX", \ + "FLEXCAN1_RX", \ + "FLEXCAN1_TX", \ + "FLEXCAN2_RX", \ + "FLEXCAN2_TX", \ + "COMP_CTL_GPIO_1V8_3V3_GPIOTHR", \ + "USB_SS3_TC0", \ + "USB_SS3_TC1", \ + "USB_SS3_TC2", \ + "USB_SS3_TC3", \ + "COMP_CTL_GPIO_3V3_USB3IO", \ + "USDHC1_RESET_B", \ + "USDHC1_VSELECT", \ + "USDHC2_RESET_B", \ + "USDHC2_VSELECT", \ + "USDHC2_WP", \ + "USDHC2_CD_B", \ + "COMP_CTL_GPIO_1V8_3V3_VSELSEP", \ + "ENET0_MDIO", \ + "ENET0_MDC", \ + "ENET0_REFCLK_125M_25M", \ + "ENET1_REFCLK_125M_25M", \ + "ENET1_MDIO", \ + "ENET1_MDC", \ + "COMP_CTL_GPIO_1V8_3V3_GPIOCT", \ + "QSPI1A_SS0_B", \ + "QSPI1A_SS1_B", \ + "QSPI1A_SCLK", \ + "QSPI1A_DQS", \ + "QSPI1A_DATA3", \ + "QSPI1A_DATA2", \ + "QSPI1A_DATA1", \ + "QSPI1A_DATA0", \ + "COMP_CTL_GPIO_1V8_3V3_QSPI1", \ + "QSPI0A_DATA0", \ + "QSPI0A_DATA1", \ + "QSPI0A_DATA2", \ + "QSPI0A_DATA3", \ + "QSPI0A_DQS", \ + "QSPI0A_SS0_B", \ + "QSPI0A_SS1_B", \ + "QSPI0A_SCLK", \ + "QSPI0B_SCLK", \ + "QSPI0B_DATA0", \ + "QSPI0B_DATA1", \ + "QSPI0B_DATA2", \ + "QSPI0B_DATA3", \ + "QSPI0B_DQS", \ + "QSPI0B_SS0_B", \ + "QSPI0B_SS1_B", \ + "COMP_CTL_GPIO_1V8_3V3_QSPI0", \ + "PCIE_CTRL0_CLKREQ_B", \ + "PCIE_CTRL0_WAKE_B", \ + "PCIE_CTRL0_PERST_B", \ + "PCIE_CTRL1_CLKREQ_B", \ + "PCIE_CTRL1_WAKE_B", \ + "PCIE_CTRL1_PERST_B", \ + "COMP_CTL_GPIO_1V8_3V3_PCIESEP", \ + "USB_HSIC0_DATA", \ + "USB_HSIC0_STROBE", \ + "CALIBRATION_0_HSIC", \ + "CALIBRATION_1_HSIC", \ + "EMMC0_CLK", \ + "EMMC0_CMD", \ + "EMMC0_DATA0", \ + "EMMC0_DATA1", \ + "EMMC0_DATA2", \ + "EMMC0_DATA3", \ + "EMMC0_DATA4", \ + "EMMC0_DATA5", \ + "EMMC0_DATA6", \ + "EMMC0_DATA7", \ + "EMMC0_STROBE", \ + "EMMC0_RESET_B", \ + "COMP_CTL_GPIO_1V8_3V3_SD1FIX", \ + "USDHC1_CLK", \ + "USDHC1_CMD", \ + "USDHC1_DATA0", \ + "USDHC1_DATA1", \ + "CTL_NAND_RE_P_N", \ + "USDHC1_DATA2", \ + "USDHC1_DATA3", \ + "CTL_NAND_DQS_P_N", \ + "USDHC1_DATA4", \ + "USDHC1_DATA5", \ + "USDHC1_DATA6", \ + "USDHC1_DATA7", \ + "USDHC1_STROBE", \ + "COMP_CTL_GPIO_1V8_3V3_VSEL2", \ + "USDHC2_CLK", \ + "USDHC2_CMD", \ + "USDHC2_DATA0", \ + "USDHC2_DATA1", \ + "USDHC2_DATA2", \ + "USDHC2_DATA3", \ + "COMP_CTL_GPIO_1V8_3V3_VSEL3", \ + "ENET0_RGMII_TXC", \ + "ENET0_RGMII_TX_CTL", \ + "ENET0_RGMII_TXD0", \ + "ENET0_RGMII_TXD1", \ + "ENET0_RGMII_TXD2", \ + "ENET0_RGMII_TXD3", \ + "ENET0_RGMII_RXC", \ + "ENET0_RGMII_RX_CTL", \ + "ENET0_RGMII_RXD0", \ + "ENET0_RGMII_RXD1", \ + "ENET0_RGMII_RXD2", \ + "ENET0_RGMII_RXD3", \ + "COMP_CTL_GPIO_1V8_3V3_ENET_ENETB", \ + "ENET1_RGMII_TXC", \ + "ENET1_RGMII_TX_CTL", \ + "ENET1_RGMII_TXD0", \ + "ENET1_RGMII_TXD1", \ + "ENET1_RGMII_TXD2", \ + "ENET1_RGMII_TXD3", \ + "ENET1_RGMII_RXC", \ + "ENET1_RGMII_RX_CTL", \ + "ENET1_RGMII_RXD0", \ + "ENET1_RGMII_RXD1", \ + "ENET1_RGMII_RXD2", \ + "ENET1_RGMII_RXD3", \ + "COMP_CTL_GPIO_1V8_3V3_ENET_ENETA" +#endif + +#endif /* SC_PAD_DATA_H */ + diff --git a/platform/config/mx8qm/pad_priority.h b/platform/config/mx8qm/pad_priority.h new file mode 100644 index 0000000..cda603f --- /dev/null +++ b/platform/config/mx8qm/pad_priority.h @@ -0,0 +1,187 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to restrict pad mux settings based on resource ownership. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/pad_priority_h.pl */ + +#ifndef SC_PAD_PRIORITY_H +#define SC_PAD_PRIORITY_H + +/* Defines */ + +#define SC_PAD_PRIORITY_INIT \ + PNFO(SIM0_POWER_EN, 0, EMVSIM_0), \ + PNFO(SIM0_GPIO0_00, 0, EMVSIM_0), \ + PNFO(M40_GPIO0_00, 2, UART_4), \ + PNFO(M40_GPIO0_01, 2, UART_4), \ + PNFO(M41_GPIO0_00, 2, UART_3), \ + PNFO(M41_GPIO0_01, 2, UART_3), \ + PNFO(GPT0_CLK, 1, I2C_1), \ + PNFO(GPT0_CAPTURE, 1, I2C_1), \ + PNFO(UART0_RX, 1, SC_UART), \ + PNFO(UART0_TX, 1, SC_UART), \ + PNFO(UART0_RTS_B, 2, UART_2), \ + PNFO(UART0_CTS_B, 2, UART_2), \ + PNFO(UART1_TX, 1, SPI_3), \ + PNFO(UART1_RX, 1, SPI_3), \ + PNFO(UART1_RTS_B, 0, UART_1), \ + PNFO(UART1_RTS_B, 1, SPI_3), \ + PNFO(UART1_RTS_B, 2, UART_1), \ + PNFO(UART1_CTS_B, 0, UART_1), \ + PNFO(UART1_CTS_B, 1, SPI_3), \ + PNFO(UART1_CTS_B, 2, UART_1), \ + PNFO(PMIC_I2C_SDA, 0, SC_I2C), \ + PNFO(PMIC_I2C_SCL, 0, SC_I2C), \ + PNFO(SCU_GPIO0_00, 1, SC_UART), \ + PNFO(SCU_GPIO0_01, 1, SC_UART), \ + PNFO(SCU_BOOT_MODE4, 1, SC_I2C), \ + PNFO(SCU_BOOT_MODE5, 1, SC_I2C), \ + PNFO(LVDS0_I2C1_SCL, 1, UART_2), \ + PNFO(LVDS0_I2C1_SDA, 1, UART_2), \ + PNFO(LVDS1_I2C1_SCL, 1, UART_3), \ + PNFO(LVDS1_I2C1_SDA, 1, UART_3), \ + PNFO(MIPI_CSI0_GPIO0_00, 1, I2C_0), \ + PNFO(MIPI_CSI0_GPIO0_00, 2, CSI_1_I2C_0), \ + PNFO(MIPI_CSI0_GPIO0_01, 1, I2C_0), \ + PNFO(MIPI_CSI0_GPIO0_01, 2, CSI_1_I2C_0), \ + PNFO(MIPI_CSI1_GPIO0_00, 1, UART_4), \ + PNFO(MIPI_CSI1_GPIO0_01, 1, UART_4), \ + PNFO(MIPI_CSI1_I2C0_SCL, 0, CSI_1_I2C_0), \ + PNFO(MIPI_CSI1_I2C0_SDA, 0, CSI_1_I2C_0), \ + PNFO(HDMI_TX0_TS_SCL, 1, I2C_0), \ + PNFO(HDMI_TX0_TS_SDA, 1, I2C_0), \ + PNFO(ESAI1_FST, 1, SPDIF_0), \ + PNFO(ESAI1_SCKT, 2, SPDIF_0), \ + PNFO(ESAI1_TX0, 2, SPDIF_0), \ + PNFO(ESAI1_TX1, 2, SPDIF_0), \ + PNFO(ESAI1_TX2_RX3, 1, SPDIF_0), \ + PNFO(ESAI1_TX3_RX2, 1, SPDIF_0), \ + PNFO(SPDIF0_RX, 0, SPDIF_0), \ + PNFO(SPDIF0_RX, 1, MQS_0), \ + PNFO(SPDIF0_TX, 0, SPDIF_0), \ + PNFO(SPDIF0_TX, 1, MQS_0), \ + PNFO(SPDIF0_EXT_CLK, 0, SPDIF_0), \ + PNFO(SPI3_SCK, 0, SPI_3), \ + PNFO(SPI3_SDO, 0, SPI_3), \ + PNFO(SPI3_SDI, 0, SPI_3), \ + PNFO(SPI3_CS0, 0, SPI_3), \ + PNFO(SPI0_SDO, 1, SAI_0), \ + PNFO(SPI0_SDI, 1, SAI_0), \ + PNFO(SPI0_CS1, 1, SAI_0), \ + PNFO(SPI2_CS1, 1, SAI_0), \ + PNFO(SAI1_RXC, 0, SAI_1), \ + PNFO(SAI1_RXC, 1, SAI_0), \ + PNFO(SAI1_RXD, 1, SAI_0), \ + PNFO(SAI1_RXFS, 0, SAI_1), \ + PNFO(SAI1_RXFS, 1, SAI_0), \ + PNFO(SAI1_TXC, 1, SAI_0), \ + PNFO(SAI1_TXD, 1, SAI_1), \ + PNFO(SAI1_TXFS, 1, SAI_1), \ + PNFO(USB_SS3_TC0, 0, I2C_1), \ + PNFO(USB_SS3_TC0, 1, USB_0), \ + PNFO(USB_SS3_TC1, 0, I2C_1), \ + PNFO(USB_SS3_TC1, 1, USB_2), \ + PNFO(USB_SS3_TC2, 0, I2C_1), \ + PNFO(USB_SS3_TC2, 1, USB_0), \ + PNFO(USB_SS3_TC3, 0, I2C_1), \ + PNFO(USB_SS3_TC3, 1, USB_2), \ + PNFO(USDHC1_RESET_B, 0, SDHC_1), \ + PNFO(USDHC1_VSELECT, 0, SDHC_1), \ + PNFO(ENET0_MDIO, 1, I2C_4), \ + PNFO(ENET0_MDC, 1, I2C_4), \ + PNFO(ENET1_MDIO, 1, I2C_4), \ + PNFO(ENET1_MDC, 1, I2C_4), \ + PNFO(QSPI1A_DATA3, 1, I2C_1), \ + PNFO(QSPI1A_DATA3, 2, USB_0), \ + PNFO(QSPI1A_DATA2, 1, I2C_1), \ + PNFO(QSPI1A_DATA2, 2, USB_2), \ + PNFO(QSPI1A_DATA1, 1, I2C_1), \ + PNFO(QSPI1A_DATA1, 2, USB_2), \ + PNFO(PCIE_CTRL1_CLKREQ_B, 1, I2C_1), \ + PNFO(PCIE_CTRL1_CLKREQ_B, 2, USB_2), \ + PNFO(PCIE_CTRL1_WAKE_B, 1, I2C_1), \ + PNFO(PCIE_CTRL1_WAKE_B, 2, USB_2), \ + PNFO(PCIE_CTRL1_PERST_B, 1, I2C_1), \ + PNFO(PCIE_CTRL1_PERST_B, 2, USB_0), \ + PNFO(USB_HSIC0_DATA, 1, I2C_1), \ + PNFO(USB_HSIC0_STROBE, 1, I2C_1), \ + PNFO(EMMC0_CMD, 2, MQS_0), \ + PNFO(EMMC0_RESET_B, 2, SDHC_1), \ + PNFO(USDHC1_CLK, 1, MQS_0), \ + PNFO(USDHC1_CMD, 1, MQS_0), \ + PNFO(USDHC1_DATA4, 2, MQS_0), \ + PNFO(USDHC1_DATA5, 2, MQS_0), \ + PNFO(USDHC1_STROBE, 2, SDHC_1), \ + PNFO(USDHC2_CLK, 1, MQS_0), \ + PNFO(USDHC2_CMD, 1, MQS_0), \ + PNFO(USDHC2_DATA0, 1, UART_4), \ + PNFO(USDHC2_DATA1, 1, UART_4), \ + PNFO(ENET0_RGMII_TXD2, 1, UART_3), \ + PNFO(ENET0_RGMII_TXD2, 2, VPU_TS_0), \ + PNFO(ENET0_RGMII_TXD3, 1, UART_3), \ + PNFO(ENET0_RGMII_TXD3, 2, VPU_TS_0), \ + PNFO(ENET0_RGMII_RXC, 1, UART_3), \ + PNFO(ENET0_RGMII_RXC, 2, VPU_TS_0), \ + PNFO(ENET0_RGMII_RX_CTL, 1, VPU_TS_0), \ + PNFO(ENET0_RGMII_RXD0, 1, VPU_TS_0), \ + PNFO(ENET0_RGMII_RXD1, 1, VPU_TS_0), \ + PNFO(ENET0_RGMII_RXD2, 2, VPU_TS_0), \ + PNFO(ENET0_RGMII_RXD3, 1, UART_3), \ + PNFO(ENET0_RGMII_RXD3, 2, VPU_TS_0), \ + PNFO(ENET1_RGMII_TXD2, 1, UART_3), \ + PNFO(ENET1_RGMII_TXD2, 2, VPU_TS_0), \ + PNFO(ENET1_RGMII_TXD3, 1, UART_3), \ + PNFO(ENET1_RGMII_TXD3, 2, VPU_TS_0), \ + PNFO(ENET1_RGMII_RXC, 1, UART_3), \ + PNFO(ENET1_RGMII_RXC, 2, VPU_TS_0), \ + PNFO(ENET1_RGMII_RX_CTL, 1, VPU_TS_0), \ + PNFO(ENET1_RGMII_RXD0, 1, VPU_TS_0), \ + PNFO(ENET1_RGMII_RXD1, 1, VPU_TS_0), \ + PNFO(ENET1_RGMII_RXD2, 2, VPU_TS_0), \ + PNFO(ENET1_RGMII_RXD3, 1, UART_3), \ + PNFO(ENET1_RGMII_RXD3, 2, VPU_TS_0), \ + {0, 0, 0} + +#define SC_NUM_PAD_PRIORITY 130 + +#endif /* SC_PAD_PRIORITY_H */ + diff --git a/platform/config/mx8qm/pads.h b/platform/config/mx8qm/pads.h new file mode 100644 index 0000000..ab73e47 --- /dev/null +++ b/platform/config/mx8qm/pads.h @@ -0,0 +1,329 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure SoC pad list. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/pads_h.pl */ + +#ifndef SC_PADS_H +#define SC_PADS_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Pad Definitions + */ +/** @{ */ +#define SC_P_SIM0_CLK 0U /*!< DMA.SIM0.CLK, LSIO.GPIO0.IO00 */ +#define SC_P_SIM0_RST 1U /*!< DMA.SIM0.RST, LSIO.GPIO0.IO01 */ +#define SC_P_SIM0_IO 2U /*!< DMA.SIM0.IO, LSIO.GPIO0.IO02 */ +#define SC_P_SIM0_PD 3U /*!< DMA.SIM0.PD, DMA.I2C3.SCL, LSIO.GPIO0.IO03 */ +#define SC_P_SIM0_POWER_EN 4U /*!< DMA.SIM0.POWER_EN, DMA.I2C3.SDA, LSIO.GPIO0.IO04 */ +#define SC_P_SIM0_GPIO0_00 5U /*!< DMA.SIM0.POWER_EN, LSIO.GPIO0.IO05 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_SIM 6U /*!< */ +#define SC_P_M40_I2C0_SCL 7U /*!< M40.I2C0.SCL, M40.UART0.RX, M40.GPIO0.IO02, LSIO.GPIO0.IO06 */ +#define SC_P_M40_I2C0_SDA 8U /*!< M40.I2C0.SDA, M40.UART0.TX, M40.GPIO0.IO03, LSIO.GPIO0.IO07 */ +#define SC_P_M40_GPIO0_00 9U /*!< M40.GPIO0.IO00, M40.TPM0.CH0, DMA.UART4.RX, LSIO.GPIO0.IO08 */ +#define SC_P_M40_GPIO0_01 10U /*!< M40.GPIO0.IO01, M40.TPM0.CH1, DMA.UART4.TX, LSIO.GPIO0.IO09 */ +#define SC_P_M41_I2C0_SCL 11U /*!< M41.I2C0.SCL, M41.UART0.RX, M41.GPIO0.IO02, LSIO.GPIO0.IO10 */ +#define SC_P_M41_I2C0_SDA 12U /*!< M41.I2C0.SDA, M41.UART0.TX, M41.GPIO0.IO03, LSIO.GPIO0.IO11 */ +#define SC_P_M41_GPIO0_00 13U /*!< M41.GPIO0.IO00, M41.TPM0.CH0, DMA.UART3.RX, LSIO.GPIO0.IO12 */ +#define SC_P_M41_GPIO0_01 14U /*!< M41.GPIO0.IO01, M41.TPM0.CH1, DMA.UART3.TX, LSIO.GPIO0.IO13 */ +#define SC_P_GPT0_CLK 15U /*!< LSIO.GPT0.CLK, DMA.I2C1.SCL, LSIO.KPP0.COL4, LSIO.GPIO0.IO14 */ +#define SC_P_GPT0_CAPTURE 16U /*!< LSIO.GPT0.CAPTURE, DMA.I2C1.SDA, LSIO.KPP0.COL5, LSIO.GPIO0.IO15 */ +#define SC_P_GPT0_COMPARE 17U /*!< LSIO.GPT0.COMPARE, LSIO.PWM3.OUT, LSIO.KPP0.COL6, LSIO.GPIO0.IO16 */ +#define SC_P_GPT1_CLK 18U /*!< LSIO.GPT1.CLK, DMA.I2C2.SCL, LSIO.KPP0.COL7, LSIO.GPIO0.IO17 */ +#define SC_P_GPT1_CAPTURE 19U /*!< LSIO.GPT1.CAPTURE, DMA.I2C2.SDA, LSIO.KPP0.ROW4, LSIO.GPIO0.IO18 */ +#define SC_P_GPT1_COMPARE 20U /*!< LSIO.GPT1.COMPARE, LSIO.PWM2.OUT, LSIO.KPP0.ROW5, LSIO.GPIO0.IO19 */ +#define SC_P_UART0_RX 21U /*!< DMA.UART0.RX, SCU.UART0.RX, LSIO.GPIO0.IO20 */ +#define SC_P_UART0_TX 22U /*!< DMA.UART0.TX, SCU.UART0.TX, LSIO.GPIO0.IO21 */ +#define SC_P_UART0_RTS_B 23U /*!< DMA.UART0.RTS_B, LSIO.PWM0.OUT, DMA.UART2.RX, LSIO.GPIO0.IO22 */ +#define SC_P_UART0_CTS_B 24U /*!< DMA.UART0.CTS_B, LSIO.PWM1.OUT, DMA.UART2.TX, LSIO.GPIO0.IO23 */ +#define SC_P_UART1_TX 25U /*!< DMA.UART1.TX, DMA.SPI3.SCK, LSIO.GPIO0.IO24 */ +#define SC_P_UART1_RX 26U /*!< DMA.UART1.RX, DMA.SPI3.SDO, LSIO.GPIO0.IO25 */ +#define SC_P_UART1_RTS_B 27U /*!< DMA.UART1.RTS_B, DMA.SPI3.SDI, DMA.UART1.CTS_B, LSIO.GPIO0.IO26 */ +#define SC_P_UART1_CTS_B 28U /*!< DMA.UART1.CTS_B, DMA.SPI3.CS0, DMA.UART1.RTS_B, LSIO.GPIO0.IO27 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIOLH 29U /*!< */ +#define SC_P_SCU_PMIC_MEMC_ON 30U /*!< SCU.GPIO0.IOXX_PMIC_MEMC_ON */ +#define SC_P_SCU_WDOG_OUT 31U /*!< SCU.WDOG0.WDOG_OUT */ +#define SC_P_PMIC_I2C_SDA 32U /*!< SCU.PMIC_I2C.SDA */ +#define SC_P_PMIC_I2C_SCL 33U /*!< SCU.PMIC_I2C.SCL */ +#define SC_P_PMIC_EARLY_WARNING 34U /*!< SCU.PMIC_EARLY_WARNING */ +#define SC_P_PMIC_INT_B 35U /*!< SCU.DSC.PMIC_INT_B */ +#define SC_P_SCU_GPIO0_00 36U /*!< SCU.GPIO0.IO00, SCU.UART0.RX, LSIO.GPIO0.IO28 */ +#define SC_P_SCU_GPIO0_01 37U /*!< SCU.GPIO0.IO01, SCU.UART0.TX, LSIO.GPIO0.IO29 */ +#define SC_P_SCU_GPIO0_02 38U /*!< SCU.GPIO0.IO02, SCU.GPIO0.IOXX_PMIC_GPU0_ON, LSIO.GPIO0.IO30 */ +#define SC_P_SCU_GPIO0_03 39U /*!< SCU.GPIO0.IO03, SCU.GPIO0.IOXX_PMIC_GPU1_ON, LSIO.GPIO0.IO31 */ +#define SC_P_SCU_GPIO0_04 40U /*!< SCU.GPIO0.IO04, SCU.GPIO0.IOXX_PMIC_A72_ON, LSIO.GPIO1.IO00 */ +#define SC_P_SCU_GPIO0_05 41U /*!< SCU.GPIO0.IO05, SCU.GPIO0.IOXX_PMIC_A53_ON, LSIO.GPIO1.IO01 */ +#define SC_P_SCU_GPIO0_06 42U /*!< SCU.GPIO0.IO06, SCU.TPM0.CH0, LSIO.GPIO1.IO02 */ +#define SC_P_SCU_GPIO0_07 43U /*!< SCU.GPIO0.IO07, SCU.TPM0.CH1, SCU.DSC.RTC_CLOCK_OUTPUT_32K, LSIO.GPIO1.IO03 */ +#define SC_P_SCU_BOOT_MODE0 44U /*!< SCU.DSC.BOOT_MODE0 */ +#define SC_P_SCU_BOOT_MODE1 45U /*!< SCU.DSC.BOOT_MODE1 */ +#define SC_P_SCU_BOOT_MODE2 46U /*!< SCU.DSC.BOOT_MODE2 */ +#define SC_P_SCU_BOOT_MODE3 47U /*!< SCU.DSC.BOOT_MODE3 */ +#define SC_P_SCU_BOOT_MODE4 48U /*!< SCU.DSC.BOOT_MODE4, SCU.PMIC_I2C.SCL */ +#define SC_P_SCU_BOOT_MODE5 49U /*!< SCU.DSC.BOOT_MODE5, SCU.PMIC_I2C.SDA */ +#define SC_P_LVDS0_GPIO00 50U /*!< LVDS0.GPIO0.IO00, LVDS0.PWM0.OUT, LSIO.GPIO1.IO04 */ +#define SC_P_LVDS0_GPIO01 51U /*!< LVDS0.GPIO0.IO01, LSIO.GPIO1.IO05 */ +#define SC_P_LVDS0_I2C0_SCL 52U /*!< LVDS0.I2C0.SCL, LVDS0.GPIO0.IO02, LSIO.GPIO1.IO06 */ +#define SC_P_LVDS0_I2C0_SDA 53U /*!< LVDS0.I2C0.SDA, LVDS0.GPIO0.IO03, LSIO.GPIO1.IO07 */ +#define SC_P_LVDS0_I2C1_SCL 54U /*!< LVDS0.I2C1.SCL, DMA.UART2.TX, LSIO.GPIO1.IO08 */ +#define SC_P_LVDS0_I2C1_SDA 55U /*!< LVDS0.I2C1.SDA, DMA.UART2.RX, LSIO.GPIO1.IO09 */ +#define SC_P_LVDS1_GPIO00 56U /*!< LVDS1.GPIO0.IO00, LVDS1.PWM0.OUT, LSIO.GPIO1.IO10 */ +#define SC_P_LVDS1_GPIO01 57U /*!< LVDS1.GPIO0.IO01, LSIO.GPIO1.IO11 */ +#define SC_P_LVDS1_I2C0_SCL 58U /*!< LVDS1.I2C0.SCL, LVDS1.GPIO0.IO02, LSIO.GPIO1.IO12 */ +#define SC_P_LVDS1_I2C0_SDA 59U /*!< LVDS1.I2C0.SDA, LVDS1.GPIO0.IO03, LSIO.GPIO1.IO13 */ +#define SC_P_LVDS1_I2C1_SCL 60U /*!< LVDS1.I2C1.SCL, DMA.UART3.TX, LSIO.GPIO1.IO14 */ +#define SC_P_LVDS1_I2C1_SDA 61U /*!< LVDS1.I2C1.SDA, DMA.UART3.RX, LSIO.GPIO1.IO15 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_LVDSGPIO 62U /*!< */ +#define SC_P_MIPI_DSI0_I2C0_SCL 63U /*!< MIPI_DSI0.I2C0.SCL, LSIO.GPIO1.IO16 */ +#define SC_P_MIPI_DSI0_I2C0_SDA 64U /*!< MIPI_DSI0.I2C0.SDA, LSIO.GPIO1.IO17 */ +#define SC_P_MIPI_DSI0_GPIO0_00 65U /*!< MIPI_DSI0.GPIO0.IO00, MIPI_DSI0.PWM0.OUT, LSIO.GPIO1.IO18 */ +#define SC_P_MIPI_DSI0_GPIO0_01 66U /*!< MIPI_DSI0.GPIO0.IO01, LSIO.GPIO1.IO19 */ +#define SC_P_MIPI_DSI1_I2C0_SCL 67U /*!< MIPI_DSI1.I2C0.SCL, LSIO.GPIO1.IO20 */ +#define SC_P_MIPI_DSI1_I2C0_SDA 68U /*!< MIPI_DSI1.I2C0.SDA, LSIO.GPIO1.IO21 */ +#define SC_P_MIPI_DSI1_GPIO0_00 69U /*!< MIPI_DSI1.GPIO0.IO00, MIPI_DSI1.PWM0.OUT, LSIO.GPIO1.IO22 */ +#define SC_P_MIPI_DSI1_GPIO0_01 70U /*!< MIPI_DSI1.GPIO0.IO01, LSIO.GPIO1.IO23 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_MIPIDSIGPIO 71U /*!< */ +#define SC_P_MIPI_CSI0_MCLK_OUT 72U /*!< MIPI_CSI0.ACM.MCLK_OUT, LSIO.GPIO1.IO24 */ +#define SC_P_MIPI_CSI0_I2C0_SCL 73U /*!< MIPI_CSI0.I2C0.SCL, LSIO.GPIO1.IO25 */ +#define SC_P_MIPI_CSI0_I2C0_SDA 74U /*!< MIPI_CSI0.I2C0.SDA, LSIO.GPIO1.IO26 */ +#define SC_P_MIPI_CSI0_GPIO0_00 75U /*!< MIPI_CSI0.GPIO0.IO00, DMA.I2C0.SCL, MIPI_CSI1.I2C0.SCL, LSIO.GPIO1.IO27 */ +#define SC_P_MIPI_CSI0_GPIO0_01 76U /*!< MIPI_CSI0.GPIO0.IO01, DMA.I2C0.SDA, MIPI_CSI1.I2C0.SDA, LSIO.GPIO1.IO28 */ +#define SC_P_MIPI_CSI1_MCLK_OUT 77U /*!< MIPI_CSI1.ACM.MCLK_OUT, LSIO.GPIO1.IO29 */ +#define SC_P_MIPI_CSI1_GPIO0_00 78U /*!< MIPI_CSI1.GPIO0.IO00, DMA.UART4.RX, LSIO.GPIO1.IO30 */ +#define SC_P_MIPI_CSI1_GPIO0_01 79U /*!< MIPI_CSI1.GPIO0.IO01, DMA.UART4.TX, LSIO.GPIO1.IO31 */ +#define SC_P_MIPI_CSI1_I2C0_SCL 80U /*!< MIPI_CSI1.I2C0.SCL, LSIO.GPIO2.IO00 */ +#define SC_P_MIPI_CSI1_I2C0_SDA 81U /*!< MIPI_CSI1.I2C0.SDA, LSIO.GPIO2.IO01 */ +#define SC_P_HDMI_TX0_TS_SCL 82U /*!< HDMI_TX0.I2C0.SCL, DMA.I2C0.SCL, LSIO.GPIO2.IO02 */ +#define SC_P_HDMI_TX0_TS_SDA 83U /*!< HDMI_TX0.I2C0.SDA, DMA.I2C0.SDA, LSIO.GPIO2.IO03 */ +#define SC_P_COMP_CTL_GPIO_3V3_HDMIGPIO 84U /*!< */ +#define SC_P_ESAI1_FSR 85U /*!< AUD.ESAI1.FSR, LSIO.GPIO2.IO04 */ +#define SC_P_ESAI1_FST 86U /*!< AUD.ESAI1.FST, AUD.SPDIF0.EXT_CLK, LSIO.GPIO2.IO05 */ +#define SC_P_ESAI1_SCKR 87U /*!< AUD.ESAI1.SCKR, LSIO.GPIO2.IO06 */ +#define SC_P_ESAI1_SCKT 88U /*!< AUD.ESAI1.SCKT, AUD.SAI2.RXC, AUD.SPDIF0.EXT_CLK, LSIO.GPIO2.IO07 */ +#define SC_P_ESAI1_TX0 89U /*!< AUD.ESAI1.TX0, AUD.SAI2.RXD, AUD.SPDIF0.RX, LSIO.GPIO2.IO08 */ +#define SC_P_ESAI1_TX1 90U /*!< AUD.ESAI1.TX1, AUD.SAI2.RXFS, AUD.SPDIF0.TX, LSIO.GPIO2.IO09 */ +#define SC_P_ESAI1_TX2_RX3 91U /*!< AUD.ESAI1.TX2_RX3, AUD.SPDIF0.RX, LSIO.GPIO2.IO10 */ +#define SC_P_ESAI1_TX3_RX2 92U /*!< AUD.ESAI1.TX3_RX2, AUD.SPDIF0.TX, LSIO.GPIO2.IO11 */ +#define SC_P_ESAI1_TX4_RX1 93U /*!< AUD.ESAI1.TX4_RX1, LSIO.GPIO2.IO12 */ +#define SC_P_ESAI1_TX5_RX0 94U /*!< AUD.ESAI1.TX5_RX0, LSIO.GPIO2.IO13 */ +#define SC_P_SPDIF0_RX 95U /*!< AUD.SPDIF0.RX, AUD.MQS.R, AUD.ACM.MCLK_IN1, LSIO.GPIO2.IO14 */ +#define SC_P_SPDIF0_TX 96U /*!< AUD.SPDIF0.TX, AUD.MQS.L, AUD.ACM.MCLK_OUT1, LSIO.GPIO2.IO15 */ +#define SC_P_SPDIF0_EXT_CLK 97U /*!< AUD.SPDIF0.EXT_CLK, DMA.DMA0.REQ_IN0, LSIO.GPIO2.IO16 */ +#define SC_P_SPI3_SCK 98U /*!< DMA.SPI3.SCK, LSIO.GPIO2.IO17 */ +#define SC_P_SPI3_SDO 99U /*!< DMA.SPI3.SDO, DMA.FTM.CH0, LSIO.GPIO2.IO18 */ +#define SC_P_SPI3_SDI 100U /*!< DMA.SPI3.SDI, DMA.FTM.CH1, LSIO.GPIO2.IO19 */ +#define SC_P_SPI3_CS0 101U /*!< DMA.SPI3.CS0, DMA.FTM.CH2, LSIO.GPIO2.IO20 */ +#define SC_P_SPI3_CS1 102U /*!< DMA.SPI3.CS1, LSIO.GPIO2.IO21 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIORHB 103U /*!< */ +#define SC_P_ESAI0_FSR 104U /*!< AUD.ESAI0.FSR, LSIO.GPIO2.IO22 */ +#define SC_P_ESAI0_FST 105U /*!< AUD.ESAI0.FST, LSIO.GPIO2.IO23 */ +#define SC_P_ESAI0_SCKR 106U /*!< AUD.ESAI0.SCKR, LSIO.GPIO2.IO24 */ +#define SC_P_ESAI0_SCKT 107U /*!< AUD.ESAI0.SCKT, LSIO.GPIO2.IO25 */ +#define SC_P_ESAI0_TX0 108U /*!< AUD.ESAI0.TX0, LSIO.GPIO2.IO26 */ +#define SC_P_ESAI0_TX1 109U /*!< AUD.ESAI0.TX1, LSIO.GPIO2.IO27 */ +#define SC_P_ESAI0_TX2_RX3 110U /*!< AUD.ESAI0.TX2_RX3, LSIO.GPIO2.IO28 */ +#define SC_P_ESAI0_TX3_RX2 111U /*!< AUD.ESAI0.TX3_RX2, LSIO.GPIO2.IO29 */ +#define SC_P_ESAI0_TX4_RX1 112U /*!< AUD.ESAI0.TX4_RX1, LSIO.GPIO2.IO30 */ +#define SC_P_ESAI0_TX5_RX0 113U /*!< AUD.ESAI0.TX5_RX0, LSIO.GPIO2.IO31 */ +#define SC_P_MCLK_IN0 114U /*!< AUD.ACM.MCLK_IN0, AUD.ESAI0.RX_HF_CLK, AUD.ESAI1.RX_HF_CLK, LSIO.GPIO3.IO00 */ +#define SC_P_MCLK_OUT0 115U /*!< AUD.ACM.MCLK_OUT0, AUD.ESAI0.TX_HF_CLK, AUD.ESAI1.TX_HF_CLK, LSIO.GPIO3.IO01 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIORHC 116U /*!< */ +#define SC_P_SPI0_SCK 117U /*!< DMA.SPI0.SCK, AUD.SAI0.RXC, LSIO.GPIO3.IO02 */ +#define SC_P_SPI0_SDO 118U /*!< DMA.SPI0.SDO, AUD.SAI0.TXD, LSIO.GPIO3.IO03 */ +#define SC_P_SPI0_SDI 119U /*!< DMA.SPI0.SDI, AUD.SAI0.RXD, LSIO.GPIO3.IO04 */ +#define SC_P_SPI0_CS0 120U /*!< DMA.SPI0.CS0, AUD.SAI0.RXFS, LSIO.GPIO3.IO05 */ +#define SC_P_SPI0_CS1 121U /*!< DMA.SPI0.CS1, AUD.SAI0.TXC, LSIO.GPIO3.IO06 */ +#define SC_P_SPI2_SCK 122U /*!< DMA.SPI2.SCK, LSIO.GPIO3.IO07 */ +#define SC_P_SPI2_SDO 123U /*!< DMA.SPI2.SDO, LSIO.GPIO3.IO08 */ +#define SC_P_SPI2_SDI 124U /*!< DMA.SPI2.SDI, LSIO.GPIO3.IO09 */ +#define SC_P_SPI2_CS0 125U /*!< DMA.SPI2.CS0, LSIO.GPIO3.IO10 */ +#define SC_P_SPI2_CS1 126U /*!< DMA.SPI2.CS1, AUD.SAI0.TXFS, LSIO.GPIO3.IO11 */ +#define SC_P_SAI1_RXC 127U /*!< AUD.SAI1.RXC, AUD.SAI0.TXD, LSIO.GPIO3.IO12 */ +#define SC_P_SAI1_RXD 128U /*!< AUD.SAI1.RXD, AUD.SAI0.TXFS, LSIO.GPIO3.IO13 */ +#define SC_P_SAI1_RXFS 129U /*!< AUD.SAI1.RXFS, AUD.SAI0.RXD, LSIO.GPIO3.IO14 */ +#define SC_P_SAI1_TXC 130U /*!< AUD.SAI1.TXC, AUD.SAI0.TXC, LSIO.GPIO3.IO15 */ +#define SC_P_SAI1_TXD 131U /*!< AUD.SAI1.TXD, AUD.SAI1.RXC, LSIO.GPIO3.IO16 */ +#define SC_P_SAI1_TXFS 132U /*!< AUD.SAI1.TXFS, AUD.SAI1.RXFS, LSIO.GPIO3.IO17 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIORHT 133U /*!< */ +#define SC_P_ADC_IN7 134U /*!< DMA.ADC1.IN3, DMA.SPI1.CS1, LSIO.KPP0.ROW3, LSIO.GPIO3.IO25 */ +#define SC_P_ADC_IN6 135U /*!< DMA.ADC1.IN2, DMA.SPI1.CS0, LSIO.KPP0.ROW2, LSIO.GPIO3.IO24 */ +#define SC_P_ADC_IN5 136U /*!< DMA.ADC1.IN1, DMA.SPI1.SDI, LSIO.KPP0.ROW1, LSIO.GPIO3.IO23 */ +#define SC_P_ADC_IN4 137U /*!< DMA.ADC1.IN0, DMA.SPI1.SDO, LSIO.KPP0.ROW0, LSIO.GPIO3.IO22 */ +#define SC_P_ADC_IN3 138U /*!< DMA.ADC0.IN3, DMA.SPI1.SCK, LSIO.KPP0.COL3, LSIO.GPIO3.IO21 */ +#define SC_P_ADC_IN2 139U /*!< DMA.ADC0.IN2, LSIO.KPP0.COL2, LSIO.GPIO3.IO20 */ +#define SC_P_ADC_IN1 140U /*!< DMA.ADC0.IN1, LSIO.KPP0.COL1, LSIO.GPIO3.IO19 */ +#define SC_P_ADC_IN0 141U /*!< DMA.ADC0.IN0, LSIO.KPP0.COL0, LSIO.GPIO3.IO18 */ +#define SC_P_MLB_SIG 142U /*!< CONN.MLB.SIG, AUD.SAI3.RXC, LSIO.GPIO3.IO26 */ +#define SC_P_MLB_CLK 143U /*!< CONN.MLB.CLK, AUD.SAI3.RXFS, LSIO.GPIO3.IO27 */ +#define SC_P_MLB_DATA 144U /*!< CONN.MLB.DATA, AUD.SAI3.RXD, LSIO.GPIO3.IO28 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIOLHT 145U /*!< */ +#define SC_P_FLEXCAN0_RX 146U /*!< DMA.FLEXCAN0.RX, LSIO.GPIO3.IO29 */ +#define SC_P_FLEXCAN0_TX 147U /*!< DMA.FLEXCAN0.TX, LSIO.GPIO3.IO30 */ +#define SC_P_FLEXCAN1_RX 148U /*!< DMA.FLEXCAN1.RX, LSIO.GPIO3.IO31 */ +#define SC_P_FLEXCAN1_TX 149U /*!< DMA.FLEXCAN1.TX, LSIO.GPIO4.IO00 */ +#define SC_P_FLEXCAN2_RX 150U /*!< DMA.FLEXCAN2.RX, LSIO.GPIO4.IO01 */ +#define SC_P_FLEXCAN2_TX 151U /*!< DMA.FLEXCAN2.TX, LSIO.GPIO4.IO02 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIOTHR 152U /*!< */ +#define SC_P_USB_SS3_TC0 153U /*!< DMA.I2C1.SCL, CONN.USB_OTG1.PWR, LSIO.GPIO4.IO03 */ +#define SC_P_USB_SS3_TC1 154U /*!< DMA.I2C1.SCL, CONN.USB_OTG2.PWR, LSIO.GPIO4.IO04 */ +#define SC_P_USB_SS3_TC2 155U /*!< DMA.I2C1.SDA, CONN.USB_OTG1.OC, LSIO.GPIO4.IO05 */ +#define SC_P_USB_SS3_TC3 156U /*!< DMA.I2C1.SDA, CONN.USB_OTG2.OC, LSIO.GPIO4.IO06 */ +#define SC_P_COMP_CTL_GPIO_3V3_USB3IO 157U /*!< */ +#define SC_P_USDHC1_RESET_B 158U /*!< CONN.USDHC1.RESET_B, LSIO.GPIO4.IO07 */ +#define SC_P_USDHC1_VSELECT 159U /*!< CONN.USDHC1.VSELECT, LSIO.GPIO4.IO08 */ +#define SC_P_USDHC2_RESET_B 160U /*!< CONN.USDHC2.RESET_B, LSIO.GPIO4.IO09 */ +#define SC_P_USDHC2_VSELECT 161U /*!< CONN.USDHC2.VSELECT, LSIO.GPIO4.IO10 */ +#define SC_P_USDHC2_WP 162U /*!< CONN.USDHC2.WP, LSIO.GPIO4.IO11 */ +#define SC_P_USDHC2_CD_B 163U /*!< CONN.USDHC2.CD_B, LSIO.GPIO4.IO12 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_VSELSEP 164U /*!< */ +#define SC_P_ENET0_MDIO 165U /*!< CONN.ENET0.MDIO, DMA.I2C4.SDA, LSIO.GPIO4.IO13 */ +#define SC_P_ENET0_MDC 166U /*!< CONN.ENET0.MDC, DMA.I2C4.SCL, LSIO.GPIO4.IO14 */ +#define SC_P_ENET0_REFCLK_125M_25M 167U /*!< CONN.ENET0.REFCLK_125M_25M, CONN.ENET0.PPS, LSIO.GPIO4.IO15 */ +#define SC_P_ENET1_REFCLK_125M_25M 168U /*!< CONN.ENET1.REFCLK_125M_25M, CONN.ENET1.PPS, LSIO.GPIO4.IO16 */ +#define SC_P_ENET1_MDIO 169U /*!< CONN.ENET1.MDIO, DMA.I2C4.SDA, LSIO.GPIO4.IO17 */ +#define SC_P_ENET1_MDC 170U /*!< CONN.ENET1.MDC, DMA.I2C4.SCL, LSIO.GPIO4.IO18 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_GPIOCT 171U /*!< */ +#define SC_P_QSPI1A_SS0_B 172U /*!< LSIO.QSPI1A.SS0_B, LSIO.GPIO4.IO19 */ +#define SC_P_QSPI1A_SS1_B 173U /*!< LSIO.QSPI1A.SS1_B, LSIO.QSPI1A.SCLK2, LSIO.GPIO4.IO20 */ +#define SC_P_QSPI1A_SCLK 174U /*!< LSIO.QSPI1A.SCLK, LSIO.GPIO4.IO21 */ +#define SC_P_QSPI1A_DQS 175U /*!< LSIO.QSPI1A.DQS, LSIO.GPIO4.IO22 */ +#define SC_P_QSPI1A_DATA3 176U /*!< LSIO.QSPI1A.DATA3, DMA.I2C1.SDA, CONN.USB_OTG1.OC, LSIO.GPIO4.IO23 */ +#define SC_P_QSPI1A_DATA2 177U /*!< LSIO.QSPI1A.DATA2, DMA.I2C1.SCL, CONN.USB_OTG2.PWR, LSIO.GPIO4.IO24 */ +#define SC_P_QSPI1A_DATA1 178U /*!< LSIO.QSPI1A.DATA1, DMA.I2C1.SDA, CONN.USB_OTG2.OC, LSIO.GPIO4.IO25 */ +#define SC_P_QSPI1A_DATA0 179U /*!< LSIO.QSPI1A.DATA0, LSIO.GPIO4.IO26 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI1 180U /*!< */ +#define SC_P_QSPI0A_DATA0 181U /*!< LSIO.QSPI0A.DATA0 */ +#define SC_P_QSPI0A_DATA1 182U /*!< LSIO.QSPI0A.DATA1 */ +#define SC_P_QSPI0A_DATA2 183U /*!< LSIO.QSPI0A.DATA2 */ +#define SC_P_QSPI0A_DATA3 184U /*!< LSIO.QSPI0A.DATA3 */ +#define SC_P_QSPI0A_DQS 185U /*!< LSIO.QSPI0A.DQS */ +#define SC_P_QSPI0A_SS0_B 186U /*!< LSIO.QSPI0A.SS0_B */ +#define SC_P_QSPI0A_SS1_B 187U /*!< LSIO.QSPI0A.SS1_B, LSIO.QSPI0A.SCLK2 */ +#define SC_P_QSPI0A_SCLK 188U /*!< LSIO.QSPI0A.SCLK */ +#define SC_P_QSPI0B_SCLK 189U /*!< LSIO.QSPI0B.SCLK */ +#define SC_P_QSPI0B_DATA0 190U /*!< LSIO.QSPI0B.DATA0 */ +#define SC_P_QSPI0B_DATA1 191U /*!< LSIO.QSPI0B.DATA1 */ +#define SC_P_QSPI0B_DATA2 192U /*!< LSIO.QSPI0B.DATA2 */ +#define SC_P_QSPI0B_DATA3 193U /*!< LSIO.QSPI0B.DATA3 */ +#define SC_P_QSPI0B_DQS 194U /*!< LSIO.QSPI0B.DQS */ +#define SC_P_QSPI0B_SS0_B 195U /*!< LSIO.QSPI0B.SS0_B */ +#define SC_P_QSPI0B_SS1_B 196U /*!< LSIO.QSPI0B.SS1_B, LSIO.QSPI0B.SCLK2 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_QSPI0 197U /*!< */ +#define SC_P_PCIE_CTRL0_CLKREQ_B 198U /*!< HSIO.PCIE0.CLKREQ_B, LSIO.GPIO4.IO27 */ +#define SC_P_PCIE_CTRL0_WAKE_B 199U /*!< HSIO.PCIE0.WAKE_B, LSIO.GPIO4.IO28 */ +#define SC_P_PCIE_CTRL0_PERST_B 200U /*!< HSIO.PCIE0.PERST_B, LSIO.GPIO4.IO29 */ +#define SC_P_PCIE_CTRL1_CLKREQ_B 201U /*!< HSIO.PCIE1.CLKREQ_B, DMA.I2C1.SDA, CONN.USB_OTG2.OC, LSIO.GPIO4.IO30 */ +#define SC_P_PCIE_CTRL1_WAKE_B 202U /*!< HSIO.PCIE1.WAKE_B, DMA.I2C1.SCL, CONN.USB_OTG2.PWR, LSIO.GPIO4.IO31 */ +#define SC_P_PCIE_CTRL1_PERST_B 203U /*!< HSIO.PCIE1.PERST_B, DMA.I2C1.SCL, CONN.USB_OTG1.PWR, LSIO.GPIO5.IO00 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_PCIESEP 204U /*!< */ +#define SC_P_USB_HSIC0_DATA 205U /*!< CONN.USB_HSIC0.DATA, DMA.I2C1.SDA, LSIO.GPIO5.IO01 */ +#define SC_P_USB_HSIC0_STROBE 206U /*!< CONN.USB_HSIC0.STROBE, DMA.I2C1.SCL, LSIO.GPIO5.IO02 */ +#define SC_P_CALIBRATION_0_HSIC 207U /*!< */ +#define SC_P_CALIBRATION_1_HSIC 208U /*!< */ +#define SC_P_EMMC0_CLK 209U /*!< CONN.EMMC0.CLK, CONN.NAND.READY_B */ +#define SC_P_EMMC0_CMD 210U /*!< CONN.EMMC0.CMD, CONN.NAND.DQS, AUD.MQS.R, LSIO.GPIO5.IO03 */ +#define SC_P_EMMC0_DATA0 211U /*!< CONN.EMMC0.DATA0, CONN.NAND.DATA00, LSIO.GPIO5.IO04 */ +#define SC_P_EMMC0_DATA1 212U /*!< CONN.EMMC0.DATA1, CONN.NAND.DATA01, LSIO.GPIO5.IO05 */ +#define SC_P_EMMC0_DATA2 213U /*!< CONN.EMMC0.DATA2, CONN.NAND.DATA02, LSIO.GPIO5.IO06 */ +#define SC_P_EMMC0_DATA3 214U /*!< CONN.EMMC0.DATA3, CONN.NAND.DATA03, LSIO.GPIO5.IO07 */ +#define SC_P_EMMC0_DATA4 215U /*!< CONN.EMMC0.DATA4, CONN.NAND.DATA04, LSIO.GPIO5.IO08 */ +#define SC_P_EMMC0_DATA5 216U /*!< CONN.EMMC0.DATA5, CONN.NAND.DATA05, LSIO.GPIO5.IO09 */ +#define SC_P_EMMC0_DATA6 217U /*!< CONN.EMMC0.DATA6, CONN.NAND.DATA06, LSIO.GPIO5.IO10 */ +#define SC_P_EMMC0_DATA7 218U /*!< CONN.EMMC0.DATA7, CONN.NAND.DATA07, LSIO.GPIO5.IO11 */ +#define SC_P_EMMC0_STROBE 219U /*!< CONN.EMMC0.STROBE, CONN.NAND.CLE, LSIO.GPIO5.IO12 */ +#define SC_P_EMMC0_RESET_B 220U /*!< CONN.EMMC0.RESET_B, CONN.NAND.WP_B, CONN.USDHC1.VSELECT, LSIO.GPIO5.IO13 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_SD1FIX 221U /*!< */ +#define SC_P_USDHC1_CLK 222U /*!< CONN.USDHC1.CLK, AUD.MQS.R */ +#define SC_P_USDHC1_CMD 223U /*!< CONN.USDHC1.CMD, AUD.MQS.L, LSIO.GPIO5.IO14 */ +#define SC_P_USDHC1_DATA0 224U /*!< CONN.USDHC1.DATA0, CONN.NAND.RE_N, LSIO.GPIO5.IO15 */ +#define SC_P_USDHC1_DATA1 225U /*!< CONN.USDHC1.DATA1, CONN.NAND.RE_P, LSIO.GPIO5.IO16 */ +#define SC_P_CTL_NAND_RE_P_N 226U /*!< */ +#define SC_P_USDHC1_DATA2 227U /*!< CONN.USDHC1.DATA2, CONN.NAND.DQS_N, LSIO.GPIO5.IO17 */ +#define SC_P_USDHC1_DATA3 228U /*!< CONN.USDHC1.DATA3, CONN.NAND.DQS_P, LSIO.GPIO5.IO18 */ +#define SC_P_CTL_NAND_DQS_P_N 229U /*!< */ +#define SC_P_USDHC1_DATA4 230U /*!< CONN.USDHC1.DATA4, CONN.NAND.CE0_B, AUD.MQS.R, LSIO.GPIO5.IO19 */ +#define SC_P_USDHC1_DATA5 231U /*!< CONN.USDHC1.DATA5, CONN.NAND.RE_B, AUD.MQS.L, LSIO.GPIO5.IO20 */ +#define SC_P_USDHC1_DATA6 232U /*!< CONN.USDHC1.DATA6, CONN.NAND.WE_B, CONN.USDHC1.WP, LSIO.GPIO5.IO21 */ +#define SC_P_USDHC1_DATA7 233U /*!< CONN.USDHC1.DATA7, CONN.NAND.ALE, CONN.USDHC1.CD_B, LSIO.GPIO5.IO22 */ +#define SC_P_USDHC1_STROBE 234U /*!< CONN.USDHC1.STROBE, CONN.NAND.CE1_B, CONN.USDHC1.RESET_B, LSIO.GPIO5.IO23 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_VSEL2 235U /*!< */ +#define SC_P_USDHC2_CLK 236U /*!< CONN.USDHC2.CLK, AUD.MQS.R, LSIO.GPIO5.IO24 */ +#define SC_P_USDHC2_CMD 237U /*!< CONN.USDHC2.CMD, AUD.MQS.L, LSIO.GPIO5.IO25 */ +#define SC_P_USDHC2_DATA0 238U /*!< CONN.USDHC2.DATA0, DMA.UART4.RX, LSIO.GPIO5.IO26 */ +#define SC_P_USDHC2_DATA1 239U /*!< CONN.USDHC2.DATA1, DMA.UART4.TX, LSIO.GPIO5.IO27 */ +#define SC_P_USDHC2_DATA2 240U /*!< CONN.USDHC2.DATA2, DMA.UART4.CTS_B, LSIO.GPIO5.IO28 */ +#define SC_P_USDHC2_DATA3 241U /*!< CONN.USDHC2.DATA3, DMA.UART4.RTS_B, LSIO.GPIO5.IO29 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_VSEL3 242U /*!< */ +#define SC_P_ENET0_RGMII_TXC 243U /*!< CONN.ENET0.RGMII_TXC, CONN.ENET0.RCLK50M_OUT, CONN.ENET0.RCLK50M_IN, LSIO.GPIO5.IO30 */ +#define SC_P_ENET0_RGMII_TX_CTL 244U /*!< CONN.ENET0.RGMII_TX_CTL, LSIO.GPIO5.IO31 */ +#define SC_P_ENET0_RGMII_TXD0 245U /*!< CONN.ENET0.RGMII_TXD0, LSIO.GPIO6.IO00 */ +#define SC_P_ENET0_RGMII_TXD1 246U /*!< CONN.ENET0.RGMII_TXD1, LSIO.GPIO6.IO01 */ +#define SC_P_ENET0_RGMII_TXD2 247U /*!< CONN.ENET0.RGMII_TXD2, DMA.UART3.TX, VPU.TSI_S1.VID, LSIO.GPIO6.IO02 */ +#define SC_P_ENET0_RGMII_TXD3 248U /*!< CONN.ENET0.RGMII_TXD3, DMA.UART3.RTS_B, VPU.TSI_S1.SYNC, LSIO.GPIO6.IO03 */ +#define SC_P_ENET0_RGMII_RXC 249U /*!< CONN.ENET0.RGMII_RXC, DMA.UART3.CTS_B, VPU.TSI_S1.DATA, LSIO.GPIO6.IO04 */ +#define SC_P_ENET0_RGMII_RX_CTL 250U /*!< CONN.ENET0.RGMII_RX_CTL, VPU.TSI_S0.VID, LSIO.GPIO6.IO05 */ +#define SC_P_ENET0_RGMII_RXD0 251U /*!< CONN.ENET0.RGMII_RXD0, VPU.TSI_S0.SYNC, LSIO.GPIO6.IO06 */ +#define SC_P_ENET0_RGMII_RXD1 252U /*!< CONN.ENET0.RGMII_RXD1, VPU.TSI_S0.DATA, LSIO.GPIO6.IO07 */ +#define SC_P_ENET0_RGMII_RXD2 253U /*!< CONN.ENET0.RGMII_RXD2, CONN.ENET0.RMII_RX_ER, VPU.TSI_S0.CLK, LSIO.GPIO6.IO08 */ +#define SC_P_ENET0_RGMII_RXD3 254U /*!< CONN.ENET0.RGMII_RXD3, DMA.UART3.RX, VPU.TSI_S1.CLK, LSIO.GPIO6.IO09 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB 255U /*!< */ +#define SC_P_ENET1_RGMII_TXC 256U /*!< CONN.ENET1.RGMII_TXC, CONN.ENET1.RCLK50M_OUT, CONN.ENET1.RCLK50M_IN, LSIO.GPIO6.IO10 */ +#define SC_P_ENET1_RGMII_TX_CTL 257U /*!< CONN.ENET1.RGMII_TX_CTL, LSIO.GPIO6.IO11 */ +#define SC_P_ENET1_RGMII_TXD0 258U /*!< CONN.ENET1.RGMII_TXD0, LSIO.GPIO6.IO12 */ +#define SC_P_ENET1_RGMII_TXD1 259U /*!< CONN.ENET1.RGMII_TXD1, LSIO.GPIO6.IO13 */ +#define SC_P_ENET1_RGMII_TXD2 260U /*!< CONN.ENET1.RGMII_TXD2, DMA.UART3.TX, VPU.TSI_S1.VID, LSIO.GPIO6.IO14 */ +#define SC_P_ENET1_RGMII_TXD3 261U /*!< CONN.ENET1.RGMII_TXD3, DMA.UART3.RTS_B, VPU.TSI_S1.SYNC, LSIO.GPIO6.IO15 */ +#define SC_P_ENET1_RGMII_RXC 262U /*!< CONN.ENET1.RGMII_RXC, DMA.UART3.CTS_B, VPU.TSI_S1.DATA, LSIO.GPIO6.IO16 */ +#define SC_P_ENET1_RGMII_RX_CTL 263U /*!< CONN.ENET1.RGMII_RX_CTL, VPU.TSI_S0.VID, LSIO.GPIO6.IO17 */ +#define SC_P_ENET1_RGMII_RXD0 264U /*!< CONN.ENET1.RGMII_RXD0, VPU.TSI_S0.SYNC, LSIO.GPIO6.IO18 */ +#define SC_P_ENET1_RGMII_RXD1 265U /*!< CONN.ENET1.RGMII_RXD1, VPU.TSI_S0.DATA, LSIO.GPIO6.IO19 */ +#define SC_P_ENET1_RGMII_RXD2 266U /*!< CONN.ENET1.RGMII_RXD2, CONN.ENET1.RMII_RX_ER, VPU.TSI_S0.CLK, LSIO.GPIO6.IO20 */ +#define SC_P_ENET1_RGMII_RXD3 267U /*!< CONN.ENET1.RGMII_RXD3, DMA.UART3.RX, VPU.TSI_S1.CLK, LSIO.GPIO6.IO21 */ +#define SC_P_COMP_CTL_GPIO_1V8_3V3_ENET_ENETA 268U /*!< */ +/** @} */ + +#endif /* SC_PADS_H */ + diff --git a/platform/config/mx8qm/soc.bom b/platform/config/mx8qm/soc.bom new file mode 100755 index 0000000..69a1a64 --- /dev/null +++ b/platform/config/mx8qm/soc.bom @@ -0,0 +1,63 @@ + +SOC = MX8QM + +DRV += \ + analog \ + csr \ + dsc \ + otp \ + pad \ + seco/v2 \ + snvs/v2 \ + sysctr \ + xrdc2 \ + mtr + +DRV2 += \ + rgpio \ + igpio \ + lmem \ + lpi2c \ + lpit \ + lpcg \ + lpuart \ + mu \ + stc \ + systick \ + drc \ + wdog32 + +SS += \ + a53/v1 \ + a72/v1 \ + audio/v1 \ + base/v1 \ + cci/v1 \ + conn/v1 \ + csi/v1 \ + db/v1 \ + dblogic/v1 \ + dc/v1 \ + dma/v1 \ + drc/v1 \ + gpu/v1 \ + hdmi/v1 \ + hdmi_rx/v1 \ + hsio/v1 \ + img/v1 \ + lsio/v2 \ + lvds/v1 \ + m4/v1 \ + mipi/v1 \ + sc/v2 \ + vpu/v3 + +SVC += \ + irq \ + misc \ + pad \ + pm \ + rm \ + seco \ + timer + diff --git a/platform/config/mx8qm/soc.h b/platform/config/mx8qm/soc.h new file mode 100755 index 0000000..ac1de49 --- /dev/null +++ b/platform/config/mx8qm/soc.h @@ -0,0 +1,771 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure SoC specific features of the SCFW. + * Includes info on memory map, DSC mapping, subsystem mapping, etc. + * + */ +/*==========================================================================*/ + +#ifndef SC_SOC_H +#define SC_SOC_H + +/* Includes */ + +#include "main/types.h" +#include "has_ss.h" +#include "fsl_device_registers.h" +#include "ss/drc/v1/dsc.h" + +/* Configure DSCs */ + +/*! Macro to calculate DSC index */ +#define DSC_IDX(X) ((sc_dsc_t) ((((uint32_t) (X)) - ((uint32_t) MSI0_BASE)) / 131072U)) + +/*! Macro to define AI_READ/WRITE */ +#define ANA_READ(BASE_IDX, TOG, ADDRESS, RDATA) DSC_AIRegisterRead(BASE_IDX, TOG, ADDRESS, RDATA) +#define ANA_WRITE(BASE_IDX, TOG, ADDRESS, DATAWORD) DSC_AIRegisterWrite(BASE_IDX, TOG, ADDRESS, DATAWORD) +#define ANA_ENABLE_ANAMIX_AI(BASE_IDX) DSC_EnableAnamixAI(BASE_IDX) +#define ANA_ENABLE_PHYMIX_AI(BASE_IDX) DSC_EnablePhymixAI(BASE_IDX) + +/*! Define for Refgen default trim in case of unfused part */ +#define REFGEN_DEFAULT_TRIM 0x2BU +/*! + * @name Defines for sc_dsc_t + */ +/** @{ */ +#define SC_DSC_SC DSC_IDX(DSC_SC) /* 0x01 */ +#define SC_DSC_MCU_0 DSC_IDX(DSC_MCU_0) /* 0x11 */ +#define SC_DSC_DRC_0 DSC_IDX(DSC_DRC_0) /* 0x12 */ +#define SC_DSC_DC_1 DSC_IDX(DSC_DC_1) /* 0x13 */ +#define SC_DSC_MCU_1 DSC_IDX(DSC_MCU_1) /* 0x14 */ +#define SC_DSC_GPU_1 DSC_IDX(DSC_GPU_1) /* 0x15 */ +#define SC_DSC_CONN DSC_IDX(DSC_CONN) /* 0x16 */ +#define SC_DSC_VPU DSC_IDX(DSC_VPU) /* 0x17 */ +#define SC_DSC_CCI DSC_IDX(DSC_CCI) /* 0x19 */ +#define SC_DSC_AP_1 DSC_IDX(DSC_AP_1) /* 0x21 */ +#define SC_DSC_DB DSC_IDX(DSC_DB) /* 0x22 */ +#define SC_DSC_AP_0 DSC_IDX(DSC_AP_0) /* 0x23 */ +#define SC_DSC_HSIO DSC_IDX(DSC_HSIO) /* 0x24 */ +#define SC_DSC_LSIO DSC_IDX(DSC_LSIO) /* 0x25 */ +#define SC_DSC_GPU_0 DSC_IDX(DSC_GPU_0) /* 0x26 */ +#define SC_DSC_DC_0 DSC_IDX(DSC_DC_0) /* 0x27 */ +#define SC_DSC_DRC_1 DSC_IDX(DSC_DRC_1) /* 0x28 */ +#define SC_DSC_DMA DSC_IDX(DSC_DMA) /* 0x29 */ +#define SC_DSC_DBLOG DSC_IDX(DSC_DBLOG) /* 0x31 */ +#define SC_DSC_IMG DSC_IDX(DSC_IMG) /* 0x32 */ +#define SC_DSC_AUDIO DSC_IDX(DSC_AUDIO) /* 0x33 */ +#define SC_DSC_DI_HDMI DSC_IDX(DSC_HDMI) /* 0x34 */ +#define SC_DSC_RX_HDMI DSC_IDX(DSC_HDMI_RX) /* 0x35 */ +#define SC_DSC_CSI_1 DSC_IDX(DSC_CSI_1) /* 0x36 */ +#define SC_DSC_CSI_0 DSC_IDX(DSC_CSI_0) /* 0x37 */ +#define SC_DSC_DI_MIPI_1 DSC_IDX(DSC_MIPI_1) /* 0x38 */ +#define SC_DSC_DI_MIPI_0 DSC_IDX(DSC_MIPI_0) /* 0x39 */ +#define SC_DSC_DI_LVDS_1 DSC_IDX(DSC_LVDS_1) /* 0x3A */ +#define SC_DSC_DI_LVDS_0 DSC_IDX(DSC_LVDS_0) /* 0x3B */ +#define SC_DSC_LAST 0x3FU +#define SC_DSC_NA SC_DSC_LAST +#define SC_DSC_W 6U +/** @} */ + +/*! + * DSC Type. This type is a used to indicate a Distributed Slave + * Controller (DSC). + */ +typedef uint8_t sc_dsc_t; + +/*! + * @name Defines for sc_ai_t + */ +/** @{ */ +#define SC_AI_HP_PLL 0U +#define SC_AI_DIG_PLL 1U +#define SC_AI_AV_PLL 2U +#define SC_AI_LVDS_TRANS 3U +#define SC_AI_BANDGAP_REF 4U +#define SC_AI_VA_REFGEN 5U +#define SC_AI_NEG_CHARGE_PUMP 6U +#define SC_AI_WELL_LEVEL_SOURCE 7U +#define SC_AI_DIFFCLK_ROOT 8U +#define SC_AI_DIFFCLK_RPTR 9U +#define SC_AI_DIFFCLK_TERM 10U +#define SC_AI_PHY_LDO 11U +#define SC_AI_OSC24M 12U +#define SC_AI_RC200OSC 13U +#define SC_AI_TEMP_SENSE 14U +#define SC_AI_VDROP_PROCMON 15U +#define SC_AI_LAST 16U +/** @} */ + +/*! + * Analog Interface Modules Types. + */ +typedef uint8_t sc_ai_t; + +/* Configure Subsystems */ + +typedef uint8_t sc_ss_inst_t; + +#define SC_SS_INST_W 1U + +/*! + * Subsystem Type. This type is used to indicate a subsystem. + */ +/** @{ */ +#define SC_SUBSYS_SC 0U +#define SC_SUBSYS_MCU_0 1U +#define SC_SUBSYS_MCU_1 2U +#define SC_SUBSYS_CCI 3U +#define SC_SUBSYS_A53 4U +#define SC_SUBSYS_A72 5U +#define SC_SUBSYS_GPU_0 6U +#define SC_SUBSYS_GPU_1 7U +#define SC_SUBSYS_VPU 8U +#define SC_SUBSYS_DC_0 9U +#define SC_SUBSYS_DC_1 10U +#define SC_SUBSYS_IMG 11U +#define SC_SUBSYS_AUDIO 12U +#define SC_SUBSYS_DMA 13U +#define SC_SUBSYS_CONN 14U +#define SC_SUBSYS_DB 15U +#define SC_SUBSYS_DBLOGIC 16U +#define SC_SUBSYS_DRC_0 17U +#define SC_SUBSYS_DRC_1 18U +#define SC_SUBSYS_LSIO 19U +#define SC_SUBSYS_HSIO 20U +#define SC_SUBSYS_LVDS_0 21U +#define SC_SUBSYS_LVDS_1 22U +#define SC_SUBSYS_CSI_0 23U +#define SC_SUBSYS_CSI_1 24U +#define SC_SUBSYS_HDMI_RX 25U +#define SC_SUBSYS_HDMI 26U +#define SC_SUBSYS_MIPI_0 27U +#define SC_SUBSYS_MIPI_1 28U +#define SC_SUBSYS_LAST SC_SUBSYS_MIPI_1 +#define SC_SUBSYS_W 5U +#define SC_SUBSYS_NA 31U +/** @} */ + +/*! + * Subsystem Type. This type is used to indicate a subsystem. + */ +typedef uint8_t sc_sub_t; + +#define SC_PGP_00 0U +#define SC_PGP_01 1U +#define SC_PGP_02 2U +#define SC_PGP_03 3U +#define SC_PGP_10 4U +#define SC_PGP_11 5U +#define SC_PGP_12 6U +#define SC_PGP_13 7U +#define SC_PGP_20 8U +#define SC_PGP_21 9U +#define SC_PGP_22 10U +#define SC_PGP_23 11U +#define SC_PGP_30 12U +#define SC_PGP_31 13U +#define SC_PGP_32 14U +#define SC_PGP_33 15U + +#define SC_PGP_W 5U +#define SC_PGP_NA 16U + +#define MTR_PWR_PLAN_SEL_SCU 0U +#define MTR_PWR_PLAN_SEL_MCU_0 1U +#define MTR_PWR_PLAN_SEL_MCU_1 2U +#define MTR_PWR_PLAN_SEL_GPU3D_1 3U +#define MTR_PWR_PLAN_SEL_LSIO 4U +#define MTR_PWR_PLAN_SEL_GPU3D_0 5U +#define MTR_PWR_PLAN_SEL_CA53 6U +#define MTR_PWR_PLAN_SEL_DBLOG 7U +#define MTR_PWR_PLAN_SEL_CA72 8U +#define MTR_PWR_PLAN_SEL_HSIO 9U +#define MTR_PWR_PLAN_SEL_DRC_0 10U +#define MTR_PWR_PLAN_SEL_DB 11U +#define MTR_PWR_PLAN_SEL_DC_1 12U +#define MTR_PWR_PLAN_SEL_CONNECTIVITY 13U +#define MTR_PWR_PLAN_SEL_DMA 14U +#define MTR_PWR_PLAN_SEL_MIPI_CSI_0 15U +#define MTR_PWR_PLAN_SEL_MIPI_CSI_1 16U +#define MTR_PWR_PLAN_SEL_DRC_1 17U +#define MTR_PWR_PLAN_SEL_DC_0 18U +#define MTR_PWR_PLAN_SEL_RX_HDMI 19U +#define MTR_PWR_PLAN_SEL_IMAGING 20U +#define MTR_PWR_PLAN_SEL_AUDIO 21U +#define MTR_PWR_PLAN_SEL_DI_HDMI 22U +#define MTR_PWR_PLAN_SEL_DI_MIPI_0 23U +#define MTR_PWR_PLAN_SEL_DI_MIPI_1 24U +#define MTR_PWR_PLAN_SEL_VPU 25U + +#define SC_SS_INFO_INIT \ + {HAS_SS_SC, 0, SC_PGP_32, SC_SUBSYS_NA, 0, 0, SC_DSC_SC}, /* SC_SUBSYS_SC */ \ + {HAS_SS_MCU_0, 0, SC_PGP_33, SC_SUBSYS_NA, 0, 0, SC_DSC_MCU_0}, /* SC_SUBSYS_MCU_0 */ \ + {HAS_SS_MCU_1, 1, SC_PGP_03, SC_SUBSYS_NA, 0, 0, SC_DSC_MCU_1}, /* SC_SUBSYS_MCU_1 */ \ + {HAS_SS_CCI, 0, SC_PGP_31, SC_SUBSYS_NA, 0, 0, SC_DSC_CCI}, /* SC_SUBSYS_CCI */ \ + {HAS_SS_AP_0, 0, SC_PGP_31, SC_SUBSYS_NA, 0, 0, SC_DSC_AP_0}, /* SC_SUBSYS_A53 */ \ + {HAS_SS_AP_1, 0, SC_PGP_31, SC_SUBSYS_NA, 0, 0, SC_DSC_AP_1}, /* SC_SUBSYS_A72 */ \ + {HAS_SS_GPU_0, 0, SC_PGP_10, SC_SUBSYS_NA, 0, 0, SC_DSC_GPU_0}, /* SC_SUBSYS_GPU_0 */ \ + {HAS_SS_GPU_1, 1, SC_PGP_00, SC_SUBSYS_NA, 0, 0, SC_DSC_GPU_1}, /* SC_SUBSYS_GPU_1 */ \ + {HAS_SS_VPU, 0, SC_PGP_01, SC_SUBSYS_NA, 0, 0, SC_DSC_VPU}, /* SC_SUBSYS_VPU */ \ + {HAS_SS_DC_0, 0, SC_PGP_20, SC_SUBSYS_IMG, 24, 0, SC_DSC_DC_0}, /* SC_SUBSYS_DC_0 */ \ + {HAS_SS_DC_1, 1, SC_PGP_30, SC_SUBSYS_IMG, 25, 0, SC_DSC_DC_1}, /* SC_SUBSYS_DC_1 */ \ + {HAS_SS_IMG_0, 0, SC_PGP_21, SC_SUBSYS_NA, 0, 0, SC_DSC_IMG}, /* SC_SUBSYS_IMG */ \ + {HAS_SS_AUDIO, 0, SC_PGP_23, SC_SUBSYS_NA, 0, 0, SC_DSC_AUDIO}, /* SC_SUBSYS_AUDIO */ \ + {HAS_SS_DMA, 0, SC_PGP_22, SC_SUBSYS_NA, 0, 0, SC_DSC_DMA}, /* SC_SUBSYS_DMA */ \ + {HAS_SS_CONN, 0, SC_PGP_02, SC_SUBSYS_NA, 0, 0, SC_DSC_CONN}, /* SC_SUBSYS_CONN */ \ + {HAS_SS_DB, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DB}, /* SC_SUBSYS_DB */ \ + {HAS_SS_DBLOGIC, 0, SC_PGP_13, SC_SUBSYS_NA, 0, 0, SC_DSC_DBLOG}, /* SC_SUBSYS_DBLOGIC */ \ + {HAS_SS_DRC_0, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DRC_0}, /* SC_SUBSYS_DRC_0 */ \ + {HAS_SS_DRC_1, 1, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DRC_1}, /* SC_SUBSYS_DRC_1 */ \ + {HAS_SS_LSIO, 0, SC_PGP_12, SC_SUBSYS_NA, 0, 0, SC_DSC_LSIO}, /* SC_SUBSYS_LSIO */ \ + {HAS_SS_HSIO_0, 0, SC_PGP_11, SC_SUBSYS_NA, 0, 0, SC_DSC_HSIO}, /* SC_SUBSYS_HSIO */ \ + {HAS_SS_LVDS_0, 0, SC_PGP_NA, SC_SUBSYS_DC_0, 12, 0, SC_DSC_DI_LVDS_0}, /* SC_SUBSYS_LVDS_0 */ \ + {HAS_SS_LVDS_1, 1, SC_PGP_NA, SC_SUBSYS_DC_1, 12, 0, SC_DSC_DI_LVDS_1}, /* SC_SUBSYS_LVDS_1 */ \ + {HAS_SS_CSI_0, 0, SC_PGP_NA, SC_SUBSYS_IMG, 21, 18, SC_DSC_CSI_0}, /* SC_SUBSYS_CSI_0 */ \ + {HAS_SS_CSI_1, 1, SC_PGP_NA, SC_SUBSYS_IMG, 22, 19, SC_DSC_CSI_1}, /* SC_SUBSYS_CSI_1 */ \ + {HAS_SS_HDMI_RX, 0, SC_PGP_NA, SC_SUBSYS_IMG, 23, 20, SC_DSC_RX_HDMI}, /* SC_SUBSYS_HDMI_RX */ \ + {HAS_SS_HDMI, 0, SC_PGP_NA, SC_SUBSYS_DC_0, 13, 0, SC_DSC_DI_HDMI}, /* SC_SUBSYS_HDMI */ \ + {HAS_SS_MIPI_0, 0, SC_PGP_NA, SC_SUBSYS_DC_0, 11, 0, SC_DSC_DI_MIPI_0}, /* SC_SUBSYS_MIPI_0 */ \ + {HAS_SS_MIPI_1, 1, SC_PGP_NA, SC_SUBSYS_DC_1, 11, 0, SC_DSC_DI_MIPI_1} /* SC_SUBSYS_MIPI_1 */ + +/*! Number of DB */ +#define SC_NUM_DB 1U + +/*! + * DB Connect Type. Stores a subsystem connection mask. + */ +typedef uint32_t sc_db_connect_t; + +/*! DB connect mask */ +#define SC_DB_CONNECT \ + ( BIT(SC_SUBSYS_SC) \ + | BIT(SC_SUBSYS_MCU_0) \ + | BIT(SC_SUBSYS_MCU_1) \ + | BIT(SC_SUBSYS_CCI) \ + | BIT(SC_SUBSYS_GPU_0) \ + | BIT(SC_SUBSYS_GPU_1) \ + | BIT(SC_SUBSYS_VPU) \ + | BIT(SC_SUBSYS_DC_0) \ + | BIT(SC_SUBSYS_DC_1) \ + | BIT(SC_SUBSYS_IMG) \ + | BIT(SC_SUBSYS_AUDIO) \ + | BIT(SC_SUBSYS_DMA) \ + | BIT(SC_SUBSYS_CONN) \ + | BIT(SC_SUBSYS_DBLOGIC) \ + | BIT(SC_SUBSYS_DRC_0) \ + | BIT(SC_SUBSYS_DRC_1) \ + | BIT(SC_SUBSYS_LSIO) \ + | BIT(SC_SUBSYS_HSIO)) + +/*! Init order of DB (SCU outward) */ +#define SC_DB_INIT \ + {SC_R_DB, SC_SUBSYS_DB, SC_DB_CONNECT} + +#define SC_SS_EP_INIT \ + SS_EP_INIT_SC, /* SC_SUBSYS_SC */ \ + SS_EP_INIT_M4, /* SC_SUBSYS_MCU_0 */ \ + SS_EP_INIT_M4, /* SC_SUBSYS_MCU_1 */ \ + SS_EP_INIT_CCI, /* SC_SUBSYS_CCI */ \ + SS_EP_INIT_A53, /* SC_SUBSYS_A53 */ \ + SS_EP_INIT_A72, /* SC_SUBSYS_A72 */ \ + SS_EP_INIT_GPU, /* SC_SUBSYS_GPU_0 */ \ + SS_EP_INIT_GPU, /* SC_SUBSYS_GPU_1 */ \ + SS_EP_INIT_VPU, /* SC_SUBSYS_VPU */ \ + SS_EP_INIT_DC, /* SC_SUBSYS_DC_0 */ \ + SS_EP_INIT_DC, /* SC_SUBSYS_DC_1 */ \ + SS_EP_INIT_IMG, /* SC_SUBSYS_IMG */ \ + SS_EP_INIT_AUDIO, /* SC_SUBSYS_AUDIO */ \ + SS_EP_INIT_DMA, /* SC_SUBSYS_DMA */ \ + SS_EP_INIT_CONN, /* SC_SUBSYS_CONN */ \ + SS_EP_INIT_DB, /* SC_SUBSYS_DB */ \ + SS_EP_INIT_DBLOGIC, /* SC_SUBSYS_DBLOGIC */ \ + SS_EP_INIT_DRC, /* SC_SUBSYS_DRC_0 */ \ + SS_EP_INIT_DRC, /* SC_SUBSYS_DRC_1 */ \ + SS_EP_INIT_LSIO, /* SC_SUBSYS_LSIO */ \ + SS_EP_INIT_HSIO, /* SC_SUBSYS_HSIO */ \ + SS_EP_INIT_LVDS, /* SC_SUBSYS_LVDS_0 */ \ + SS_EP_INIT_LVDS, /* SC_SUBSYS_LVDS_1 */ \ + SS_EP_INIT_CSI, /* SC_SUBSYS_CSI_0 */ \ + SS_EP_INIT_CSI, /* SC_SUBSYS_CSI_1 */ \ + SS_EP_INIT_HDMI_RX, /* SC_SUBSYS_HDMI_RX */ \ + SS_EP_INIT_HDMI, /* SC_SUBSYS_HDMI */ \ + SS_EP_INIT_MIPI, /* SC_SUBSYS_MIPI_0 */ \ + SS_EP_INIT_MIPI /* SC_SUBSYS_MIPI_1 */ + +#define SC_SS_BASE_INFO_INIT \ + &ss_base_info_sc, /* SC_SUBSYS_SC */ \ + &ss_base_info_m4, /* SC_SUBSYS_MCU_0 */ \ + &ss_base_info_m4, /* SC_SUBSYS_MCU_1 */ \ + &ss_base_info_cci, /* SC_SUBSYS_CCI */ \ + &ss_base_info_a53, /* SC_SUBSYS_A53 */ \ + &ss_base_info_a72, /* SC_SUBSYS_A72 */ \ + &ss_base_info_gpu, /* SC_SUBSYS_GPU_0 */ \ + &ss_base_info_gpu, /* SC_SUBSYS_GPU_1 */ \ + &ss_base_info_vpu, /* SC_SUBSYS_VPU */ \ + &ss_base_info_dc, /* SC_SUBSYS_DC_0 */ \ + &ss_base_info_dc, /* SC_SUBSYS_DC_1 */ \ + &ss_base_info_img, /* SC_SUBSYS_IMG */ \ + &ss_base_info_audio, /* SC_SUBSYS_AUDIO */ \ + &ss_base_info_dma, /* SC_SUBSYS_DMA */ \ + &ss_base_info_conn, /* SC_SUBSYS_CONN */ \ + &ss_base_info_db, /* SC_SUBSYS_DB */ \ + &ss_base_info_dblogic, /* SC_SUBSYS_DBLOGIC */ \ + &ss_base_info_drc, /* SC_SUBSYS_DRC_0 */ \ + &ss_base_info_drc, /* SC_SUBSYS_DRC_1 */ \ + &ss_base_info_lsio, /* SC_SUBSYS_LSIO */ \ + &ss_base_info_hsio, /* SC_SUBSYS_HSIO */ \ + &ss_base_info_lvds, /* SC_SUBSYS_LVDS_0 */ \ + &ss_base_info_lvds, /* SC_SUBSYS_LVDS_1 */ \ + &ss_base_info_csi, /* SC_SUBSYS_CSI_0 */ \ + &ss_base_info_csi, /* SC_SUBSYS_CSI_1 */ \ + &ss_base_info_hdmi_rx, /* SC_SUBSYS_HDMI_RX */ \ + &ss_base_info_hdmi, /* SC_SUBSYS_HDMI */ \ + &ss_base_info_mipi, /* SC_SUBSYS_MIPI_0 */ \ + &ss_base_info_mipi /* SC_SUBSYS_MIPI_1 */ + +#ifdef DEBUG + #define SNAME_INIT \ + "SC", \ + "M4_0", \ + "M4_1", \ + "CCI", \ + "A53", \ + "A72", \ + "GPU_0", \ + "GPU_1", \ + "VPU", \ + "DC_0", \ + "DC_1", \ + "IMG", \ + "AUDIO", \ + "DMA", \ + "CONN", \ + "DB", \ + "DBLOGIC", \ + "DRC_0", \ + "DRC_1", \ + "LSIO", \ + "HSIO", \ + "LVDS_0", \ + "LVDS_1", \ + "CSI_0", \ + "CSI_1", \ + "HDMI_RX", \ + "HDMI", \ + "MIPI_0", \ + "MIPI_1" + + #define RNAME_INIT \ + RNAME_INIT_SC_0 \ + RNAME_INIT_M4_0 \ + RNAME_INIT_M4_1 \ + RNAME_INIT_CCI_0 \ + RNAME_INIT_A53_0 \ + RNAME_INIT_A72_0 \ + RNAME_INIT_GPU_0 \ + RNAME_INIT_GPU_1 \ + RNAME_INIT_VPU_0 \ + RNAME_INIT_DC_0 \ + RNAME_INIT_DC_1 \ + RNAME_INIT_IMG_0 \ + RNAME_INIT_AUDIO_0 \ + RNAME_INIT_DMA_0 \ + RNAME_INIT_CONN_0 \ + RNAME_INIT_DB_0 \ + RNAME_INIT_DBLOGIC_0 \ + RNAME_INIT_DRC_0 \ + RNAME_INIT_DRC_1 \ + RNAME_INIT_LSIO_0 \ + RNAME_INIT_HSIO_0 \ + RNAME_INIT_LVDS_0 \ + RNAME_INIT_LVDS_1 \ + RNAME_INIT_CSI_0 \ + RNAME_INIT_CSI_1 \ + RNAME_INIT_HDMI_RX_0 \ + RNAME_INIT_HDMI_0 \ + RNAME_INIT_MIPI_0 \ + RNAME_INIT_MIPI_1 \ + RNAME_INIT_BRD + +#endif + +#define SC_R_DDR SC_R_DRC_0 +#define SC_R_DDR_PLL SC_R_DRC_0_PLL + +/*! Chip versions */ +#define CHIP_VER_B0 0x1U + +/*! Macro to get JTAG ID */ +#ifndef SIMU + #define JTAG_ID (DSC_SC->GPR_STAT[2].RW & 0x1FFU) +#else + #define JTAG_ID ((CHIP_VER_B0 << 5U) | CHIP_ID_QM) +#endif + +/*! Macros to get chip ID and version */ +#define CHIP_ID ((JTAG_ID >> 0U) & 0x1FU) +#define CHIP_VER ((JTAG_ID >> 5U) & 0xFU) + +/* Define IMG DSSCMIX rate */ +#define SC_IMGMIX SC_400MHZ + +/* Configure Top Level Memory Map */ + +#define SC_MEMMAP_INIT \ + { LSIO_SS_BASE1, 0x1C000000U, 1, 1, 30, 1, 0x00, SC_SUBSYS_LSIO}, \ + { SCU_SS_BASE0, 0x4000000U, 0, 1, 26, 0, 0x00, SC_SUBSYS_SC}, \ + { MCU_0_SS_BASE0, 0x4000000U, 1, 1, 26, 0, 0x00, SC_SUBSYS_MCU_0}, \ + { MCU_1_SS_BASE0, 0x4000000U, 1, 1, 26, 0, 0x00, SC_SUBSYS_MCU_1}, \ + {HSIO_0_SS_BASE1, 0x10000000U, 1, 1, 28, 1, 0x00, SC_SUBSYS_HSIO}, \ + {HSIO_0_SS_BASE2, 0x10000000U, 1, 1, 28, 2, 0x00, SC_SUBSYS_HSIO}, \ + { DDR_BASE0, 0x80000000U, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { LSIO_SS_BASE2, 0x40000000U, 1, 1, 30, 2, 0x00, SC_SUBSYS_LSIO}, \ + { DDR_BASE1, 0x780000000ULL, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { SC_NA, SC_NA, 0, 0, 0, 0, 0, 0} + +#define SC_BOOT_ADDR_INIT \ + {OCRAM_ALIAS_BASE, 0x17FFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { OCRAM_BASE, 0x3FFFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { FSPI0_MEM_BASE, 0x10000000U, SC_R_FSPI_0, SC_SUBSYS_LSIO}, \ + { TCML_MCU_0, 0x4000000U, SC_R_MCU_0_PID0, SC_SUBSYS_MCU_0}, \ + { TCML_MCU_1, 0x4000000U, SC_R_MCU_1_PID0, SC_SUBSYS_MCU_1}, \ + { DDR_BASE0, 0x80000000U, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { FSPI1_MEM_BASE, 0x40000000U, SC_R_FSPI_1, SC_SUBSYS_LSIO}, \ + { HSIO_0_SS_BASE0, 0x1000000U, SC_R_SATA_0, SC_SUBSYS_HSIO}, \ + { DDR_BASE1, 0x780000000ULL, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { SC_NA, SC_NA, 0U, 0U} + +/* Configure Features */ + +/* Configure RM */ +#define SC_RM_NUM_PARTITION 20U //!< Number of resource partitions +#define SC_RM_NUM_MEMREG 64U //!< Number of memory regions +#define SC_RM_NUM_DOMAIN 16U //!< Number of resource domains + +/*! PLL frequencies */ +#define MIN_PLL_RATE 648000000U +#define MAX_PLL_RATE 1344000000U +#define MIN_HP_PLL_RATE 1250000000U +#define MAX_HP_PLL_RATE 2500000000U +#define MIN_HP_PLL_1P5_RATE 833333333U +#define PLL_RATE_DEN 960000U +#define DIV_FACTOR_NUM 2 +#define DIV_FACTOR_DEN 3 + +/*! Define to indicate that AV PLL should be used for DC */ +#define USE_AVPLL_FOR_DC + +/*! Define for DB clock gating issue. */ +#define TKT309042_WORKAROUND + +/*! Has 28FDSOI in SCFW API */ +#define API_HAS_28FDSOI + +#ifdef SIMU +/*! Support partitioning naming for debug */ +#define HAS_PARTITION_NAMES +#endif + +#if defined(LTO) || defined (SIMU) +/*! Enhanced monitor support */ +#define MONITOR_HAS_CMD_OFF +#define MONITOR_HAS_CMD_MSG +#define MONITOR_HAS_CMD_VDETECT +#define MONITOR_HAS_CMD_WDOG +#define MONITOR_HAS_CMD_PANIC +#define MONITOR_HAS_CMD_MRC +#define MONITOR_HAS_CMD_BOOT +#define MONITOR_HAS_CMD_WAKE +#define MONITOR_HAS_CMD_GRANT +#endif + +/*! Define to use SECO FW */ +#define HAS_SECO_FW + +/*! Define for FW version */ +#define SECO_FW_VERSION ((3UL << 16) | (7UL << 4) | 4UL) + +/*! Define to use MIPI DSI/CSI trim */ +#define HAS_DSI_VOH_TRIM + +/*! Define DDR DATX8 Lanes */ +#define DWC_NO_OF_BYTES 4U + +/*! Define to support ROM function calls */ +#define SC_ROM_FUNC_ADDR 0x00000580U +#define SC_ROM_FUNC_TAG 0xEA90U +#define SC_ROM_FUNC_VER 0x0001U + +/*! Defines for AI temp sensor */ +#define AI_TEMP_RATE 1000U +#define AI_TEMP_NP 1915 +#define AI_TEMP_NT 25 +#define AI_TEMP_PANIC 127 + +/*! + * Define operating points for A53, A72 and GPU. + */ +#define NUM_GPU_OPP 3 +#define NUM_A53_OPP 4 +#define NUM_A72_OPP 4 + +/*! Define to indicate timer services required */ +#define HAS_TIMER_SERVICES + +/*! Number of boot images supported by ROM */ +#define SC_BOOT_MAX_LIST 8U + +/* Define boot cpu and address based on whether or + not we're running the DDR stress test */ +#ifdef M4_BOOT + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_SRC 0x00040000U + #define BOOT_DST 0x34FE0000U + #define BOOT_SIZE 0x20000U + #define BOOT_FLAGS 0x00000000U +#elif defined(TEST_BOOTTIME) + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00400000U +#else + #define BOOT_CPU SC_R_AP_0_0 + #define BOOT_ADDR 0x080000000UL + #define BOOT_MU SC_R_MU_0A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00000000U +#endif + +/* Boot data address */ +#define SC_BOOT_DATA_ADDR_PTR 0x000005F0U +#define SC_BOOT_DATA_ADDR 0x2001FC00U +#define SC_BOOT_DATA2_ADDR 0x2001FD00U + +/*! Rom boot device mappings */ +/** @{ */ +#define ROM_SDHC_0 SC_R_SDHC_0 +#define ROM_SDHC_1 SC_R_SDHC_1 +#define ROM_SDHC_2 SC_R_SDHC_2 +#define ROM_FSPI_0 SC_R_FSPI_0 +#define ROM_FSPI_1 SC_R_FSPI_1 +#define ROM_USB_0 SC_R_USB_0 +#define ROM_USB_1 SC_R_USB_0 +#define ROM_USB_2 SC_R_USB_2 +/** @} */ + +/* Config IROB */ +#define SC_IROB_CONFIG SC_IROB_4K + +/* Configure Tests */ +#define TEST_HSIO0_PCIE SC_R_PCIE_A +#define TEST_HSIO0_SERDES SC_R_SERDES_0 +#define TEST_HSIO0_MATCH_0 SC_R_MATCH_0 +#define SC_P_TEST_PAD SC_P_UART1_RX +#define SC_P_TEST_PAD_HSIC SC_P_USB_HSIC0_DATA +#define SC_P_TEST_PAD_COMP SC_P_COMP_CTL_GPIO_3V3_USB3IO +#define SC_P_TEST_PAD_CONFIG SC_P_CALIBRATION_0_HSIC +#define TEST_LSIO HAS_SS_LSIO +#define TEST_DMA HAS_SS_DMA +#define TEST_BOARD_ALT2 SC_FALSE + +/* Max MRC regions */ +#define SC_MAX_NUM_MEMREG \ +( \ + 16U /* DB */ \ + + 32U /* HSIO */ \ + + 48U /* LSIO */ \ + + 4U /* MCU 0 */ \ + + 4U /* MCU 1 */ \ + + 4U /* SC */ \ +) + +/*! Define to indicate number of CAAM job rings */ +#define SC_CAAM_JR 4U + +/*! Define to indicate number of MU */ +#define SC_SECO_MU 4U + +/* Configure Resources */ +#define SC_NO_DTCP + +/* Define CPU topology */ +#define SOC_NUM_CLUSTER 2U +#define SOC_IDX_AP_0 0U +#define SOC_IDX_AP_1 1U +#define SOC_NUM_AP_0 4U +#define SOC_NUM_AP_1 2U +#define SOC_NUM_DIG_AUD_PLL 2U + +/* Define MCU topology */ +#define SOC_NUM_MCU 2U +#define SOC_IDX_MCU_0 0U +#define SOC_IDX_MCU_1 1U + +/* Define HMP topology */ +#define SOC_NUM_HMP_NODES 5U +#define SOC_HMP_IDX_SCU 0U /* SCU must be index 0 */ +#define SOC_HMP_IDX_MCU_0 1U /* MCU order must follow topology above */ +#define SOC_HMP_IDX_MCU_1 2U +#define SOC_HMP_IDX_AP_0 3U /* AP order must follow topology above */ +#define SOC_HMP_IDX_AP_1 4U +#define SOC_HMP_IDX_MCU SOC_HMP_IDX_MCU_0 +#define SOC_HMP_IDX_AP SOC_HMP_IDX_AP_0 + +/* Define system-level interface topology */ +#define SOC_NUM_SYS_IF 4U /* Number of system-level interfaces */ +#define SOC_SYS_IF_MU_RSRC 5U /* Number of AP -> SCU message unit resources */ +#define SOC_SYS_IF_ICN_RSRC 3U /* Number of interconnect resources */ +#define SOC_SYS_IF_OCMEM_RSRC 3U /* Number of on-chip memory resources */ +#define SOC_SYS_IF_DDR_RSRC 2U /* Number of DDR resources */ +#define SOC_SYS_IF_CPU_HPM SC_PM_PW_MODE_LP /* CPU power mode threshold for HPM */ + +/* Define wakeup bindings */ +#define SOC_GIC_DSC SC_DSC_DBLOG /* DSC for GIC wakeups */ +#define SOC_IRQSTEER_DSC SC_DSC_DBLOG /* DSC for IRQSTEER wakeup */ +#define SOC_GIC_WAKEUP00 REGBIT64(1, 0) /* DSC IRQ for GIC wakeups */ +#define SOC_IRQSTEER_AP_WAKEUP REGBIT64(1, 11) /* DSC IRQ for AP IRQSTEER wakeup */ +#define SOC_IRQSTEER_MCU_WAKEUP REGBIT64(1, 9) /* DSC IRQ for MCU IRQSTEER wakeup */ +#define SOC_WAKEUP_PW_MODE SC_PM_PW_MODE_STBY /* CPU power mode limit for GIC wakeup */ +#define SOC_RESUME_PW_MODE SC_PM_PW_MODE_ON /* CPU power mode for resume */ +#define SOC_MCU_STOPM_PDN 3U /* STOPM >= 3 will power down MCU core */ +#define SOC_MCU_STOPM_MEMSR 3U /* STOPM == 3 will retain memories */ + +/* Defines for DDR training */ +#define DQS_TIMER_DURATION_512 1U /* 512 * tCK = 2048 * (1/1600) = 1 us (round up) */ +#define DQS_TIMER_DURATION_1008 1U /* 1008 * tCK = 1008 * (1/1600) = 1 us (round up) */ +#define DQS_TIMER_DURATION_2048 2U /* 2048 * tCK = 2048 * (1/1600) = 2 us (round up) */ +#define DQS_TIMER_DURATION_8192 6U /* 8192 * tCK = 8192 * (1/1600) = 6 us (round up) */ + +/* Include SS configs */ + +#include "all_config.h" +#include "board/config.h" +#include "handlers_MX8QM.h" /* Device specific handlers */ + +/* Configure Resources */ + +#define SC_NUM_RSRC \ + (SS_NUM_RSRC_SC \ + + SS_NUM_RSRC_M4 \ + + SS_NUM_RSRC_M4 \ + + SS_NUM_RSRC_CCI \ + + SS_NUM_RSRC_A53 \ + + SS_NUM_RSRC_A72 \ + + SS_NUM_RSRC_GPU \ + + SS_NUM_RSRC_GPU \ + + SS_NUM_RSRC_VPU \ + + SS_NUM_RSRC_DC \ + + SS_NUM_RSRC_DC \ + + SS_NUM_RSRC_IMG \ + + SS_NUM_RSRC_AUDIO \ + + SS_NUM_RSRC_DMA \ + + SS_NUM_RSRC_CONN \ + + SS_NUM_RSRC_DB \ + + SS_NUM_RSRC_DBLOGIC \ + + SS_NUM_RSRC_DRC \ + + SS_NUM_RSRC_DRC \ + + SS_NUM_RSRC_LSIO \ + + SS_NUM_RSRC_HSIO \ + + SS_NUM_RSRC_LVDS \ + + SS_NUM_RSRC_LVDS \ + + SS_NUM_RSRC_CSI \ + + SS_NUM_RSRC_CSI \ + + SS_NUM_RSRC_HDMI_RX \ + + SS_NUM_RSRC_HDMI \ + + SS_NUM_RSRC_MIPI \ + + SS_NUM_RSRC_MIPI \ + + BRD_NUM_RSRC_BRD) + +#define SC_PAD_INIT_INIT \ + {SC_P_SIM0_POWER_EN, 3, 0}, \ + {SC_P_SIM0_GPIO0_00, 3, 0}, \ + {SC_P_UART1_RTS_B, 3, 0}, \ + {SC_P_UART1_CTS_B, 3, 0}, \ + {SC_P_PMIC_I2C_SDA, 3, 0}, \ + {SC_P_PMIC_I2C_SCL, 3, 0}, \ + {SC_P_SPI3_SCK, 3, 0}, \ + {SC_P_SPI3_SDO, 3, 0}, \ + {SC_P_SPI3_SDI, 3, 0}, \ + {SC_P_SPI3_CS0, 3, 0}, \ + {SC_P_SAI1_RXC, 3, 0}, \ + {SC_P_SAI1_RXFS, 3, 0}, \ + {SC_P_USB_SS3_TC0, 3, 0}, \ + {SC_P_USB_SS3_TC1, 3, 0}, \ + {SC_P_USB_SS3_TC2, 3, 0}, \ + {SC_P_USB_SS3_TC3, 3, 0}, \ + {0, 0, 0} + +#define SC_ROM_SS_INIT \ + 0, /* SC_SUBSYS_SC */ \ + 1, /* SC_SUBSYS_MCU_0 */ \ + 2, /* SC_SUBSYS_MCU_1 */ \ + 3, /* SC_SUBSYS_CCI */ \ + 4, /* SC_SUBSYS_A53 */ \ + 5, /* SC_SUBSYS_A72 */ \ + 6, /* SC_SUBSYS_GPU_0 */ \ + 7, /* SC_SUBSYS_GPU_1 */ \ + 8, /* SC_SUBSYS_VPU */ \ + 10, /* SC_SUBSYS_DC_0 */ \ + 11, /* SC_SUBSYS_DC_1 */ \ + 12, /* SC_SUBSYS_IMG */ \ + 13, /* SC_SUBSYS_AUDIO */ \ + 14, /* SC_SUBSYS_DMA */ \ + 15, /* SC_SUBSYS_CONN */ \ + 16, /* SC_SUBSYS_DB */ \ + 17, /* SC_SUBSYS_DBLOGIC */ \ + 18, /* SC_SUBSYS_DRC_0 */ \ + 19, /* SC_SUBSYS_DRC_1 */ \ + 20, /* SC_SUBSYS_LSIO */ \ + 21, /* SC_SUBSYS_HSIO */ \ + 22, /* SC_SUBSYS_LVDS_0 */ \ + 23, /* SC_SUBSYS_LVDS_1 */ \ + 24, /* SC_SUBSYS_CSI_0 */ \ + 25, /* SC_SUBSYS_CSI_1 */ \ + 26, /* SC_SUBSYS_HDMI_RX */ \ + 27, /* SC_SUBSYS_HDMI */ \ + 28, /* SC_SUBSYS_MIPI_0 */ \ + 29 /* SC_SUBSYS_MIPI_1 */ + +#endif /* SC_SOC_H */ + diff --git a/platform/config/mx8qm/ss_ver.h b/platform/config/mx8qm/ss_ver.h new file mode 100644 index 0000000..675936f --- /dev/null +++ b/platform/config/mx8qm/ss_ver.h @@ -0,0 +1,76 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing subsystem version defines. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/ss_ver_h.pl */ + +#ifndef SC_PLATFORM_CONFIG_MX8QM_SS_VER_H +#define SC_PLATFORM_CONFIG_MX8QM_SS_VER_H + +/* Defines */ + +#define SS_VER_A53 1 +#define SS_VER_A72 1 +#define SS_VER_AUDIO 1 +#define SS_VER_BASE 1 +#define SS_VER_CCI 1 +#define SS_VER_CONN 1 +#define SS_VER_CSI 1 +#define SS_VER_DB 1 +#define SS_VER_DBLOGIC 1 +#define SS_VER_DC 1 +#define SS_VER_DMA 1 +#define SS_VER_DRC 1 +#define SS_VER_GPU 1 +#define SS_VER_HDMI 1 +#define SS_VER_HDMI_RX 1 +#define SS_VER_HSIO 1 +#define SS_VER_IMG 1 +#define SS_VER_LSIO 2 +#define SS_VER_LVDS 1 +#define SS_VER_M4 1 +#define SS_VER_MIPI 1 +#define SS_VER_SC 2 +#define SS_VER_VPU 3 + +#endif /* SC_PLATFORM_CONFIG_MX8QM_SS_VER_H */ + diff --git a/platform/config/mx8qx/ALL/has_ss.h b/platform/config/mx8qx/ALL/has_ss.h new file mode 100755 index 0000000..feb9406 --- /dev/null +++ b/platform/config/mx8qx/ALL/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 0 +#define HAS_SS_CCI 0 +#define HAS_SS_AP_0 0 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 1 +#define HAS_SS_GPU_0 1 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 1 +#define HAS_SS_DC_0 1 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 1 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 1 +#define HAS_SS_DMA 0 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 0 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 0 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 1 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 1 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 1 +#define HAS_SS_MIPI_1 1 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qx/CORES/has_ss.h b/platform/config/mx8qx/CORES/has_ss.h new file mode 100755 index 0000000..c035f79 --- /dev/null +++ b/platform/config/mx8qx/CORES/has_ss.h @@ -0,0 +1,90 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure subsystem availability. + * + */ +/*==========================================================================*/ + +#ifndef SC_HAS_SS_H +#define SC_HAS_SS_H + +/* Subsystem Switches */ + +#define HAS_SS_SC 1 +#define HAS_SS_MCU_0 1 +#define HAS_SS_MCU_1 0 +#define HAS_SS_CCI 0 +#define HAS_SS_AP_0 0 +#define HAS_SS_AP_1 0 +#define HAS_SS_AP_2 1 +#define HAS_SS_GPU_0 0 +#define HAS_SS_GPU_1 0 +#define HAS_SS_VPU 0 +#define HAS_SS_DC_0 0 +#define HAS_SS_DC_1 0 +#define HAS_SS_IMG_0 0 +#define HAS_SS_AUDIO 0 +#define HAS_SS_ADMA 1 +#define HAS_SS_DMA 0 +#define HAS_SS_CONN 1 +#define HAS_SS_DB 1 +#define HAS_SS_DBLOGIC 0 +#define HAS_SS_DRC_0 1 +#define HAS_SS_DRC_1 0 +#define HAS_SS_LSIO 1 +#define HAS_SS_HSLSIO 0 +#define HAS_SS_HSIO_0 1 +#define HAS_SS_HSIO_1 0 +#define HAS_SS_LCD_0 0 +#define HAS_SS_LVDS_0 0 +#define HAS_SS_LVDS_1 0 +#define HAS_SS_LVDS_2 0 +#define HAS_SS_PI_0 0 +#define HAS_SS_PI_1 0 +#define HAS_SS_CSI_0 0 +#define HAS_SS_CSI_1 0 +#define HAS_SS_HDMI_RX 0 +#define HAS_SS_HDMI 0 +#define HAS_SS_MIPI_0 0 +#define HAS_SS_MIPI_1 0 +#define HAS_SS_V2X 0 + +#endif /* SC_HAS_SS_H */ + diff --git a/platform/config/mx8qx/iomuxd.h b/platform/config/mx8qx/iomuxd.h new file mode 100755 index 0000000..faaacb2 --- /dev/null +++ b/platform/config/mx8qx/iomuxd.h @@ -0,0 +1,238 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef IOMUXD_H +#define IOMUXD_H + +#ifndef IOMUXD_REG_BASE + #ifdef SCU_RESOURCES + #define IOMUXD_REG_BASE 0x41F80000U + #else + #define IOMUXD_REG_BASE 0x33F80000U + #endif +#endif + + // NUM RING GROUP PAD | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +#define IOMUXD__PCIE_CTRL0_PERST_B REG32(IOMUXD_REG_BASE+0x00000000U) // 0 0 0 0 | HSIO.PCIE0.PERST_B | | | | LSIO.GPIO4.IO00 | | | | | +#define IOMUXD__PCIE_CTRL0_CLKREQ_B REG32(IOMUXD_REG_BASE+0x00000040U) // 0 0 0 1 | HSIO.PCIE0.CLKREQ_B | | | | LSIO.GPIO4.IO01 | | | | | +#define IOMUXD__PCIE_CTRL0_WAKE_B REG32(IOMUXD_REG_BASE+0x00000080U) // 0 0 0 2 | HSIO.PCIE0.WAKE_B | | | | LSIO.GPIO4.IO02 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_PCIESEP REG32(IOMUXD_REG_BASE+0x000000C0U) // 0 0 0 3 | | | | | | | | | | +#define IOMUXD__USB_SS3_TC0 REG32(IOMUXD_REG_BASE+0x00000100U) // 0 0 0 4 | ADMA.I2C1.SCL | CONN.USB_OTG1.PWR | CONN.USB_OTG2.PWR | | LSIO.GPIO4.IO03 | | | | | +#define IOMUXD__USB_SS3_TC1 REG32(IOMUXD_REG_BASE+0x00000140U) // 0 0 0 5 | ADMA.I2C1.SCL | CONN.USB_OTG2.PWR | | | LSIO.GPIO4.IO04 | | | | | +#define IOMUXD__USB_SS3_TC2 REG32(IOMUXD_REG_BASE+0x00000180U) // 0 0 0 6 | ADMA.I2C1.SDA | CONN.USB_OTG1.OC | CONN.USB_OTG2.OC | | LSIO.GPIO4.IO05 | | | | | +#define IOMUXD__USB_SS3_TC3 REG32(IOMUXD_REG_BASE+0x000001C0U) // 0 0 0 7 | ADMA.I2C1.SDA | CONN.USB_OTG2.OC | | | LSIO.GPIO4.IO06 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_3V3_USB3IO REG32(IOMUXD_REG_BASE+0x00000200U) // 0 0 0 8 | | | | | | | | | | +#define IOMUXD__EMMC0_CLK REG32(IOMUXD_REG_BASE+0x00020000U) // 1 1 0 0 | CONN.EMMC0.CLK | CONN.NAND.READY_B | | | LSIO.GPIO4.IO07 | | | | | +#define IOMUXD__EMMC0_CMD REG32(IOMUXD_REG_BASE+0x00020040U) // 1 1 0 1 | CONN.EMMC0.CMD | CONN.NAND.DQS | | | LSIO.GPIO4.IO08 | | | | | +#define IOMUXD__EMMC0_DATA0 REG32(IOMUXD_REG_BASE+0x00020080U) // 1 1 0 2 | CONN.EMMC0.DATA0 | CONN.NAND.DATA00 | | | LSIO.GPIO4.IO09 | | | | | +#define IOMUXD__EMMC0_DATA1 REG32(IOMUXD_REG_BASE+0x000200C0U) // 1 1 0 3 | CONN.EMMC0.DATA1 | CONN.NAND.DATA01 | | | LSIO.GPIO4.IO10 | | | | | +#define IOMUXD__EMMC0_DATA2 REG32(IOMUXD_REG_BASE+0x00020100U) // 1 1 0 4 | CONN.EMMC0.DATA2 | CONN.NAND.DATA02 | | | LSIO.GPIO4.IO11 | | | | | +#define IOMUXD__EMMC0_DATA3 REG32(IOMUXD_REG_BASE+0x00020140U) // 1 1 0 5 | CONN.EMMC0.DATA3 | CONN.NAND.DATA03 | | | LSIO.GPIO4.IO12 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SD1FIX0 REG32(IOMUXD_REG_BASE+0x00020180U) // 1 1 0 6 | | | | | | | | | | +#define IOMUXD__EMMC0_DATA4 REG32(IOMUXD_REG_BASE+0x000201C0U) // 1 1 0 7 | CONN.EMMC0.DATA4 | CONN.NAND.DATA04 | | CONN.EMMC0.WP | LSIO.GPIO4.IO13 | | | | | +#define IOMUXD__EMMC0_DATA5 REG32(IOMUXD_REG_BASE+0x00020200U) // 1 1 0 8 | CONN.EMMC0.DATA5 | CONN.NAND.DATA05 | | CONN.EMMC0.VSELECT | LSIO.GPIO4.IO14 | | | | | +#define IOMUXD__EMMC0_DATA6 REG32(IOMUXD_REG_BASE+0x00020240U) // 1 1 0 9 | CONN.EMMC0.DATA6 | CONN.NAND.DATA06 | | CONN.MLB.CLK | LSIO.GPIO4.IO15 | | | | | +#define IOMUXD__EMMC0_DATA7 REG32(IOMUXD_REG_BASE+0x00020280U) // 1 1 0 10 | CONN.EMMC0.DATA7 | CONN.NAND.DATA07 | | CONN.MLB.SIG | LSIO.GPIO4.IO16 | | | | | +#define IOMUXD__EMMC0_STROBE REG32(IOMUXD_REG_BASE+0x000202C0U) // 1 1 0 11 | CONN.EMMC0.STROBE | CONN.NAND.CLE | | CONN.MLB.DATA | LSIO.GPIO4.IO17 | | | | | +#define IOMUXD__EMMC0_RESET_B REG32(IOMUXD_REG_BASE+0x00020300U) // 1 1 0 12 | CONN.EMMC0.RESET_B | CONN.NAND.WP_B | | | LSIO.GPIO4.IO18 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_SD1FIX1 REG32(IOMUXD_REG_BASE+0x00020340U) // 1 1 0 13 | | | | | | | | | | +#define IOMUXD__USDHC1_RESET_B REG32(IOMUXD_REG_BASE+0x00020380U) // 1 1 0 14 | CONN.USDHC1.RESET_B | CONN.NAND.RE_N | ADMA.SPI2.SCK | | LSIO.GPIO4.IO19 | | | | | +#define IOMUXD__USDHC1_VSELECT REG32(IOMUXD_REG_BASE+0x00021000U) // 2 1 1 0 | CONN.USDHC1.VSELECT | CONN.NAND.RE_P | ADMA.SPI2.SDO | CONN.NAND.RE_B | LSIO.GPIO4.IO20 | | | | | +#define IOMUXD__IOMUXD_CTL_NAND_RE_P_N REG32(IOMUXD_REG_BASE+0x00021040U) // 2 1 1 1 | | | | | | | | | | +#define IOMUXD__USDHC1_WP REG32(IOMUXD_REG_BASE+0x00021080U) // 2 1 1 2 | CONN.USDHC1.WP | CONN.NAND.DQS_N | ADMA.SPI2.SDI | | LSIO.GPIO4.IO21 | | | | | +#define IOMUXD__USDHC1_CD_B REG32(IOMUXD_REG_BASE+0x000210C0U) // 2 1 1 3 | CONN.USDHC1.CD_B | CONN.NAND.DQS_P | ADMA.SPI2.CS0 | CONN.NAND.DQS | LSIO.GPIO4.IO22 | | | | | +#define IOMUXD__IOMUXD_CTL_NAND_DQS_P_N REG32(IOMUXD_REG_BASE+0x00021100U) // 2 1 1 4 | | | | | | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSELSEP REG32(IOMUXD_REG_BASE+0x00021140U) // 2 1 1 5 | | | | | | | | | | +#define IOMUXD__USDHC1_CLK REG32(IOMUXD_REG_BASE+0x00021180U) // 2 1 1 6 | CONN.USDHC1.CLK | | ADMA.UART3.RX | | LSIO.GPIO4.IO23 | | | | | +#define IOMUXD__USDHC1_CMD REG32(IOMUXD_REG_BASE+0x000211C0U) // 2 1 1 7 | CONN.USDHC1.CMD | CONN.NAND.CE0_B | ADMA.MQS.R | | LSIO.GPIO4.IO24 | | | | | +#define IOMUXD__USDHC1_DATA0 REG32(IOMUXD_REG_BASE+0x00021200U) // 2 1 1 8 | CONN.USDHC1.DATA0 | CONN.NAND.CE1_B | ADMA.MQS.L | | LSIO.GPIO4.IO25 | | | | | +#define IOMUXD__USDHC1_DATA1 REG32(IOMUXD_REG_BASE+0x00021240U) // 2 1 1 9 | CONN.USDHC1.DATA1 | CONN.NAND.RE_B | ADMA.UART3.TX | | LSIO.GPIO4.IO26 | | | | | +#define IOMUXD__USDHC1_DATA2 REG32(IOMUXD_REG_BASE+0x00021280U) // 2 1 1 10 | CONN.USDHC1.DATA2 | CONN.NAND.WE_B | ADMA.UART3.CTS_B | | LSIO.GPIO4.IO27 | | | | | +#define IOMUXD__USDHC1_DATA3 REG32(IOMUXD_REG_BASE+0x000212C0U) // 2 1 1 11 | CONN.USDHC1.DATA3 | CONN.NAND.ALE | ADMA.UART3.RTS_B | | LSIO.GPIO4.IO28 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_VSEL3 REG32(IOMUXD_REG_BASE+0x00021300U) // 2 1 1 12 | | | | | | | | | | +#define IOMUXD__ENET0_RGMII_TXC REG32(IOMUXD_REG_BASE+0x00021340U) // 2 1 1 13 | CONN.ENET0.RGMII_TXC | CONN.ENET0.RCLK50M_OUT | CONN.ENET0.RCLK50M_IN | CONN.NAND.CE1_B | LSIO.GPIO4.IO29 | | | | | +#define IOMUXD__ENET0_RGMII_TX_CTL REG32(IOMUXD_REG_BASE+0x00021380U) // 2 1 1 14 | CONN.ENET0.RGMII_TX_CTL | | | CONN.USDHC1.RESET_B | LSIO.GPIO4.IO30 | | | | | +#define IOMUXD__ENET0_RGMII_TXD0 REG32(IOMUXD_REG_BASE+0x00022000U) // 3 1 2 0 | CONN.ENET0.RGMII_TXD0 | | | CONN.USDHC1.VSELECT | LSIO.GPIO4.IO31 | | | | | +#define IOMUXD__ENET0_RGMII_TXD1 REG32(IOMUXD_REG_BASE+0x00022040U) // 3 1 2 1 | CONN.ENET0.RGMII_TXD1 | | | CONN.USDHC1.WP | LSIO.GPIO5.IO00 | | | | | +#define IOMUXD__ENET0_RGMII_TXD2 REG32(IOMUXD_REG_BASE+0x00022080U) // 3 1 2 2 | CONN.ENET0.RGMII_TXD2 | CONN.MLB.CLK | CONN.NAND.CE0_B | CONN.USDHC1.CD_B | LSIO.GPIO5.IO01 | | | | | +#define IOMUXD__ENET0_RGMII_TXD3 REG32(IOMUXD_REG_BASE+0x000220C0U) // 3 1 2 3 | CONN.ENET0.RGMII_TXD3 | CONN.MLB.SIG | CONN.NAND.RE_B | | LSIO.GPIO5.IO02 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB0 REG32(IOMUXD_REG_BASE+0x00022100U) // 3 1 2 4 | | | | | | | | | | +#define IOMUXD__ENET0_RGMII_RXC REG32(IOMUXD_REG_BASE+0x00022140U) // 3 1 2 5 | CONN.ENET0.RGMII_RXC | CONN.MLB.DATA | CONN.NAND.WE_B | CONN.USDHC1.CLK | LSIO.GPIO5.IO03 | | | | | +#define IOMUXD__ENET0_RGMII_RX_CTL REG32(IOMUXD_REG_BASE+0x00022180U) // 3 1 2 6 | CONN.ENET0.RGMII_RX_CTL | | | CONN.USDHC1.CMD | LSIO.GPIO5.IO04 | | | | | +#define IOMUXD__ENET0_RGMII_RXD0 REG32(IOMUXD_REG_BASE+0x000221C0U) // 3 1 2 7 | CONN.ENET0.RGMII_RXD0 | | | CONN.USDHC1.DATA0 | LSIO.GPIO5.IO05 | | | | | +#define IOMUXD__ENET0_RGMII_RXD1 REG32(IOMUXD_REG_BASE+0x00022200U) // 3 1 2 8 | CONN.ENET0.RGMII_RXD1 | | | CONN.USDHC1.DATA1 | LSIO.GPIO5.IO06 | | | | | +#define IOMUXD__ENET0_RGMII_RXD2 REG32(IOMUXD_REG_BASE+0x00022240U) // 3 1 2 9 | CONN.ENET0.RGMII_RXD2 | CONN.ENET0.RMII_RX_ER | | CONN.USDHC1.DATA2 | LSIO.GPIO5.IO07 | | | | | +#define IOMUXD__ENET0_RGMII_RXD3 REG32(IOMUXD_REG_BASE+0x00022280U) // 3 1 2 10 | CONN.ENET0.RGMII_RXD3 | | CONN.NAND.ALE | CONN.USDHC1.DATA3 | LSIO.GPIO5.IO08 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_ENET_ENETB1 REG32(IOMUXD_REG_BASE+0x000222C0U) // 3 1 2 11 | | | | | | | | | | +#define IOMUXD__ENET0_REFCLK_125M_25M REG32(IOMUXD_REG_BASE+0x00022300U) // 3 1 2 12 | CONN.ENET0.REFCLK_125M_25M | CONN.ENET0.PPS | CONN.ENET1.PPS | | LSIO.GPIO5.IO09 | | | | | +#define IOMUXD__ENET0_MDIO REG32(IOMUXD_REG_BASE+0x00023000U) // 4 1 3 0 | CONN.ENET0.MDIO | ADMA.I2C3.SDA | CONN.ENET1.MDIO | | LSIO.GPIO5.IO10 | | | | | +#define IOMUXD__ENET0_MDC REG32(IOMUXD_REG_BASE+0x00023040U) // 4 1 3 1 | CONN.ENET0.MDC | ADMA.I2C3.SCL | CONN.ENET1.MDC | | LSIO.GPIO5.IO11 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOCT REG32(IOMUXD_REG_BASE+0x00023080U) // 4 1 3 2 | | | | | | | | | | +#define IOMUXD__ESAI0_FSR REG32(IOMUXD_REG_BASE+0x000230C0U) // 4 1 3 3 | ADMA.ESAI0.FSR | CONN.ENET1.RCLK50M_OUT | ADMA.LCDIF.D00 | CONN.ENET1.RGMII_TXC | CONN.ENET1.RCLK50M_IN | | | | | +#define IOMUXD__ESAI0_FST REG32(IOMUXD_REG_BASE+0x00023100U) // 4 1 3 4 | ADMA.ESAI0.FST | CONN.MLB.CLK | ADMA.LCDIF.D01 | CONN.ENET1.RGMII_TXD2 | LSIO.GPIO0.IO01 | | | | | +#define IOMUXD__ESAI0_SCKR REG32(IOMUXD_REG_BASE+0x00023140U) // 4 1 3 5 | ADMA.ESAI0.SCKR | | ADMA.LCDIF.D02 | CONN.ENET1.RGMII_TX_CTL | LSIO.GPIO0.IO02 | | | | | +#define IOMUXD__ESAI0_SCKT REG32(IOMUXD_REG_BASE+0x00023180U) // 4 1 3 6 | ADMA.ESAI0.SCKT | CONN.MLB.SIG | ADMA.LCDIF.D03 | CONN.ENET1.RGMII_TXD3 | LSIO.GPIO0.IO03 | | | | | +#define IOMUXD__ESAI0_TX0 REG32(IOMUXD_REG_BASE+0x000231C0U) // 4 1 3 7 | ADMA.ESAI0.TX0 | CONN.MLB.DATA | ADMA.LCDIF.D04 | CONN.ENET1.RGMII_RXC | LSIO.GPIO0.IO04 | | | | | +#define IOMUXD__ESAI0_TX1 REG32(IOMUXD_REG_BASE+0x00023200U) // 4 1 3 8 | ADMA.ESAI0.TX1 | | ADMA.LCDIF.D05 | CONN.ENET1.RGMII_RXD3 | LSIO.GPIO0.IO05 | | | | | +#define IOMUXD__ESAI0_TX2_RX3 REG32(IOMUXD_REG_BASE+0x00023240U) // 4 1 3 9 | ADMA.ESAI0.TX2_RX3 | CONN.ENET1.RMII_RX_ER | ADMA.LCDIF.D06 | CONN.ENET1.RGMII_RXD2 | LSIO.GPIO0.IO06 | | | | | +#define IOMUXD__ESAI0_TX3_RX2 REG32(IOMUXD_REG_BASE+0x00023280U) // 4 1 3 10 | ADMA.ESAI0.TX3_RX2 | | ADMA.LCDIF.D07 | CONN.ENET1.RGMII_RXD1 | LSIO.GPIO0.IO07 | | | | | +#define IOMUXD__ESAI0_TX4_RX1 REG32(IOMUXD_REG_BASE+0x000232C0U) // 4 1 3 11 | ADMA.ESAI0.TX4_RX1 | | ADMA.LCDIF.D08 | CONN.ENET1.RGMII_TXD0 | LSIO.GPIO0.IO08 | | | | | +#define IOMUXD__ESAI0_TX5_RX0 REG32(IOMUXD_REG_BASE+0x00023300U) // 4 1 3 12 | ADMA.ESAI0.TX5_RX0 | | ADMA.LCDIF.D09 | CONN.ENET1.RGMII_TXD1 | LSIO.GPIO0.IO09 | | | | | +#define IOMUXD__SPDIF0_RX REG32(IOMUXD_REG_BASE+0x00023340U) // 4 1 3 13 | ADMA.SPDIF0.RX | ADMA.MQS.R | ADMA.LCDIF.D10 | CONN.ENET1.RGMII_RXD0 | LSIO.GPIO0.IO10 | | | | | +#define IOMUXD__SPDIF0_TX REG32(IOMUXD_REG_BASE+0x00023380U) // 4 1 3 14 | ADMA.SPDIF0.TX | ADMA.MQS.L | ADMA.LCDIF.D11 | CONN.ENET1.RGMII_RX_CTL | LSIO.GPIO0.IO11 | | | | | +#define IOMUXD__SPDIF0_EXT_CLK REG32(IOMUXD_REG_BASE+0x00024000U) // 5 1 4 0 | ADMA.SPDIF0.EXT_CLK | | ADMA.LCDIF.D12 | CONN.ENET1.REFCLK_125M_25M | LSIO.GPIO0.IO12 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHB REG32(IOMUXD_REG_BASE+0x00024040U) // 5 1 4 1 | | | | | | | | | | +#define IOMUXD__SPI3_SCK REG32(IOMUXD_REG_BASE+0x00024080U) // 5 1 4 2 | ADMA.SPI3.SCK | | ADMA.LCDIF.D13 | | LSIO.GPIO0.IO13 | | | | | +#define IOMUXD__SPI3_SDO REG32(IOMUXD_REG_BASE+0x000240C0U) // 5 1 4 3 | ADMA.SPI3.SDO | | ADMA.LCDIF.D14 | | LSIO.GPIO0.IO14 | | | | | +#define IOMUXD__SPI3_SDI REG32(IOMUXD_REG_BASE+0x00024100U) // 5 1 4 4 | ADMA.SPI3.SDI | | ADMA.LCDIF.D15 | | LSIO.GPIO0.IO15 | | | | | +#define IOMUXD__SPI3_CS0 REG32(IOMUXD_REG_BASE+0x00024140U) // 5 1 4 5 | ADMA.SPI3.CS0 | ADMA.ACM.MCLK_OUT1 | ADMA.LCDIF.HSYNC | | LSIO.GPIO0.IO16 | | | | | +#define IOMUXD__SPI3_CS1 REG32(IOMUXD_REG_BASE+0x00024180U) // 5 1 4 6 | ADMA.SPI3.CS1 | ADMA.I2C3.SCL | ADMA.LCDIF.RESET | ADMA.SPI2.CS0 | ADMA.LCDIF.D16 | | | | | +#define IOMUXD__MCLK_IN1 REG32(IOMUXD_REG_BASE+0x000241C0U) // 5 1 4 7 | ADMA.ACM.MCLK_IN1 | ADMA.I2C3.SDA | ADMA.LCDIF.EN | ADMA.SPI2.SCK | ADMA.LCDIF.D17 | | | | | +#define IOMUXD__MCLK_IN0 REG32(IOMUXD_REG_BASE+0x00024200U) // 5 1 4 8 | ADMA.ACM.MCLK_IN0 | ADMA.ESAI0.RX_HF_CLK | ADMA.LCDIF.VSYNC | ADMA.SPI2.SDI | LSIO.GPIO0.IO19 | | | | | +#define IOMUXD__MCLK_OUT0 REG32(IOMUXD_REG_BASE+0x00024240U) // 5 1 4 9 | ADMA.ACM.MCLK_OUT0 | ADMA.ESAI0.TX_HF_CLK | ADMA.LCDIF.CLK | ADMA.SPI2.SDO | LSIO.GPIO0.IO20 | | | | | +#define IOMUXD__UART1_TX REG32(IOMUXD_REG_BASE+0x00024280U) // 5 1 4 10 | ADMA.UART1.TX | LSIO.PWM0.OUT | LSIO.GPT0.CAPTURE | | LSIO.GPIO0.IO21 | | | | | +#define IOMUXD__UART1_RX REG32(IOMUXD_REG_BASE+0x000242C0U) // 5 1 4 11 | ADMA.UART1.RX | LSIO.PWM1.OUT | LSIO.GPT0.COMPARE | LSIO.GPT1.CLK | LSIO.GPIO0.IO22 | | | | | +#define IOMUXD__UART1_RTS_B REG32(IOMUXD_REG_BASE+0x00024300U) // 5 1 4 12 | ADMA.UART1.RTS_B | LSIO.PWM2.OUT | ADMA.LCDIF.D16 | LSIO.GPT1.CAPTURE | LSIO.GPT0.CLK | | | | | +#define IOMUXD__UART1_CTS_B REG32(IOMUXD_REG_BASE+0x00024340U) // 5 1 4 13 | ADMA.UART1.CTS_B | LSIO.PWM3.OUT | ADMA.LCDIF.D17 | LSIO.GPT1.COMPARE | LSIO.GPIO0.IO24 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHK REG32(IOMUXD_REG_BASE+0x00024380U) // 5 1 4 14 | | | | | | | | | | +#define IOMUXD__SAI0_TXD REG32(IOMUXD_REG_BASE+0x00040000U) // 6 2 0 0 | ADMA.SAI0.TXD | ADMA.SAI1.RXC | ADMA.SPI1.SDO | ADMA.LCDIF.D18 | LSIO.GPIO0.IO25 | | | | | +#define IOMUXD__SAI0_TXC REG32(IOMUXD_REG_BASE+0x00040040U) // 6 2 0 1 | ADMA.SAI0.TXC | ADMA.SAI1.TXD | ADMA.SPI1.SDI | ADMA.LCDIF.D19 | LSIO.GPIO0.IO26 | | | | | +#define IOMUXD__SAI0_RXD REG32(IOMUXD_REG_BASE+0x00040080U) // 6 2 0 2 | ADMA.SAI0.RXD | ADMA.SAI1.RXFS | ADMA.SPI1.CS0 | ADMA.LCDIF.D20 | LSIO.GPIO0.IO27 | | | | | +#define IOMUXD__SAI0_TXFS REG32(IOMUXD_REG_BASE+0x000400C0U) // 6 2 0 3 | ADMA.SAI0.TXFS | ADMA.SPI2.CS1 | ADMA.SPI1.SCK | | LSIO.GPIO0.IO28 | | | | | +#define IOMUXD__SAI1_RXD REG32(IOMUXD_REG_BASE+0x00040100U) // 6 2 0 4 | ADMA.SAI1.RXD | ADMA.SAI0.RXFS | ADMA.SPI1.CS1 | ADMA.LCDIF.D21 | LSIO.GPIO0.IO29 | | | | | +#define IOMUXD__SAI1_RXC REG32(IOMUXD_REG_BASE+0x00040140U) // 6 2 0 5 | ADMA.SAI1.RXC | ADMA.SAI1.TXC | | ADMA.LCDIF.D22 | LSIO.GPIO0.IO30 | | | | | +#define IOMUXD__SAI1_RXFS REG32(IOMUXD_REG_BASE+0x00040180U) // 6 2 0 6 | ADMA.SAI1.RXFS | ADMA.SAI1.TXFS | | ADMA.LCDIF.D23 | LSIO.GPIO0.IO31 | | | | | +#define IOMUXD__SPI2_CS0 REG32(IOMUXD_REG_BASE+0x000401C0U) // 6 2 0 7 | ADMA.SPI2.CS0 | | | | LSIO.GPIO1.IO00 | | | | | +#define IOMUXD__SPI2_SDO REG32(IOMUXD_REG_BASE+0x00040200U) // 6 2 0 8 | ADMA.SPI2.SDO | | | | LSIO.GPIO1.IO01 | | | | | +#define IOMUXD__SPI2_SDI REG32(IOMUXD_REG_BASE+0x00040240U) // 6 2 0 9 | ADMA.SPI2.SDI | | | | LSIO.GPIO1.IO02 | | | | | +#define IOMUXD__SPI2_SCK REG32(IOMUXD_REG_BASE+0x00040280U) // 6 2 0 10 | ADMA.SPI2.SCK | | | | LSIO.GPIO1.IO03 | | | | | +#define IOMUXD__SPI0_SCK REG32(IOMUXD_REG_BASE+0x000402C0U) // 6 2 0 11 | ADMA.SPI0.SCK | ADMA.SAI0.TXC | M40.I2C0.SCL | M40.GPIO0.IO00 | LSIO.GPIO1.IO04 | | | | | +#define IOMUXD__SPI0_SDI REG32(IOMUXD_REG_BASE+0x00040300U) // 6 2 0 12 | ADMA.SPI0.SDI | ADMA.SAI0.TXD | M40.TPM0.CH0 | M40.GPIO0.IO02 | LSIO.GPIO1.IO05 | | | | | +#define IOMUXD__SPI0_SDO REG32(IOMUXD_REG_BASE+0x00040340U) // 6 2 0 13 | ADMA.SPI0.SDO | ADMA.SAI0.TXFS | M40.I2C0.SDA | M40.GPIO0.IO01 | LSIO.GPIO1.IO06 | | | | | +#define IOMUXD__SPI0_CS1 REG32(IOMUXD_REG_BASE+0x00040380U) // 6 2 0 14 | ADMA.SPI0.CS1 | ADMA.SAI0.RXC | ADMA.SAI1.TXD | ADMA.LCD_PWM0.OUT | LSIO.GPIO1.IO07 | | | | | +#define IOMUXD__SPI0_CS0 REG32(IOMUXD_REG_BASE+0x00041000U) // 7 2 1 0 | ADMA.SPI0.CS0 | ADMA.SAI0.RXD | M40.TPM0.CH1 | M40.GPIO0.IO03 | LSIO.GPIO1.IO08 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHT REG32(IOMUXD_REG_BASE+0x00041040U) // 7 2 1 1 | | | | | | | | | | +#define IOMUXD__ADC_IN1 REG32(IOMUXD_REG_BASE+0x00041080U) // 7 2 1 2 | ADMA.ADC.IN1 | M40.I2C0.SDA | M40.GPIO0.IO01 | | LSIO.GPIO1.IO09 | | | | | +#define IOMUXD__ADC_IN0 REG32(IOMUXD_REG_BASE+0x000410C0U) // 7 2 1 3 | ADMA.ADC.IN0 | M40.I2C0.SCL | M40.GPIO0.IO00 | | LSIO.GPIO1.IO10 | | | | | +#define IOMUXD__ADC_IN3 REG32(IOMUXD_REG_BASE+0x00041100U) // 7 2 1 4 | ADMA.ADC.IN3 | M40.UART0.TX | M40.GPIO0.IO03 | ADMA.ACM.MCLK_OUT0 | LSIO.GPIO1.IO11 | | | | | +#define IOMUXD__ADC_IN2 REG32(IOMUXD_REG_BASE+0x00041140U) // 7 2 1 5 | ADMA.ADC.IN2 | M40.UART0.RX | M40.GPIO0.IO02 | ADMA.ACM.MCLK_IN0 | LSIO.GPIO1.IO12 | | | | | +#define IOMUXD__ADC_IN5 REG32(IOMUXD_REG_BASE+0x00041180U) // 7 2 1 6 | ADMA.ADC.IN5 | M40.TPM0.CH1 | M40.GPIO0.IO05 | | LSIO.GPIO1.IO13 | | | | | +#define IOMUXD__ADC_IN4 REG32(IOMUXD_REG_BASE+0x000411C0U) // 7 2 1 7 | ADMA.ADC.IN4 | M40.TPM0.CH0 | M40.GPIO0.IO04 | | LSIO.GPIO1.IO14 | | | | | +#define IOMUXD__FLEXCAN0_RX REG32(IOMUXD_REG_BASE+0x00041200U) // 7 2 1 8 | ADMA.FLEXCAN0.RX | ADMA.SAI2.RXC | ADMA.UART0.RTS_B | ADMA.SAI1.TXC | LSIO.GPIO1.IO15 | | | | | +#define IOMUXD__FLEXCAN0_TX REG32(IOMUXD_REG_BASE+0x00041240U) // 7 2 1 9 | ADMA.FLEXCAN0.TX | ADMA.SAI2.RXD | ADMA.UART0.CTS_B | ADMA.SAI1.TXFS | LSIO.GPIO1.IO16 | | | | | +#define IOMUXD__FLEXCAN1_RX REG32(IOMUXD_REG_BASE+0x00041280U) // 7 2 1 10 | ADMA.FLEXCAN1.RX | ADMA.SAI2.RXFS | ADMA.FTM.CH2 | ADMA.SAI1.TXD | LSIO.GPIO1.IO17 | | | | | +#define IOMUXD__FLEXCAN1_TX REG32(IOMUXD_REG_BASE+0x000412C0U) // 7 2 1 11 | ADMA.FLEXCAN1.TX | ADMA.SAI3.RXC | ADMA.DMA0.REQ_IN0 | ADMA.SAI1.RXD | LSIO.GPIO1.IO18 | | | | | +#define IOMUXD__FLEXCAN2_RX REG32(IOMUXD_REG_BASE+0x00041300U) // 7 2 1 12 | ADMA.FLEXCAN2.RX | ADMA.SAI3.RXD | ADMA.UART3.RX | ADMA.SAI1.RXFS | LSIO.GPIO1.IO19 | | | | | +#define IOMUXD__FLEXCAN2_TX REG32(IOMUXD_REG_BASE+0x00041340U) // 7 2 1 13 | ADMA.FLEXCAN2.TX | ADMA.SAI3.RXFS | ADMA.UART3.TX | ADMA.SAI1.RXC | LSIO.GPIO1.IO20 | | | | | +#define IOMUXD__UART0_RX REG32(IOMUXD_REG_BASE+0x00041380U) // 7 2 1 14 | ADMA.UART0.RX | ADMA.MQS.R | ADMA.FLEXCAN0.RX | SCU.UART0.RX | LSIO.GPIO1.IO21 | | | | | +#define IOMUXD__UART0_TX REG32(IOMUXD_REG_BASE+0x00042000U) // 8 2 2 0 | ADMA.UART0.TX | ADMA.MQS.L | ADMA.FLEXCAN0.TX | SCU.UART0.TX | LSIO.GPIO1.IO22 | | | | | +#define IOMUXD__UART2_TX REG32(IOMUXD_REG_BASE+0x00042040U) // 8 2 2 1 | ADMA.UART2.TX | ADMA.FTM.CH1 | ADMA.FLEXCAN1.TX | | LSIO.GPIO1.IO23 | | | | | +#define IOMUXD__UART2_RX REG32(IOMUXD_REG_BASE+0x00042080U) // 8 2 2 2 | ADMA.UART2.RX | ADMA.FTM.CH0 | ADMA.FLEXCAN1.RX | | LSIO.GPIO1.IO24 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIOLH REG32(IOMUXD_REG_BASE+0x000420C0U) // 8 2 2 3 | | | | | | | | | | +#define IOMUXD__MIPI_DSI0_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00042100U) // 8 2 2 4 | MIPI_DSI0.I2C0.SCL | MIPI_DSI1.GPIO0.IO02 | | | LSIO.GPIO1.IO25 | | | | | +#define IOMUXD__MIPI_DSI0_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00042140U) // 8 2 2 5 | MIPI_DSI0.I2C0.SDA | MIPI_DSI1.GPIO0.IO03 | | | LSIO.GPIO1.IO26 | | | | | +#define IOMUXD__MIPI_DSI0_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00042180U) // 8 2 2 6 | MIPI_DSI0.GPIO0.IO00 | ADMA.I2C1.SCL | MIPI_DSI0.PWM0.OUT | | LSIO.GPIO1.IO27 | | | | | +#define IOMUXD__MIPI_DSI0_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000421C0U) // 8 2 2 7 | MIPI_DSI0.GPIO0.IO01 | ADMA.I2C1.SDA | | | LSIO.GPIO1.IO28 | | | | | +#define IOMUXD__MIPI_DSI1_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00042200U) // 8 2 2 8 | MIPI_DSI1.I2C0.SCL | MIPI_DSI0.GPIO0.IO02 | | | LSIO.GPIO1.IO29 | | | | | +#define IOMUXD__MIPI_DSI1_I2C0_SDA REG32(IOMUXD_REG_BASE+0x00042240U) // 8 2 2 9 | MIPI_DSI1.I2C0.SDA | MIPI_DSI0.GPIO0.IO03 | | | LSIO.GPIO1.IO30 | | | | | +#define IOMUXD__MIPI_DSI1_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00042280U) // 8 2 2 10 | MIPI_DSI1.GPIO0.IO00 | ADMA.I2C2.SCL | MIPI_DSI1.PWM0.OUT | | LSIO.GPIO1.IO31 | | | | | +#define IOMUXD__MIPI_DSI1_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000422C0U) // 8 2 2 11 | MIPI_DSI1.GPIO0.IO01 | ADMA.I2C2.SDA | | | LSIO.GPIO2.IO00 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_MIPIDSIGPIO REG32(IOMUXD_REG_BASE+0x00042300U) // 8 2 2 12 | | | | | | | | | | +#define IOMUXD__JTAG_TRST_B REG32(IOMUXD_REG_BASE+0x00042340U) // 8 2 2 13 | SCU.JTAG.TRST_B | SCU.WDOG0.WDOG_OUT | | | | | | | | +#define IOMUXD__PMIC_I2C_SCL REG32(IOMUXD_REG_BASE+0x00042380U) // 8 2 2 14 | SCU.PMIC_I2C.SCL | SCU.GPIO0.IOXX_PMIC_A35_ON | | | LSIO.GPIO2.IO01 | | | | | +#define IOMUXD__PMIC_I2C_SDA REG32(IOMUXD_REG_BASE+0x00043000U) // 9 2 3 0 | SCU.PMIC_I2C.SDA | SCU.GPIO0.IOXX_PMIC_GPU_ON | | | LSIO.GPIO2.IO02 | | | | | +#define IOMUXD__PMIC_INT_B REG32(IOMUXD_REG_BASE+0x00043040U) // 9 2 3 1 | SCU.DSC.PMIC_INT_B | | | | | | | | | +#define IOMUXD__SCU_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00043080U) // 9 2 3 2 | SCU.GPIO0.IO00 | SCU.UART0.RX | M40.UART0.RX | ADMA.UART3.RX | LSIO.GPIO2.IO03 | | | | | +#define IOMUXD__SCU_GPIO0_01 REG32(IOMUXD_REG_BASE+0x000430C0U) // 9 2 3 3 | SCU.GPIO0.IO01 | SCU.UART0.TX | M40.UART0.TX | ADMA.UART3.TX | SCU.WDOG0.WDOG_OUT | | | | | +#define IOMUXD__SCU_PMIC_STANDBY REG32(IOMUXD_REG_BASE+0x00043100U) // 9 2 3 4 | SCU.DSC.PMIC_STANDBY | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE0 REG32(IOMUXD_REG_BASE+0x00043140U) // 9 2 3 5 | SCU.DSC.BOOT_MODE0 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE1 REG32(IOMUXD_REG_BASE+0x00043180U) // 9 2 3 6 | SCU.DSC.BOOT_MODE1 | | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE2 REG32(IOMUXD_REG_BASE+0x000431C0U) // 9 2 3 7 | SCU.DSC.BOOT_MODE2 | SCU.PMIC_I2C.SDA | | | | | | | | +#define IOMUXD__SCU_BOOT_MODE3 REG32(IOMUXD_REG_BASE+0x00043200U) // 9 2 3 8 | SCU.DSC.BOOT_MODE3 | SCU.PMIC_I2C.SCL | | SCU.DSC.RTC_CLOCK_OUTPUT_32K | | | | | | +#define IOMUXD__CSI_D00 REG32(IOMUXD_REG_BASE+0x00043240U) // 9 2 3 9 | CI_PI.D02 | | ADMA.SAI0.RXC | | | | | | | +#define IOMUXD__CSI_D01 REG32(IOMUXD_REG_BASE+0x00043280U) // 9 2 3 10 | CI_PI.D03 | | ADMA.SAI0.RXD | | | | | | | +#define IOMUXD__CSI_D02 REG32(IOMUXD_REG_BASE+0x000432C0U) // 9 2 3 11 | CI_PI.D04 | | ADMA.SAI0.RXFS | | | | | | | +#define IOMUXD__CSI_D03 REG32(IOMUXD_REG_BASE+0x00043300U) // 9 2 3 12 | CI_PI.D05 | | ADMA.SAI2.RXC | | | | | | | +#define IOMUXD__CSI_D04 REG32(IOMUXD_REG_BASE+0x00043340U) // 9 2 3 13 | CI_PI.D06 | | ADMA.SAI2.RXD | | | | | | | +#define IOMUXD__CSI_D05 REG32(IOMUXD_REG_BASE+0x00043380U) // 9 2 3 14 | CI_PI.D07 | | ADMA.SAI2.RXFS | | | | | | | +#define IOMUXD__CSI_D06 REG32(IOMUXD_REG_BASE+0x00044000U) // 10 2 4 0 | CI_PI.D08 | | ADMA.SAI3.RXC | | | | | | | +#define IOMUXD__CSI_D07 REG32(IOMUXD_REG_BASE+0x00044040U) // 10 2 4 1 | CI_PI.D09 | | ADMA.SAI3.RXD | | | | | | | +#define IOMUXD__CSI_HSYNC REG32(IOMUXD_REG_BASE+0x00044080U) // 10 2 4 2 | CI_PI.HSYNC | CI_PI.D00 | ADMA.SAI3.RXFS | | | | | | | +#define IOMUXD__CSI_VSYNC REG32(IOMUXD_REG_BASE+0x000440C0U) // 10 2 4 3 | CI_PI.VSYNC | CI_PI.D01 | | | | | | | | +#define IOMUXD__CSI_PCLK REG32(IOMUXD_REG_BASE+0x00044100U) // 10 2 4 4 | CI_PI.PCLK | MIPI_CSI0.I2C0.SCL | | ADMA.SPI1.SCK | LSIO.GPIO3.IO00 | | | | | +#define IOMUXD__CSI_MCLK REG32(IOMUXD_REG_BASE+0x00044140U) // 10 2 4 5 | CI_PI.MCLK | MIPI_CSI0.I2C0.SDA | | ADMA.SPI1.SDO | LSIO.GPIO3.IO01 | | | | | +#define IOMUXD__CSI_EN REG32(IOMUXD_REG_BASE+0x00044180U) // 10 2 4 6 | CI_PI.EN | CI_PI.I2C.SCL | ADMA.I2C3.SCL | ADMA.SPI1.SDI | LSIO.GPIO3.IO02 | | | | | +#define IOMUXD__CSI_RESET REG32(IOMUXD_REG_BASE+0x000441C0U) // 10 2 4 7 | CI_PI.RESET | CI_PI.I2C.SDA | ADMA.I2C3.SDA | ADMA.SPI1.CS0 | LSIO.GPIO3.IO03 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_GPIORHD REG32(IOMUXD_REG_BASE+0x00044200U) // 10 2 4 8 | | | | | | | | | | +#define IOMUXD__MIPI_CSI0_MCLK_OUT REG32(IOMUXD_REG_BASE+0x00044240U) // 10 2 4 9 | MIPI_CSI0.ACM.MCLK_OUT | | | | LSIO.GPIO3.IO04 | | | | | +#define IOMUXD__MIPI_CSI0_I2C0_SCL REG32(IOMUXD_REG_BASE+0x00044280U) // 10 2 4 10 | MIPI_CSI0.I2C0.SCL | MIPI_CSI0.GPIO0.IO02 | | | LSIO.GPIO3.IO05 | | | | | +#define IOMUXD__MIPI_CSI0_I2C0_SDA REG32(IOMUXD_REG_BASE+0x000442C0U) // 10 2 4 11 | MIPI_CSI0.I2C0.SDA | MIPI_CSI0.GPIO0.IO03 | | | LSIO.GPIO3.IO06 | | | | | +#define IOMUXD__MIPI_CSI0_GPIO0_01 REG32(IOMUXD_REG_BASE+0x00044300U) // 10 2 4 12 | MIPI_CSI0.GPIO0.IO01 | ADMA.I2C0.SDA | | | LSIO.GPIO3.IO07 | | | | | +#define IOMUXD__MIPI_CSI0_GPIO0_00 REG32(IOMUXD_REG_BASE+0x00044340U) // 10 2 4 13 | MIPI_CSI0.GPIO0.IO00 | ADMA.I2C0.SCL | | | LSIO.GPIO3.IO08 | | | | | +#define IOMUXD__QSPI0A_DATA0 REG32(IOMUXD_REG_BASE+0x00060000U) // 11 3 0 0 | LSIO.QSPI0A.DATA0 | | | | LSIO.GPIO3.IO09 | | | | | +#define IOMUXD__QSPI0A_DATA1 REG32(IOMUXD_REG_BASE+0x00060040U) // 11 3 0 1 | LSIO.QSPI0A.DATA1 | | | | LSIO.GPIO3.IO10 | | | | | +#define IOMUXD__QSPI0A_DATA2 REG32(IOMUXD_REG_BASE+0x00060080U) // 11 3 0 2 | LSIO.QSPI0A.DATA2 | | | | LSIO.GPIO3.IO11 | | | | | +#define IOMUXD__QSPI0A_DATA3 REG32(IOMUXD_REG_BASE+0x000600C0U) // 11 3 0 3 | LSIO.QSPI0A.DATA3 | | | | LSIO.GPIO3.IO12 | | | | | +#define IOMUXD__QSPI0A_DQS REG32(IOMUXD_REG_BASE+0x00060100U) // 11 3 0 4 | LSIO.QSPI0A.DQS | | | | LSIO.GPIO3.IO13 | | | | | +#define IOMUXD__QSPI0A_SS0_B REG32(IOMUXD_REG_BASE+0x00060140U) // 11 3 0 5 | LSIO.QSPI0A.SS0_B | | | | LSIO.GPIO3.IO14 | | | | | +#define IOMUXD__QSPI0A_SS1_B REG32(IOMUXD_REG_BASE+0x00060180U) // 11 3 0 6 | LSIO.QSPI0A.SS1_B | | | | LSIO.GPIO3.IO15 | | | | | +#define IOMUXD__QSPI0A_SCLK REG32(IOMUXD_REG_BASE+0x000601C0U) // 11 3 0 7 | LSIO.QSPI0A.SCLK | | | | LSIO.GPIO3.IO16 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0A REG32(IOMUXD_REG_BASE+0x00060200U) // 11 3 0 8 | | | | | | | | | | +#define IOMUXD__QSPI0B_SCLK REG32(IOMUXD_REG_BASE+0x00060240U) // 11 3 0 9 | LSIO.QSPI0B.SCLK | LSIO.QSPI1A.SCLK | LSIO.KPP0.COL0 | | LSIO.GPIO3.IO17 | | | | | +#define IOMUXD__QSPI0B_DATA0 REG32(IOMUXD_REG_BASE+0x00060280U) // 11 3 0 10 | LSIO.QSPI0B.DATA0 | LSIO.QSPI1A.DATA0 | LSIO.KPP0.COL1 | | LSIO.GPIO3.IO18 | | | | | +#define IOMUXD__QSPI0B_DATA1 REG32(IOMUXD_REG_BASE+0x000602C0U) // 11 3 0 11 | LSIO.QSPI0B.DATA1 | LSIO.QSPI1A.DATA1 | LSIO.KPP0.COL2 | | LSIO.GPIO3.IO19 | | | | | +#define IOMUXD__QSPI0B_DATA2 REG32(IOMUXD_REG_BASE+0x00060300U) // 11 3 0 12 | LSIO.QSPI0B.DATA2 | LSIO.QSPI1A.DATA2 | LSIO.KPP0.COL3 | | LSIO.GPIO3.IO20 | | | | | +#define IOMUXD__QSPI0B_DATA3 REG32(IOMUXD_REG_BASE+0x00060340U) // 11 3 0 13 | LSIO.QSPI0B.DATA3 | LSIO.QSPI1A.DATA3 | LSIO.KPP0.ROW0 | | LSIO.GPIO3.IO21 | | | | | +#define IOMUXD__QSPI0B_DQS REG32(IOMUXD_REG_BASE+0x00060380U) // 11 3 0 14 | LSIO.QSPI0B.DQS | LSIO.QSPI1A.DQS | LSIO.KPP0.ROW1 | | LSIO.GPIO3.IO22 | | | | | +#define IOMUXD__QSPI0B_SS0_B REG32(IOMUXD_REG_BASE+0x00061000U) // 12 3 1 0 | LSIO.QSPI0B.SS0_B | LSIO.QSPI1A.SS0_B | LSIO.KPP0.ROW2 | | LSIO.GPIO3.IO23 | | | | | +#define IOMUXD__QSPI0B_SS1_B REG32(IOMUXD_REG_BASE+0x00061040U) // 12 3 1 1 | LSIO.QSPI0B.SS1_B | LSIO.QSPI1A.SS1_B | LSIO.KPP0.ROW3 | | LSIO.GPIO3.IO24 | | | | | +#define IOMUXD__IOMUXD_COMP_CTL_GPIO_1V8_3V3_QSPI0B REG32(IOMUXD_REG_BASE+0x00061080U) // 12 3 1 2 | | | | | | | | | | + +// GROUP REGISTERS FOR WAKEUP CONTROL +#define IOMUXD__GROUP_0_0 REG32(IOMUXD_REG_BASE+0x00000400U) // 0 0 0 0 | +#define IOMUXD__GROUP_1_0 REG32(IOMUXD_REG_BASE+0x00020400U) // 1 1 0 0 | +#define IOMUXD__GROUP_1_1 REG32(IOMUXD_REG_BASE+0x00021400U) // 2 1 1 0 | +#define IOMUXD__GROUP_1_2 REG32(IOMUXD_REG_BASE+0x00022400U) // 3 1 2 0 | +#define IOMUXD__GROUP_1_3 REG32(IOMUXD_REG_BASE+0x00023400U) // 4 1 3 0 | +#define IOMUXD__GROUP_1_4 REG32(IOMUXD_REG_BASE+0x00024400U) // 5 1 4 0 | +#define IOMUXD__GROUP_2_0 REG32(IOMUXD_REG_BASE+0x00040400U) // 6 2 0 0 | +#define IOMUXD__GROUP_2_1 REG32(IOMUXD_REG_BASE+0x00041400U) // 7 2 1 0 | +#define IOMUXD__GROUP_2_2 REG32(IOMUXD_REG_BASE+0x00042400U) // 8 2 2 0 | +#define IOMUXD__GROUP_2_3 REG32(IOMUXD_REG_BASE+0x00043400U) // 9 2 3 0 | +#define IOMUXD__GROUP_2_4 REG32(IOMUXD_REG_BASE+0x00044400U) // 10 2 4 0 | +#define IOMUXD__GROUP_3_0 REG32(IOMUXD_REG_BASE+0x00060400U) // 11 3 0 0 | +#define IOMUXD__GROUP_3_1 REG32(IOMUXD_REG_BASE+0x00061400U) // 12 3 1 0 | + +#endif diff --git a/platform/config/mx8qx/lpcg.h b/platform/config/mx8qx/lpcg.h new file mode 100755 index 0000000..d0e0a18 --- /dev/null +++ b/platform/config/mx8qx/lpcg.h @@ -0,0 +1,148 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef LPCG_H +#define LPCG_H + +// NOTE: Content below comes from cprog file of the SCU design database + +// LPCG______REG +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__REG 0x0000 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__BIT 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__CM0P_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__REG 0x0004 // IPS_SLOT=CLK_SECO +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__BIT 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__HWEN 0 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__SWEN 1 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__RSVD 2 +#define LPCG__SS_SCU__CM0P__DEBUG_CLK__STOP 3 + +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__REG 0x0000 // IPS_SLOT=CLK_MMCAU_HCLK +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__STOP 3 + +#define LPCG__SS_SCU__CM4__TCMC_HCLK__REG 0x0000 // IPS_SLOT=CLK_TCMC_HCLK +#define LPCG__SS_SCU__CM4__TCMC_HCLK__BIT 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__HWEN 0 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__SWEN 1 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__RSVD 2 +#define LPCG__SS_SCU__CM4__TCMC_HCLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__STOP 3 + +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__REG 0x0000 // IPS_SLOT=CLK_LPI2C +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__BIT 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__HWEN 0 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__SWEN 1 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__RSVD 2 +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPIT1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__REG 0x0000 // IPS_SLOT=CLK_LPIT +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__BIT 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__HWEN 0 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__SWEN 1 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__RSVD 2 +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__LPUART1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__STOP 3 + +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__REG 0x0000 // IPS_SLOT=CLK_LPUART +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__BIT 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__HWEN 0 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__SWEN 1 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__RSVD 2 +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__STOP 3 + +#define LPCG__SS_SCU__TPM1__IPG_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__IPG_CLK__BIT 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__HWEN 4 +#define LPCG__SS_SCU__TPM1__IPG_CLK__SWEN 5 +#define LPCG__SS_SCU__TPM1__IPG_CLK__RSVD 6 +#define LPCG__SS_SCU__TPM1__IPG_CLK__STOP 7 + +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__REG 0x0000 // IPS_SLOT=CLK_TPM +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__BIT 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__HWEN 0 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__SWEN 1 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__RSVD 2 +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__STOP 3 + +#endif + diff --git a/platform/config/mx8qx/soc.bom b/platform/config/mx8qx/soc.bom new file mode 100755 index 0000000..15909a8 --- /dev/null +++ b/platform/config/mx8qx/soc.bom @@ -0,0 +1,57 @@ + +SOC = MX8QX + +DRV += \ + analog \ + csr \ + dsc \ + otp \ + pad \ + seco/v2 \ + snvs/v2 \ + sysctr \ + xrdc2 \ + mtr + +DRV2 += \ + rgpio \ + igpio \ + lmem \ + lpi2c \ + lpit \ + lpcg \ + lpuart \ + mu \ + stc \ + systick \ + drc \ + wdog32 + +SS += \ + a35/v1 \ + adma/v2 \ + base/v1 \ + conn/v1 \ + csi/v1 \ + db/v2 \ + dc/v1 \ + drc/v2 \ + gpu/v2 \ + hsio/v2 \ + img/v1 \ + lsio/v2 \ + m4/v1 \ + mipi/v2 \ + pi/v1 \ + sc/v2 \ + vpu/v4 + +SVC += \ + irq \ + misc \ + pad \ + pm \ + rm \ + seco \ + timer + diff --git a/platform/config/mx8qx/soc.h b/platform/config/mx8qx/soc.h new file mode 100755 index 0000000..5ae660e --- /dev/null +++ b/platform/config/mx8qx/soc.h @@ -0,0 +1,691 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file used to configure SoC specific features of the SCFW. + * Includes info on memory map, DSC mapping, subsystem mapping, etc. + * + */ +/*==========================================================================*/ + +#ifndef SC_SOC_H +#define SC_SOC_H + +/* Includes */ +#include "main/types.h" +#include "has_ss.h" +#include "fsl_device_registers.h" +#include "ss/drc/v2/dsc.h" + +/* Configure DSCs */ + +/*! Macro to calculate DSC index */ +#define DSC_IDX(X) ((sc_dsc_t) ((((uint32_t) (X)) - ((uint32_t) MSI0_BASE)) / 131072U)) + +/*! Macro to define AI_READ/WRITE */ +#define ANA_READ(BASE_IDX, TOG, ADDRESS, RDATA) DSC_AIRegisterRead(BASE_IDX, TOG, ADDRESS, RDATA) +#define ANA_WRITE(BASE_IDX, TOG, ADDRESS, DATAWORD) DSC_AIRegisterWrite(BASE_IDX, TOG, ADDRESS, DATAWORD) +#define ANA_ENABLE_ANAMIX_AI(BASE_IDX) DSC_EnableAnamixAI(BASE_IDX) +#define ANA_ENABLE_PHYMIX_AI(BASE_IDX) DSC_EnablePhymixAI(BASE_IDX) + +/*! Define for Refgen default trim in case of unfused part */ +#define REFGEN_DEFAULT_TRIM 0x2BU + +/*! + * @name Defines for sc_dsc_t + */ +/** @{ */ +#define SC_DSC_SC DSC_IDX(DSC_SC) /* 0x01 */ +#define SC_DSC_ADMA DSC_IDX(DSC_ADMA) /* 0x13 */ +#define SC_DSC_GPU_0 DSC_IDX(DSC_GPU_0) /* 0x16 */ +#define SC_DSC_DB DSC_IDX(DSC_DB) /* 0x19 */ +#define SC_DSC_AP_2 DSC_IDX(DSC_AP_2) /* 0x1A */ +#define SC_DSC_MCU_0 DSC_IDX(DSC_MCU_0) /* 0x1B */ +#define SC_DSC_DRC_0 DSC_IDX(DSC_DRC_0) /* 0x24 */ +#define SC_DSC_DC_0 DSC_IDX(DSC_DC_0) /* 0x25 */ +#define SC_DSC_HSIO DSC_IDX(DSC_HSIO) /* 0x26 */ +#define SC_DSC_CONN DSC_IDX(DSC_CONN) /* 0x27 */ +#define SC_DSC_VPU DSC_IDX(DSC_VPU) /* 0x28 */ +#define SC_DSC_IMG DSC_IDX(DSC_IMG) /* 0x32 */ +#define SC_DSC_LSIO DSC_IDX(DSC_LSIO) /* 0x33 */ +#define SC_DSC_DI_MIPI_1 DSC_IDX(DSC_MIPI_1) /* 0x38 */ +#define SC_DSC_DI_MIPI_0 DSC_IDX(DSC_MIPI_0) /* 0x39 */ +#define SC_DSC_CSI_0 DSC_IDX(DSC_CSI_0) /* 0x3A */ +#define SC_DSC_DI_PI_0 DSC_IDX(DSC_PI_0) /* 0x3B */ +#define SC_DSC_LAST 0x3FU +#define SC_DSC_DRC_1 0x3FU +#define SC_DSC_NA SC_DSC_LAST +#define SC_DSC_W 6U +/** @} */ + +/*! + * DSC Type. This type is a used to indicate a Distributed Slave + * Controller (DSC). + */ +typedef uint8_t sc_dsc_t; + +/*! + * @name Defines for sc_ai_t + */ +/** @{ */ +#define SC_AI_HP_PLL 0U +#define SC_AI_DIG_PLL 1U +#define SC_AI_AV_PLL 2U +#define SC_AI_LVDS_TRANS 3U +#define SC_AI_BANDGAP_REF 4U +#define SC_AI_VA_REFGEN 5U +#define SC_AI_NEG_CHARGE_PUMP 6U +#define SC_AI_WELL_LEVEL_SOURCE 7U +#define SC_AI_DIFFCLK_ROOT 8U +#define SC_AI_DIFFCLK_RPTR 9U +#define SC_AI_DIFFCLK_TERM 10U +#define SC_AI_PHY_LDO 11U +#define SC_AI_OSC24M 12U +#define SC_AI_RC200OSC 13U +#define SC_AI_TEMP_SENSE 14U +#define SC_AI_VDROP_PROCMON 15U +#define SC_AI_LAST 16U +/** @} */ + +/*! + * Analog Interface Modules Types. + */ +typedef uint8_t sc_ai_t; + +/* Configure Subsystems */ + +typedef uint8_t sc_ss_inst_t; + +#define SC_SS_INST_W 1U + +/*! + * @name Defines for sc_sub_t + */ +/** @{ */ +#define SC_SUBSYS_SC 0U +#define SC_SUBSYS_MCU_0 1U +#define SC_SUBSYS_A35 2U +#define SC_SUBSYS_GPU_0 3U +#define SC_SUBSYS_VPU 4U +#define SC_SUBSYS_DC_0 5U +#define SC_SUBSYS_IMG 6U +#define SC_SUBSYS_ADMA 7U +#define SC_SUBSYS_CONN 8U +#define SC_SUBSYS_DB 9U +#define SC_SUBSYS_DRC_0 10U +#define SC_SUBSYS_LSIO 11U +#define SC_SUBSYS_HSIO 12U +#define SC_SUBSYS_MIPI_0 13U +#define SC_SUBSYS_MIPI_1 14U +#define SC_SUBSYS_CSI_0 15U +#define SC_SUBSYS_PI_0 16U +#define SC_SUBSYS_LAST SC_SUBSYS_PI_0 +#define SC_SUBSYS_W 5U +#define SC_SUBSYS_NA 31U +/** @} */ + +/*! + * Subsystem Type. This type is used to indicate a subsystem. + */ +typedef uint8_t sc_sub_t; + +#define SC_PGP_00 0U +#define SC_PGP_01 1U +#define SC_PGP_02 2U +#define SC_PGP_03 3U +#define SC_PGP_10 4U +#define SC_PGP_11 5U +#define SC_PGP_12 6U +#define SC_PGP_13 7U +#define SC_PGP_20 8U +#define SC_PGP_21 9U +#define SC_PGP_22 10U +#define SC_PGP_23 11U + +#define SC_PGP_W 4U +#define SC_PGP_NA 12U + +#define MTR_PWR_PLAN_SEL_SCU0 0U +#define MTR_PWR_PLAN_SEL_DB 1U +#define MTR_PWR_PLAN_SEL_HSIO 2U +#define MTR_PWR_PLAN_SEL_MCU_0 3U +#define MTR_PWR_PLAN_SEL_LSIO 4U +#define MTR_PWR_PLAN_SEL_GPU3D_0 5U +#define MTR_PWR_PLAN_SEL_CA35 6U +#define MTR_PWR_PLAN_SEL_CONNECTIVITY 7U +#define MTR_PWR_PLAN_SEL_VPU 8U +#define MTR_PWR_PLAN_SEL_DRC_0 9U +#define MTR_PWR_PLAN_SEL_DC_0 10U +#define MTR_PWR_PLAN_SEL_MIPI_CSI_0 11U +#define MTR_PWR_PLAN_SEL_IMAGING 12U +#define MTR_PWR_PLAN_SEL_ADMA 13U +#define MTR_PWR_PLAN_SEL_DI_MIPI_DSI_LVDS_0 14U +#define MTR_PWR_PLAN_SEL_DI_MIPI_DSI_LVDS_1 15U + +#define SC_SS_INFO_INIT \ + {HAS_SS_SC, 0, SC_PGP_00, SC_SUBSYS_NA, 0, 0, SC_DSC_SC}, /* SC_SUBSYS_SC */ \ + {HAS_SS_MCU_0, 0, SC_PGP_01, SC_SUBSYS_NA, 0, 0, SC_DSC_MCU_0}, /* SC_SUBSYS_MCU_0 */ \ + {HAS_SS_AP_2, 0, SC_PGP_22, SC_SUBSYS_NA, 0, 0, SC_DSC_AP_2}, /* SC_SUBSYS_A35 */ \ + {HAS_SS_GPU_0, 0, SC_PGP_02, SC_SUBSYS_NA, 0, 0, SC_DSC_GPU_0}, /* SC_SUBSYS_GPU_0 */ \ + {HAS_SS_VPU, 0, SC_PGP_10, SC_SUBSYS_NA, 0, 0, SC_DSC_VPU}, /* SC_SUBSYS_VPU */ \ + {HAS_SS_DC_0, 0, SC_PGP_13, SC_SUBSYS_IMG, 24, 0, SC_DSC_DC_0}, /* SC_SUBSYS_DC_0 */ \ + {HAS_SS_IMG_0, 0, SC_PGP_20, SC_SUBSYS_NA, 0, 0, SC_DSC_IMG}, /* SC_SUBSYS_IMG */ \ + {HAS_SS_ADMA, 0, SC_PGP_03, SC_SUBSYS_IMG, 25, 0, SC_DSC_ADMA}, /* SC_SUBSYS_ADMA */ \ + {HAS_SS_CONN, 0, SC_PGP_11, SC_SUBSYS_NA, 0, 0, SC_DSC_CONN}, /* SC_SUBSYS_CONN */ \ + {HAS_SS_DB, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DB}, /* SC_SUBSYS_DB */ \ + {HAS_SS_DRC_0, 0, SC_PGP_NA, SC_SUBSYS_NA, 0, 0, SC_DSC_DRC_0}, /* SC_SUBSYS_DRC_0 */ \ + {HAS_SS_LSIO, 0, SC_PGP_21, SC_SUBSYS_NA, 0, 0, SC_DSC_LSIO}, /* SC_SUBSYS_LSIO */ \ + {HAS_SS_HSIO_0, 0, SC_PGP_12, SC_SUBSYS_NA, 0, 0, SC_DSC_HSIO}, /* SC_SUBSYS_HSIO */ \ + {HAS_SS_MIPI_0, 0, SC_PGP_NA, SC_SUBSYS_DC_0, 11, 0, SC_DSC_DI_MIPI_0}, /* SC_SUBSYS_MIPI_0 */ \ + {HAS_SS_MIPI_1, 1, SC_PGP_NA, SC_SUBSYS_DC_0, 12, 0, SC_DSC_DI_MIPI_1}, /* SC_SUBSYS_MIPI_1 */ \ + {HAS_SS_CSI_0, 0, SC_PGP_NA, SC_SUBSYS_IMG, 21, 18, SC_DSC_CSI_0}, /* SC_SUBSYS_CSI_0 */ \ + {HAS_SS_PI_0, 0, SC_PGP_NA, SC_SUBSYS_IMG, 23, 20, SC_DSC_DI_PI_0} /* SC_SUBSYS_PI_0 */ + +/*! Number of DB */ +#define SC_NUM_DB 1U + +/*! + * DB Connect Type. Stores a subsystem connection mask. + */ +typedef uint32_t sc_db_connect_t; + +/*! DB connect mask */ +#define SC_DB_CONNECT \ + ( BIT(SC_SUBSYS_SC) \ + | BIT(SC_SUBSYS_MCU_0) \ + | BIT(SC_SUBSYS_A35) \ + | BIT(SC_SUBSYS_GPU_0) \ + | BIT(SC_SUBSYS_VPU) \ + | BIT(SC_SUBSYS_DC_0) \ + | BIT(SC_SUBSYS_IMG) \ + | BIT(SC_SUBSYS_ADMA) \ + | BIT(SC_SUBSYS_CONN) \ + | BIT(SC_SUBSYS_DRC_0) \ + | BIT(SC_SUBSYS_LSIO) \ + | BIT(SC_SUBSYS_HSIO)) + +/*! Init order of DB (SCU outward) */ +#define SC_DB_INIT \ + {SC_R_DB, SC_SUBSYS_DB, SC_DB_CONNECT} + +#define SC_SS_EP_INIT \ + SS_EP_INIT_SC, /* SC_SUBSYS_SC */ \ + SS_EP_INIT_M4, /* SC_SUBSYS_MCU_0 */ \ + SS_EP_INIT_A35, /* SC_SUBSYS_A35 */ \ + SS_EP_INIT_GPU, /* SC_SUBSYS_GPU_0 */ \ + SS_EP_INIT_VPU, /* SC_SUBSYS_VPU */ \ + SS_EP_INIT_DC, /* SC_SUBSYS_DC_0 */ \ + SS_EP_INIT_IMG, /* SC_SUBSYS_IMG */ \ + SS_EP_INIT_ADMA, /* SC_SUBSYS_ADMA */ \ + SS_EP_INIT_CONN, /* SC_SUBSYS_CONN */ \ + SS_EP_INIT_DB, /* SC_SUBSYS_DB */ \ + SS_EP_INIT_DRC, /* SC_SUBSYS_DRC_0 */ \ + SS_EP_INIT_LSIO, /* SC_SUBSYS_LSIO */ \ + SS_EP_INIT_HSIO, /* SC_SUBSYS_HSIO */ \ + SS_EP_INIT_MIPI, /* SC_SUBSYS_MIPI_0 */ \ + SS_EP_INIT_MIPI, /* SC_SUBSYS_MIPI_1 */ \ + SS_EP_INIT_CSI, /* SC_SUBSYS_CSI_0 */ \ + SS_EP_INIT_PI /* SC_SUBSYS_PI_0 */ + +#define SC_SS_BASE_INFO_INIT \ + &ss_base_info_sc, /* SC_SUBSYS_SC */ \ + &ss_base_info_m4, /* SC_SUBSYS_MCU_0 */ \ + &ss_base_info_a35, /* SC_SUBSYS_A35 */ \ + &ss_base_info_gpu, /* SC_SUBSYS_GPU_0 */ \ + &ss_base_info_vpu, /* SC_SUBSYS_VPU */ \ + &ss_base_info_dc, /* SC_SUBSYS_DC_0 */ \ + &ss_base_info_img, /* SC_SUBSYS_IMG */ \ + &ss_base_info_adma, /* SC_SUBSYS_ADMA */ \ + &ss_base_info_conn, /* SC_SUBSYS_CONN */ \ + &ss_base_info_db, /* SC_SUBSYS_DB */ \ + &ss_base_info_drc, /* SC_SUBSYS_DRC_0 */ \ + &ss_base_info_lsio, /* SC_SUBSYS_LSIO */ \ + &ss_base_info_hsio, /* SC_SUBSYS_HSIO */ \ + &ss_base_info_mipi, /* SC_SUBSYS_MIPI_0 */ \ + &ss_base_info_mipi, /* SC_SUBSYS_MIPI_1 */ \ + &ss_base_info_csi, /* SC_SUBSYS_CSI_0 */ \ + &ss_base_info_pi, /* SC_SUBSYS_PI_0 */ + +#ifdef DEBUG + #define SNAME_INIT \ + "SC", \ + "M4_0", \ + "A35", \ + "GPU_0", \ + "VPU", \ + "DC_0", \ + "IMG", \ + "ADMA", \ + "CONN", \ + "DB", \ + "DRC_0", \ + "LSIO", \ + "HSIO", \ + "MIPI_0", \ + "MIPI_1", \ + "CSI_0", \ + "PI_0" + + #define RNAME_INIT \ + RNAME_INIT_SC_0 \ + RNAME_INIT_M4_0 \ + RNAME_INIT_A35_0 \ + RNAME_INIT_GPU_0 \ + RNAME_INIT_VPU_0 \ + RNAME_INIT_DC_0 \ + RNAME_INIT_IMG_0 \ + RNAME_INIT_ADMA_0 \ + RNAME_INIT_CONN_0 \ + RNAME_INIT_DB_0 \ + RNAME_INIT_DRC_0 \ + RNAME_INIT_LSIO_0 \ + RNAME_INIT_HSIO_0 \ + RNAME_INIT_MIPI_0 \ + RNAME_INIT_MIPI_1 \ + RNAME_INIT_CSI_0 \ + RNAME_INIT_PI_0 \ + RNAME_INIT_BRD + +#endif + +#define SC_R_DDR SC_R_DRC_0 +#define SC_R_DDR_PLL SC_R_DRC_0_PLL + +/*! Chip versions */ +#define CHIP_VER_B0 0x1U +#define CHIP_VER_C0 0x2U + +/*! Macro to get JTAG ID */ +#ifndef SIMU + #define JTAG_ID (DSC_SC->GPR_STAT[2].RW & 0x1FFU) +#else + #ifdef SREV_B0 + #define JTAG_ID ((CHIP_VER_B0 << 5U) | CHIP_ID_QX) + #endif + #ifdef SREV_C0 + #define JTAG_ID ((CHIP_VER_C0 << 5U) | CHIP_ID_QX) + #endif +#endif + +/*! Macros to get chip ID and version */ +#define CHIP_ID ((JTAG_ID >> 0U) & 0x1FU) +#define CHIP_VER ((JTAG_ID >> 5U) & 0xFU) + +/* Define IMG DSSCMIX rate */ +#define SC_IMGMIX SC_300MHZ + +/* Configure Top Level Memory Map */ + +#define SC_MEMMAP_INIT \ + { LSIO_SS_BASE1, 0x1C000000U, 1, 1, 30, 1, 0x00, SC_SUBSYS_LSIO}, \ + { SCU_SS_BASE0, 0x4000000U, 0, 1, 26, 0, 0x00, SC_SUBSYS_SC}, \ + { MCU_0_SS_BASE0, 0x4000000U, 1, 1, 26, 0, 0x00, SC_SUBSYS_MCU_0}, \ + {HSIO_0_SS_BASE2, 0x10000000U, 1, 1, 28, 2, 0x00, SC_SUBSYS_HSIO}, \ + { DDR_BASE0, 0x80000000U, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { LSIO_SS_BASE2, 0x40000000U, 1, 1, 30, 2, 0x00, SC_SUBSYS_LSIO}, \ + { DDR_BASE1, 0x780000000ULL, 1, 0, 0, 0, 0x00, SC_SUBSYS_DB}, \ + { SC_NA, SC_NA, 0, 0, 0, 0, 0, 0} + +#define SC_BOOT_ADDR_INIT \ + {OCRAM_ALIAS_BASE, 0x17FFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { OCRAM_BASE, 0x3FFFFU, SC_R_OCRAM, SC_SUBSYS_LSIO}, \ + { FSPI0_MEM_BASE, 0x10000000U, SC_R_FSPI_0, SC_SUBSYS_LSIO}, \ + { TCML_MCU_0, 0x4000000U, SC_R_MCU_0_PID0, SC_SUBSYS_MCU_0}, \ + { DDR_BASE0, 0x80000000U, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { FSPI1_MEM_BASE, 0x40000000U, SC_R_FSPI_1, SC_SUBSYS_LSIO}, \ + { DDR_BASE1, 0x780000000ULL, SC_R_DRC_0, SC_SUBSYS_DRC_0}, \ + { SC_NA, SC_NA, 0U, 0U} + +/* Configure Features */ + +/* Configure RM */ +#define SC_RM_NUM_PARTITION 20U //!< Number of resource partitions +#define SC_RM_NUM_MEMREG 64U //!< Number of memory regions +#define SC_RM_NUM_DOMAIN 16U //!< Number of resource domains + +/*! PLL frequencies */ +#define MIN_PLL_RATE 648000000U +#define MAX_PLL_RATE 1344000000U +#define MIN_HP_PLL_RATE 1250000000U +#define MAX_HP_PLL_RATE 2500000000U +#define MIN_HP_PLL_1P5_RATE 833333333U +#define PLL_RATE_DEN 960000U +#define DIV_FACTOR_NUM 2U +#define DIV_FACTOR_DEN 3U + +/*! + * Define operating points for A35. + */ +#define NUM_A35_OPP 2 + +/* Define voltage setpoints for GPU */ +#define NUM_GPU_OPP 2 + +/* No GPU clock table */ +#define NO_GPU_CLKS + +/*! Define to indicate that AV PLL should be used for DC */ +#define USE_AVPLL_FOR_DC + +/*! Define for DB clock gating issue. */ +#define TKT309042_WORKAROUND + +/*! Has 28FDSOI in SCFW API */ +#define API_HAS_28FDSOI + +#ifdef SIMU +/*! Support partitioning naming for debug */ +#define HAS_PARTITION_NAMES +#endif + +#if defined(LTO) || defined (SIMU) +/*! Enhanced monitor support */ +#define MONITOR_HAS_CMD_OFF +#define MONITOR_HAS_CMD_MSG +#define MONITOR_HAS_CMD_VDETECT +#define MONITOR_HAS_CMD_WDOG +#define MONITOR_HAS_CMD_PANIC +#define MONITOR_HAS_CMD_MRC +#define MONITOR_HAS_CMD_BOOT +#define MONITOR_HAS_CMD_WAKE +#define MONITOR_HAS_CMD_GRANT +#endif + +/*! Define to use SECO FW */ +#define HAS_SECO_FW + +/*! Define for FW version */ +#define SECO_FW_VERSION ((3UL << 16) | (7UL << 4) | 4UL) + +/*! Define to use MIPI DSI trim */ +#define HAS_DSI_VOH_TRIM + +/*! Define DDR DATX8 Lanes */ +#define DWC_NO_OF_BYTES 5U + +/*! Defines for AI temp sensor */ +#define FUSE_TEMP_AUTO 0x0 +#define FUSE_TEMP_INDUSL 0x1 +#define FUSE_TEMP_CONS 0x2 +#define FUSE_TEMP_EX_CONS 0x3 +#define AI_TEMP_RATE 1000U +#define AI_TEMP_NP 1915 +#define AI_TEMP_NT 25 +#define AI_TEMP_PANIC 127 +#define AI_TEMP_PANIC_AUTO 127 +#define AI_TEMP_PANIC_INDUS 107 +#define AI_TEMP_PANIC_CONS 97 +#define AI_TEMP_PANIC_EX_CONS 107 + +/*! Define to indicate timer services required */ +#define HAS_TIMER_SERVICES + +/*! Number of boot images supported by ROM */ +#define SC_BOOT_MAX_LIST 8U + +/* Define boot cpu and address based on whether or + not we're running the DDR stress test */ +#ifdef M4_BOOT + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_SRC 0x00040000U + #define BOOT_DST 0x34FE0000U + #define BOOT_SIZE 0x20000U + #define BOOT_FLAGS 0x00000000U +#elif defined(TEST_BOOTTIME) + #define BOOT_CPU SC_R_MCU_0_PID0 + #define BOOT_ADDR 0x000000000ULL + #define BOOT_MU SC_R_MCU_0_MU_1A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00400000U +#else + #define BOOT_CPU SC_R_AP_2_0 + #define BOOT_ADDR 0x080000000UL + #define BOOT_MU SC_R_MU_0A + #define BOOT_CPU_STARTS 1U + #define BOOT_FLAGS 0x00000000U +#endif + +/* Boot data address */ +#define SC_BOOT_DATA_ADDR_PTR 0x000005F0U +#define SC_BOOT_DATA_ADDR 0x2001FC00U +#define SC_BOOT_DATA2_ADDR 0x2001FD00U + +/*! Rom boot device mappings */ +/** @{ */ +#define ROM_SDHC_0 SC_R_SDHC_0 +#define ROM_SDHC_1 SC_R_SDHC_1 +#define ROM_SDHC_2 SC_R_SDHC_2 +#define ROM_FSPI_0 SC_R_FSPI_0 +#define ROM_FSPI_1 SC_R_FSPI_1 +#define ROM_USB_0 SC_R_USB_0 +#define ROM_USB_1 SC_R_USB_0 +#define ROM_USB_2 SC_R_USB_2 +/** @} */ + +/* Configure Tests */ +#define TEST_HSIO0_PCIE SC_R_PCIE_B +#define TEST_HSIO0_SERDES SC_R_SERDES_1 +#define TEST_HSIO0_MATCH_0 SC_R_MATCH_0 +#define SC_P_TEST_PAD SC_P_UART1_RX +#define SC_P_TEST_PAD_COMP SC_P_COMP_CTL_GPIO_3V3_USB3IO +#define TEST_LSIO HAS_SS_LSIO +#define TEST_DMA HAS_SS_ADMA +#define TEST_BOARD_ALT2 SC_FALSE + +/* Max MRC regions */ +#define SC_MAX_NUM_MEMREG \ +( \ + 16U /* DB */ \ + + 32U /* HSIO */ \ + + 48U /* LSIO */ \ + + 4U /* MCU */ \ + + 4U /* SC */ \ +) + +/*! Define to indicate number of CAAM job rings */ +#define SC_CAAM_JR 4U + +/*! Define to indicate number of MU */ +#define SC_SECO_MU 4U + +/*! Enable FAKE_TBU use by MCU */ +#define SC_FAKE_TBU + +/* Configure Resources */ +#define SC_NO_DTCP + +/* Define CPU topology */ +#define SOC_NUM_CLUSTER 1U +#define SOC_IDX_AP_2 0U +#define SOC_NUM_AP_2 4U +#define SOC_NUM_DIG_AUD_PLL 2U + +/* Define MCU topology */ +#define SOC_NUM_MCU 1U +#define SOC_IDX_MCU_0 0U + +/* Define HMP topology */ +#define SOC_NUM_HMP_NODES 3U +#define SOC_HMP_IDX_SCU 0U /* SCU must be index 0 */ +#define SOC_HMP_IDX_MCU_0 1U /* MCU order must follow topology above */ +#define SOC_HMP_IDX_AP_2 2U +#define SOC_HMP_IDX_MCU SOC_HMP_IDX_MCU_0 +#define SOC_HMP_IDX_AP SOC_HMP_IDX_AP_2 + +/* Define system-level interface topology */ +#define SOC_NUM_SYS_IF 4U /* Number of system-level interfaces */ +#define SOC_SYS_IF_MU_RSRC 5U /* Number of AP -> SCU message unit resources */ +#define SOC_SYS_IF_ICN_RSRC 1U /* Number of interconnect resources */ +#define SOC_SYS_IF_OCMEM_RSRC 3U /* Number of on-chip memory resources */ +#define SOC_SYS_IF_DDR_RSRC 1U /* Number of DDR resources */ +#define SOC_SYS_IF_CPU_HPM SC_PM_PW_MODE_LP /* CPU power mode threshold for HPM */ + +/* Define wakeup bindings */ +#define SOC_GIC_DSC SC_DSC_ADMA /* DSC for GIC wakeups */ +#define SOC_IRQSTEER_DSC SC_DSC_ADMA /* DSC for IRQSTEER wakeup */ +#define SOC_GIC_WAKEUP00 REGBIT64(1, 0) /* DSC IRQ for GIC wakeups */ +#define SOC_IRQSTEER_AP_WAKEUP REGBIT64(1, 11) /* DSC IRQ for AP IRQSTEER wakeup */ +#define SOC_IRQSTEER_MCU_WAKEUP REGBIT64(1, 9) /* DSC IRQ for MCU IRQSTEER wakeup */ +#define SOC_WAKEUP_PW_MODE SC_PM_PW_MODE_STBY /* CPU power mode limit for GIC wakeup */ +#define SOC_RESUME_PW_MODE SC_PM_PW_MODE_ON /* CPU power mode for resume */ +#define SOC_MCU_STOPM_PDN 3U /* STOPM >= 3 will power down MCU core */ +#define SOC_MCU_STOPM_MEMSR 3U /* STOPM == 3 will retain memories */ +#define SOC_SNVS_PWR_ON_WAKEUP REGBIT64(1, 10) /* DSC IRQ for SNVS_LP set_pwr_on_irq */ + +/* Define ADMA mbist */ +#define SS_ADMA_BIST1 (((uint32_t)DSC_ADMA) + 0x8020U) +#define SS_ADMA_BIST1_START 230U +#define SS_ADMA_BIST1_END 233U + +#define SS_ADMA_BIST3 (((uint32_t)DSC_ADMA) + 0x8040U) +#define SS_ADMA_BIST3_START 234U +#define SS_ADMA_BIST3_END 266U + +/* Defines for DDR training */ +#define DQS_TIMER_DURATION_512 1U /* 512 * tCK = 2048 * (1/1200) = 1 us (round up) */ +#define DQS_TIMER_DURATION_1008 1U /* 1008 * tCK = 1008 * (1/1200) = 1 us (round up) */ +#define DQS_TIMER_DURATION_2048 2U /* 2048 * tCK = 2048 * (1/1200) = 2 us (round up) */ +#define DQS_TIMER_DURATION_8192 7U /* 8192 * tCK = 8192 * (1/1200) = 7 us (round up) */ + +/* Include SS configs */ + +#include "all_config.h" +#include "board/config.h" +#include "handlers_MX8QX.h" /* Device specific handlers */ + +/* Configure Resources */ + +#define SC_NUM_RSRC \ + (SS_NUM_RSRC_SC \ + + SS_NUM_RSRC_M4 \ + + SS_NUM_RSRC_A35 \ + + SS_NUM_RSRC_GPU \ + + SS_NUM_RSRC_VPU \ + + SS_NUM_RSRC_DC \ + + SS_NUM_RSRC_IMG \ + + SS_NUM_RSRC_ADMA \ + + SS_NUM_RSRC_CONN \ + + SS_NUM_RSRC_DB \ + + SS_NUM_RSRC_DRC \ + + SS_NUM_RSRC_LSIO \ + + SS_NUM_RSRC_HSIO \ + + SS_NUM_RSRC_MIPI \ + + SS_NUM_RSRC_MIPI \ + + SS_NUM_RSRC_CSI \ + + SS_NUM_RSRC_PI \ + + BRD_NUM_RSRC_BRD) + +#define SC_PAD_INIT_INIT \ + {SC_P_USB_SS3_TC0, 4, 0}, \ + {SC_P_USB_SS3_TC1, 4, 0}, \ + {SC_P_USB_SS3_TC2, 4, 0}, \ + {SC_P_USB_SS3_TC3, 4, 0}, \ + {SC_P_USDHC1_RESET_B, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_VSELECT, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_WP, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_CD_B, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_CLK, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_CMD, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_DATA0, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_DATA1, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_DATA2, 4, SC_R_SDHC_1}, \ + {SC_P_USDHC1_DATA3, 4, SC_R_SDHC_1}, \ + {SC_P_MCLK_IN0, 4, 0}, \ + {SC_P_MCLK_OUT0, 4, 0}, \ + {SC_P_SAI0_TXD, 4, 0}, \ + {SC_P_SAI0_TXC, 4, 0}, \ + {SC_P_SAI0_RXD, 4, 0}, \ + {SC_P_SAI0_TXFS, 4, 0}, \ + {SC_P_SAI1_RXD, 4, 0}, \ + {SC_P_SAI1_RXC, 4, 0}, \ + {SC_P_SAI1_RXFS, 4, 0}, \ + {SC_P_SPI2_CS0, 4, 0}, \ + {SC_P_SPI2_SDO, 4, 0}, \ + {SC_P_SPI2_SDI, 4, 0}, \ + {SC_P_SPI2_SCK, 4, 0}, \ + {SC_P_FLEXCAN0_RX, 4, SC_R_CAN_0}, \ + {SC_P_FLEXCAN0_TX, 4, SC_R_CAN_0}, \ + {SC_P_FLEXCAN1_RX, 4, SC_R_CAN_1}, \ + {SC_P_FLEXCAN1_TX, 4, SC_R_CAN_1}, \ + {SC_P_PMIC_I2C_SCL, 4, 0}, \ + {SC_P_PMIC_I2C_SDA, 4, 0}, \ + {SC_P_MIPI_CSI0_I2C0_SCL, 4, 0}, \ + {SC_P_MIPI_CSI0_I2C0_SDA, 4, 0}, \ + {0, 0, 0} + +#define SC_ROM_SS_INIT \ + 0, /* SC_SUBSYS_SC */ \ + 1, /* SC_SUBSYS_MCU_0 */ \ + 2, /* SC_SUBSYS_A35 */ \ + 3, /* SC_SUBSYS_GPU_0 */ \ + 4, /* SC_SUBSYS_VPU */ \ + 5, /* SC_SUBSYS_DC_0 */ \ + 6, /* SC_SUBSYS_IMG */ \ + 7, /* SC_SUBSYS_ADMA */ \ + 8, /* SC_SUBSYS_CONN */ \ + 9, /* SC_SUBSYS_DB */ \ + 10, /* SC_SUBSYS_DRC_0 */ \ + 11, /* SC_SUBSYS_LSIO */ \ + 12, /* SC_SUBSYS_HSIO */ \ + 13, /* SC_SUBSYS_MIPI_0 */ \ + 14, /* SC_SUBSYS_MIPI_1 */ \ + 15, /* SC_SUBSYS_CSI_0 */ \ + 16 /* SC_SUBSYS_PI_0 */ + +typedef uint8_t soc_flags_t; + +#define SOC_DYN_PLL_VER +/*! + * @name Defines for soc_flags_t + */ +#define SOC_DC_AXI_DERATE_FLAG (1U << 0U) +#define SOC_DQS2DQ_SYNC_FLAG (1U << 1U) +#define SOC_TEMP_SENSE_FULL_PD (1U << 2U) +#define SOC_RELOCK_ROM_LOCKED_PLL (1U << 3U) +#define SOC_VPU_ENC_MTR (1U << 4U) + +/* External variables */ + +extern uint8_t soc_dpll_ver; +extern soc_flags_t soc_flags; + +#endif /* SC_SOC_H */ + diff --git a/platform/devices/MX8/MX8_adm.h b/platform/devices/MX8/MX8_adm.h new file mode 100755 index 0000000..ee6610b --- /dev/null +++ b/platform/devices/MX8/MX8_adm.h @@ -0,0 +1,672 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8_adm.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for ADM + * + * CMSIS Peripheral Access Layer for ADM + */ + +#ifndef ADM_H +#define ADM_H /**< Symbol preventing repeated inclusion */ + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- ADM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADM_Peripheral_Access_Layer ADM Peripheral Access Layer + * @{ + */ + +/** ADM - Register Layout Typedef */ +typedef struct { + __IO uint32_t SCU_GPR0[4]; /**< GPR register for SCU Bank 0, array offset: 0x0, array step: 0x4 */ + struct { /* offset: 0x10 */ + __IO uint32_t RW; /**< Control register for SCU Bank 0., offset: 0x10 */ + __IO uint32_t SET; /**< Control register for SCU Bank 0., offset: 0x14 */ + __IO uint32_t CLR; /**< Control register for SCU Bank 0., offset: 0x18 */ + __IO uint32_t TOG; /**< Control register for SCU Bank 0., offset: 0x1C */ + } GPR0_CTRL; + __IO uint32_t SCU_GPR1[4]; /**< GPR register for SCU Bank 1, array offset: 0x20, array step: 0x4 */ + struct { /* offset: 0x30 */ + __IO uint32_t RW; /**< Control register for bank 1., offset: 0x30 */ + __IO uint32_t SET; /**< Control register for bank 1., offset: 0x34 */ + __IO uint32_t CLR; /**< Control register for bank 1., offset: 0x38 */ + __IO uint32_t TOG; /**< Control register for bank 1., offset: 0x3C */ + } GPR1_CTRL; + __IO uint32_t SCU_GPR2[4]; /**< GPR register for SCU Bank 2, array offset: 0x40, array step: 0x4 */ + struct { /* offset: 0x50 */ + __IO uint32_t RW; /**< Control register for Bank 2., offset: 0x50 */ + __IO uint32_t SET; /**< Control register for Bank 2., offset: 0x54 */ + __IO uint32_t CLR; /**< Control register for Bank 2., offset: 0x58 */ + __IO uint32_t TOG; /**< Control register for Bank 2., offset: 0x5C */ + } GPR2_CTRL; + __IO uint32_t SCU_GPR3[4]; /**< GPR register for SCU Bank 3, array offset: 0x60, array step: 0x4 */ + struct { /* offset: 0x70 */ + __IO uint32_t RW; /**< Control register for bank 3., offset: 0x70 */ + __IO uint32_t SET; /**< Control register for bank 3., offset: 0x74 */ + __IO uint32_t CLR; /**< Control register for bank 3., offset: 0x78 */ + __IO uint32_t TOG; /**< Control register for bank 3., offset: 0x7C */ + } GPR3_CTRL; + __IO uint32_t SCU_GPR4[4]; /**< GPR register for SCU Bank 4, array offset: 0x80, array step: 0x4 */ + struct { /* offset: 0x90 */ + __IO uint32_t RW; /**< Control register for bank 4., offset: 0x90 */ + __IO uint32_t SET; /**< Control register for bank 4., offset: 0x94 */ + __IO uint32_t CLR; /**< Control register for bank 4., offset: 0x98 */ + __IO uint32_t TOG; /**< Control register for bank 4., offset: 0x9C */ + } GPR4_CTRL; + __IO uint32_t SCU_GPR5[4]; /**< GPR register for SCU Bank 5, array offset: 0xA0, array step: 0x4 */ + struct { /* offset: 0xB0 */ + __IO uint32_t RW; /**< Control register for bank 5., offset: 0xB0 */ + __IO uint32_t SET; /**< Control register for bank 5., offset: 0xB4 */ + __IO uint32_t CLR; /**< Control register for bank 5., offset: 0xB8 */ + __IO uint32_t TOG; /**< Control register for bank 5., offset: 0xBC */ + } GPR5_CTRL; + struct { /* offset: 0xC0 */ + __IO uint32_t RW; /**< Control register for SCU., offset: 0xC0 */ + __IO uint32_t SET; /**< Control register for SCU., offset: 0xC4 */ + __IO uint32_t CLR; /**< Control register for SCU., offset: 0xC8 */ + __IO uint32_t TOG; /**< Control register for SCU., offset: 0xCC */ + } CTRL0; + struct { /* offset: 0xD0 */ + __IO uint32_t RW; /**< Control register for SCU., offset: 0xD0 */ + __IO uint32_t SET; /**< Control register for SCU., offset: 0xD4 */ + __IO uint32_t CLR; /**< Control register for SCU., offset: 0xD8 */ + __IO uint32_t TOG; /**< Control register for SCU., offset: 0xDC */ + } CTRL1; + __IO uint32_t STATUS0; /**< Status register for SCU., offset: 0xE0 */ + uint8_t RESERVED_0[12]; + __I uint32_t STATUS1; /**< Status register for SCU., offset: 0xF0 */ + uint8_t RESERVED_1[12]; + __I uint32_t GPR0[4]; /**< , array offset: 0x100, array step: 0x4 */ + __I uint32_t GPR1[4]; /**< , array offset: 0x110, array step: 0x4 */ + __I uint32_t GPR2[4]; /**< , array offset: 0x120, array step: 0x4 */ + __I uint32_t GPR3[4]; /**< , array offset: 0x130, array step: 0x4 */ + __I uint32_t GPR4[4]; /**< , array offset: 0x140, array step: 0x4 */ + __I uint32_t GPR5[4]; /**< , array offset: 0x150, array step: 0x4 */ + __I uint32_t SECO_SUPER_ROOT_KEY_HASH[8]; /**< , array offset: 0x160, array step: 0x4 */ + __I uint32_t HDMI_SUPER_ROOT_KEY_HASH[8]; /**< , array offset: 0x180, array step: 0x4 */ + __IO uint32_t CAAM_PWRCTRL_REF; /**< CAAM PWRCTRL reg for reference, offset: 0x1A0 */ + uint8_t RESERVED_2[12]; + __I uint32_t SPARE[4]; /**< , array offset: 0x1B0, array step: 0x4 */ +} ADM_Type; + +/* ---------------------------------------------------------------------------- + -- ADM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADM_Register_Masks ADM Register Masks + * @{ + */ + +/*! @name SCU_GPR0 - GPR register for SCU Bank 0 */ +#define ADM_SCU_GPR0_BANK0_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR0_BANK0_SHIFT (0U) +#define ADM_SCU_GPR0_BANK0(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR0_BANK0_SHIFT)) & ADM_SCU_GPR0_BANK0_MASK) + +/* The count of ADM_SCU_GPR0 */ +#define ADM_SCU_GPR0_COUNT (4U) + +/*! @name GPR0_CTRL - Control register for SCU Bank 0. */ +#define ADM_GPR0_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR0_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR0_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR0_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR0_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR0_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR0_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR0_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR0_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR0_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR0_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR0_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR0_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR0_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR0_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_SHARED_WR_SHIFT)) & ADM_GPR0_CTRL_SHARED_WR_MASK) +#define ADM_GPR0_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR0_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR0_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_SHARED_RD_SHIFT)) & ADM_GPR0_CTRL_SHARED_RD_MASK) +#define ADM_GPR0_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR0_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR0_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_CTRL_LOCK_SHIFT)) & ADM_GPR0_CTRL_LOCK_MASK) + +/*! @name SCU_GPR1 - GPR register for SCU Bank 1 */ +#define ADM_SCU_GPR1_BANK1_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR1_BANK1_SHIFT (0U) +#define ADM_SCU_GPR1_BANK1(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR1_BANK1_SHIFT)) & ADM_SCU_GPR1_BANK1_MASK) + +/* The count of ADM_SCU_GPR1 */ +#define ADM_SCU_GPR1_COUNT (4U) + +/*! @name GPR1_CTRL - Control register for bank 1. */ +#define ADM_GPR1_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR1_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR1_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR1_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR1_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR1_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR1_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR1_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR1_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR1_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR1_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR1_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR1_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR1_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR1_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_SHARED_WR_SHIFT)) & ADM_GPR1_CTRL_SHARED_WR_MASK) +#define ADM_GPR1_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR1_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR1_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_SHARED_RD_SHIFT)) & ADM_GPR1_CTRL_SHARED_RD_MASK) +#define ADM_GPR1_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR1_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR1_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_CTRL_LOCK_SHIFT)) & ADM_GPR1_CTRL_LOCK_MASK) + +/*! @name SCU_GPR2 - GPR register for SCU Bank 2 */ +#define ADM_SCU_GPR2_BANK2_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR2_BANK2_SHIFT (0U) +#define ADM_SCU_GPR2_BANK2(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR2_BANK2_SHIFT)) & ADM_SCU_GPR2_BANK2_MASK) + +/* The count of ADM_SCU_GPR2 */ +#define ADM_SCU_GPR2_COUNT (4U) + +/*! @name GPR2_CTRL - Control register for Bank 2. */ +#define ADM_GPR2_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR2_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR2_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR2_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR2_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR2_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR2_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR2_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR2_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR2_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR2_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR2_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR2_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR2_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR2_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_SHARED_WR_SHIFT)) & ADM_GPR2_CTRL_SHARED_WR_MASK) +#define ADM_GPR2_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR2_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR2_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_SHARED_RD_SHIFT)) & ADM_GPR2_CTRL_SHARED_RD_MASK) +#define ADM_GPR2_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR2_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR2_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_CTRL_LOCK_SHIFT)) & ADM_GPR2_CTRL_LOCK_MASK) + +/*! @name SCU_GPR3 - GPR register for SCU Bank 3 */ +#define ADM_SCU_GPR3_BANK3_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR3_BANK3_SHIFT (0U) +#define ADM_SCU_GPR3_BANK3(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR3_BANK3_SHIFT)) & ADM_SCU_GPR3_BANK3_MASK) + +/* The count of ADM_SCU_GPR3 */ +#define ADM_SCU_GPR3_COUNT (4U) + +/*! @name GPR3_CTRL - Control register for bank 3. */ +#define ADM_GPR3_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR3_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR3_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR3_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR3_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR3_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR3_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR3_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR3_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR3_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR3_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR3_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR3_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR3_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR3_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_SHARED_WR_SHIFT)) & ADM_GPR3_CTRL_SHARED_WR_MASK) +#define ADM_GPR3_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR3_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR3_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_SHARED_RD_SHIFT)) & ADM_GPR3_CTRL_SHARED_RD_MASK) +#define ADM_GPR3_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR3_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR3_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_CTRL_LOCK_SHIFT)) & ADM_GPR3_CTRL_LOCK_MASK) + +/*! @name SCU_GPR4 - GPR register for SCU Bank 4 */ +#define ADM_SCU_GPR4_BANK4_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR4_BANK4_SHIFT (0U) +#define ADM_SCU_GPR4_BANK4(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR4_BANK4_SHIFT)) & ADM_SCU_GPR4_BANK4_MASK) + +/* The count of ADM_SCU_GPR4 */ +#define ADM_SCU_GPR4_COUNT (4U) + +/*! @name GPR4_CTRL - Control register for bank 4. */ +#define ADM_GPR4_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR4_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR4_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR4_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR4_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR4_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR4_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR4_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR4_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR4_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR4_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR4_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR4_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR4_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR4_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_SHARED_WR_SHIFT)) & ADM_GPR4_CTRL_SHARED_WR_MASK) +#define ADM_GPR4_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR4_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR4_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_SHARED_RD_SHIFT)) & ADM_GPR4_CTRL_SHARED_RD_MASK) +#define ADM_GPR4_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR4_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR4_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_CTRL_LOCK_SHIFT)) & ADM_GPR4_CTRL_LOCK_MASK) + +/*! @name SCU_GPR5 - GPR register for SCU Bank 5 */ +#define ADM_SCU_GPR5_BANK5_MASK (0xFFFFFFFFU) +#define ADM_SCU_GPR5_BANK5_SHIFT (0U) +#define ADM_SCU_GPR5_BANK5(x) (((uint32_t)(((uint32_t)(x)) << ADM_SCU_GPR5_BANK5_SHIFT)) & ADM_SCU_GPR5_BANK5_MASK) + +/* The count of ADM_SCU_GPR5 */ +#define ADM_SCU_GPR5_COUNT (4U) + +/*! @name GPR5_CTRL - Control register for bank 5. */ +#define ADM_GPR5_CTRL_CLR_ON_FAIL_MASK (0x1U) +#define ADM_GPR5_CTRL_CLR_ON_FAIL_SHIFT (0U) +#define ADM_GPR5_CTRL_CLR_ON_FAIL(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_CLR_ON_FAIL_SHIFT)) & ADM_GPR5_CTRL_CLR_ON_FAIL_MASK) +#define ADM_GPR5_CTRL_PRIVATE_WR_MASK (0x2U) +#define ADM_GPR5_CTRL_PRIVATE_WR_SHIFT (1U) +#define ADM_GPR5_CTRL_PRIVATE_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_PRIVATE_WR_SHIFT)) & ADM_GPR5_CTRL_PRIVATE_WR_MASK) +#define ADM_GPR5_CTRL_PRIVATE_RD_MASK (0x4U) +#define ADM_GPR5_CTRL_PRIVATE_RD_SHIFT (2U) +#define ADM_GPR5_CTRL_PRIVATE_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_PRIVATE_RD_SHIFT)) & ADM_GPR5_CTRL_PRIVATE_RD_MASK) +#define ADM_GPR5_CTRL_SHARED_WR_MASK (0x8U) +#define ADM_GPR5_CTRL_SHARED_WR_SHIFT (3U) +#define ADM_GPR5_CTRL_SHARED_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_SHARED_WR_SHIFT)) & ADM_GPR5_CTRL_SHARED_WR_MASK) +#define ADM_GPR5_CTRL_SHARED_RD_MASK (0x10U) +#define ADM_GPR5_CTRL_SHARED_RD_SHIFT (4U) +#define ADM_GPR5_CTRL_SHARED_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_SHARED_RD_SHIFT)) & ADM_GPR5_CTRL_SHARED_RD_MASK) +#define ADM_GPR5_CTRL_LOCK_MASK (0x20U) +#define ADM_GPR5_CTRL_LOCK_SHIFT (5U) +#define ADM_GPR5_CTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_CTRL_LOCK_SHIFT)) & ADM_GPR5_CTRL_LOCK_MASK) + +/*! @name CTRL0 - Control register for SCU. */ +#define ADM_CTRL0_ALLOW_SCU_NIDEN_MASK (0x1U) +#define ADM_CTRL0_ALLOW_SCU_NIDEN_SHIFT (0U) +#define ADM_CTRL0_ALLOW_SCU_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_SCU_NIDEN_SHIFT)) & ADM_CTRL0_ALLOW_SCU_NIDEN_MASK) +#define ADM_CTRL0_ALLOW_SCU_DBGEN_MASK (0x2U) +#define ADM_CTRL0_ALLOW_SCU_DBGEN_SHIFT (1U) +#define ADM_CTRL0_ALLOW_SCU_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_SCU_DBGEN_SHIFT)) & ADM_CTRL0_ALLOW_SCU_DBGEN_MASK) +#define ADM_CTRL0_ALLOW_SCU_SPNIDEN_MASK (0x4U) +#define ADM_CTRL0_ALLOW_SCU_SPNIDEN_SHIFT (2U) +#define ADM_CTRL0_ALLOW_SCU_SPNIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_SCU_SPNIDEN_SHIFT)) & ADM_CTRL0_ALLOW_SCU_SPNIDEN_MASK) +#define ADM_CTRL0_ALLOW_SCU_SPIDEN_MASK (0x8U) +#define ADM_CTRL0_ALLOW_SCU_SPIDEN_SHIFT (3U) +#define ADM_CTRL0_ALLOW_SCU_SPIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_SCU_SPIDEN_SHIFT)) & ADM_CTRL0_ALLOW_SCU_SPIDEN_MASK) +#define ADM_CTRL0_SCU_ROM_EXIT_MASK (0x10U) +#define ADM_CTRL0_SCU_ROM_EXIT_SHIFT (4U) +#define ADM_CTRL0_SCU_ROM_EXIT(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_SCU_ROM_EXIT_SHIFT)) & ADM_CTRL0_SCU_ROM_EXIT_MASK) +#define ADM_CTRL0_ALLOW_APPS_NIDEN_MASK (0x1E0U) +#define ADM_CTRL0_ALLOW_APPS_NIDEN_SHIFT (5U) +#define ADM_CTRL0_ALLOW_APPS_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_APPS_NIDEN_SHIFT)) & ADM_CTRL0_ALLOW_APPS_NIDEN_MASK) +#define ADM_CTRL0_ALLOW_APPS_DBGEN_MASK (0x1E00U) +#define ADM_CTRL0_ALLOW_APPS_DBGEN_SHIFT (9U) +#define ADM_CTRL0_ALLOW_APPS_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_APPS_DBGEN_SHIFT)) & ADM_CTRL0_ALLOW_APPS_DBGEN_MASK) +#define ADM_CTRL0_ALLOW_APPS_SPNIDEN_MASK (0x1E000U) +#define ADM_CTRL0_ALLOW_APPS_SPNIDEN_SHIFT (13U) +#define ADM_CTRL0_ALLOW_APPS_SPNIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_APPS_SPNIDEN_SHIFT)) & ADM_CTRL0_ALLOW_APPS_SPNIDEN_MASK) +#define ADM_CTRL0_ALLOW_APPS_SPIDEN_MASK (0x1E0000U) +#define ADM_CTRL0_ALLOW_APPS_SPIDEN_SHIFT (17U) +#define ADM_CTRL0_ALLOW_APPS_SPIDEN(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_ALLOW_APPS_SPIDEN_SHIFT)) & ADM_CTRL0_ALLOW_APPS_SPIDEN_MASK) +#define ADM_CTRL0_DISABLE_CAAM_MASK (0x200000U) +#define ADM_CTRL0_DISABLE_CAAM_SHIFT (21U) +#define ADM_CTRL0_DISABLE_CAAM(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_DISABLE_CAAM_SHIFT)) & ADM_CTRL0_DISABLE_CAAM_MASK) +#define ADM_CTRL0_DISABLE_IEE_MASK (0x400000U) +#define ADM_CTRL0_DISABLE_IEE_SHIFT (22U) +#define ADM_CTRL0_DISABLE_IEE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_DISABLE_IEE_SHIFT)) & ADM_CTRL0_DISABLE_IEE_MASK) +#define ADM_CTRL0_DISABLE_HDCP_MASK (0x800000U) +#define ADM_CTRL0_DISABLE_HDCP_SHIFT (23U) +#define ADM_CTRL0_DISABLE_HDCP(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_DISABLE_HDCP_SHIFT)) & ADM_CTRL0_DISABLE_HDCP_MASK) +#define ADM_CTRL0_DISABLE_DTCP_MASK (0x1000000U) +#define ADM_CTRL0_DISABLE_DTCP_SHIFT (24U) +#define ADM_CTRL0_DISABLE_DTCP(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_DISABLE_DTCP_SHIFT)) & ADM_CTRL0_DISABLE_DTCP_MASK) +#define ADM_CTRL0_DISABLE_CAU_MASK (0x2000000U) +#define ADM_CTRL0_DISABLE_CAU_SHIFT (25U) +#define ADM_CTRL0_DISABLE_CAU(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_DISABLE_CAU_SHIFT)) & ADM_CTRL0_DISABLE_CAU_MASK) +#define ADM_CTRL0_EN_GLITCH_DET_MASK (0x4000000U) +#define ADM_CTRL0_EN_GLITCH_DET_SHIFT (26U) +#define ADM_CTRL0_EN_GLITCH_DET(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_EN_GLITCH_DET_SHIFT)) & ADM_CTRL0_EN_GLITCH_DET_MASK) +#define ADM_CTRL0_TCU_SW_RESET_MASK (0x8000000U) +#define ADM_CTRL0_TCU_SW_RESET_SHIFT (27U) +#define ADM_CTRL0_TCU_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_TCU_SW_RESET_SHIFT)) & ADM_CTRL0_TCU_SW_RESET_MASK) +#define ADM_CTRL0_HDMI_RX_APB_MUX_MASK (0x10000000U) +#define ADM_CTRL0_HDMI_RX_APB_MUX_SHIFT (28U) +#define ADM_CTRL0_HDMI_RX_APB_MUX(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_HDMI_RX_APB_MUX_SHIFT)) & ADM_CTRL0_HDMI_RX_APB_MUX_MASK) +#define ADM_CTRL0_HDMI_TX_APB_MUX_MASK (0x20000000U) +#define ADM_CTRL0_HDMI_TX_APB_MUX_SHIFT (29U) +#define ADM_CTRL0_HDMI_TX_APB_MUX(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_HDMI_TX_APB_MUX_SHIFT)) & ADM_CTRL0_HDMI_TX_APB_MUX_MASK) +#define ADM_CTRL0_HDMI_RX_SECURED_MODE_MASK (0x40000000U) +#define ADM_CTRL0_HDMI_RX_SECURED_MODE_SHIFT (30U) +#define ADM_CTRL0_HDMI_RX_SECURED_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_HDMI_RX_SECURED_MODE_SHIFT)) & ADM_CTRL0_HDMI_RX_SECURED_MODE_MASK) +#define ADM_CTRL0_HDMI_TX_SECURED_MODE_MASK (0x80000000U) +#define ADM_CTRL0_HDMI_TX_SECURED_MODE_SHIFT (31U) +#define ADM_CTRL0_HDMI_TX_SECURED_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL0_HDMI_TX_SECURED_MODE_SHIFT)) & ADM_CTRL0_HDMI_TX_SECURED_MODE_MASK) + +/*! @name CTRL1 - Control register for SCU. */ +#define ADM_CTRL1_CAAM_DID_MASK (0x1FU) +#define ADM_CTRL1_CAAM_DID_SHIFT (0U) +#define ADM_CTRL1_CAAM_DID(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_CAAM_DID_SHIFT)) & ADM_CTRL1_CAAM_DID_MASK) +#define ADM_CTRL1_LOCK_CDID_MASK (0x20U) +#define ADM_CTRL1_LOCK_CDID_SHIFT (5U) +#define ADM_CTRL1_LOCK_CDID(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_LOCK_CDID_SHIFT)) & ADM_CTRL1_LOCK_CDID_MASK) +#define ADM_CTRL1_JTAGC_DISABLE_MASK (0x80U) +#define ADM_CTRL1_JTAGC_DISABLE_SHIFT (7U) +#define ADM_CTRL1_JTAGC_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_JTAGC_DISABLE_SHIFT)) & ADM_CTRL1_JTAGC_DISABLE_MASK) +#define ADM_CTRL1_LOCK_JTAGC_DISABLE_MASK (0x100U) +#define ADM_CTRL1_LOCK_JTAGC_DISABLE_SHIFT (8U) +#define ADM_CTRL1_LOCK_JTAGC_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_LOCK_JTAGC_DISABLE_SHIFT)) & ADM_CTRL1_LOCK_JTAGC_DISABLE_MASK) +#define ADM_CTRL1_PAR_FR_ALLOWED_MASK (0x200U) +#define ADM_CTRL1_PAR_FR_ALLOWED_SHIFT (9U) +#define ADM_CTRL1_PAR_FR_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_PAR_FR_ALLOWED_SHIFT)) & ADM_CTRL1_PAR_FR_ALLOWED_MASK) +#define ADM_CTRL1_FR_ALLOWED_MASK (0x400U) +#define ADM_CTRL1_FR_ALLOWED_SHIFT (10U) +#define ADM_CTRL1_FR_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_FR_ALLOWED_SHIFT)) & ADM_CTRL1_FR_ALLOWED_MASK) +#define ADM_CTRL1_NO_RETURN_ALLOWED_MASK (0x800U) +#define ADM_CTRL1_NO_RETURN_ALLOWED_SHIFT (11U) +#define ADM_CTRL1_NO_RETURN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_NO_RETURN_ALLOWED_SHIFT)) & ADM_CTRL1_NO_RETURN_ALLOWED_MASK) +#define ADM_CTRL1_CNR_ALLOWED_MASK (0x1000U) +#define ADM_CTRL1_CNR_ALLOWED_SHIFT (12U) +#define ADM_CTRL1_CNR_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_CNR_ALLOWED_SHIFT)) & ADM_CTRL1_CNR_ALLOWED_MASK) +#define ADM_CTRL1_LOCKUP_SV_MASK (0x2000U) +#define ADM_CTRL1_LOCKUP_SV_SHIFT (13U) +#define ADM_CTRL1_LOCKUP_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_LOCKUP_SV_SHIFT)) & ADM_CTRL1_LOCKUP_SV_MASK) +#define ADM_CTRL1_UERR_SV_MASK (0x4000U) +#define ADM_CTRL1_UERR_SV_SHIFT (14U) +#define ADM_CTRL1_UERR_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_UERR_SV_SHIFT)) & ADM_CTRL1_UERR_SV_MASK) +#define ADM_CTRL1_TAMPER_SV_MASK (0x8000U) +#define ADM_CTRL1_TAMPER_SV_SHIFT (15U) +#define ADM_CTRL1_TAMPER_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_TAMPER_SV_SHIFT)) & ADM_CTRL1_TAMPER_SV_MASK) +#define ADM_CTRL1_GLITCH_SV_MASK (0x10000U) +#define ADM_CTRL1_GLITCH_SV_SHIFT (16U) +#define ADM_CTRL1_GLITCH_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_GLITCH_SV_SHIFT)) & ADM_CTRL1_GLITCH_SV_MASK) +#define ADM_CTRL1_WDOG_SV_MASK (0x20000U) +#define ADM_CTRL1_WDOG_SV_SHIFT (17U) +#define ADM_CTRL1_WDOG_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_WDOG_SV_SHIFT)) & ADM_CTRL1_WDOG_SV_MASK) +#define ADM_CTRL1_CAAM_SV_MASK (0x40000U) +#define ADM_CTRL1_CAAM_SV_SHIFT (18U) +#define ADM_CTRL1_CAAM_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_CAAM_SV_SHIFT)) & ADM_CTRL1_CAAM_SV_MASK) +#define ADM_CTRL1_OBSERVE_VALUE_MASK (0x380000U) +#define ADM_CTRL1_OBSERVE_VALUE_SHIFT (19U) +#define ADM_CTRL1_OBSERVE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CTRL1_OBSERVE_VALUE_SHIFT)) & ADM_CTRL1_OBSERVE_VALUE_MASK) + +/*! @name STATUS0 - Status register for SCU. */ +#define ADM_STATUS0_SCU_NIDEN_ALLOWED_MASK (0x1U) +#define ADM_STATUS0_SCU_NIDEN_ALLOWED_SHIFT (0U) +#define ADM_STATUS0_SCU_NIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SCU_NIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_SCU_NIDEN_ALLOWED_MASK) +#define ADM_STATUS0_SCU_DBGEN_ALLOWED_MASK (0x2U) +#define ADM_STATUS0_SCU_DBGEN_ALLOWED_SHIFT (1U) +#define ADM_STATUS0_SCU_DBGEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SCU_DBGEN_ALLOWED_SHIFT)) & ADM_STATUS0_SCU_DBGEN_ALLOWED_MASK) +#define ADM_STATUS0_SCU_SPNIDEN_ALLOWED_MASK (0x4U) +#define ADM_STATUS0_SCU_SPNIDEN_ALLOWED_SHIFT (2U) +#define ADM_STATUS0_SCU_SPNIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SCU_SPNIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_SCU_SPNIDEN_ALLOWED_MASK) +#define ADM_STATUS0_SCU_SPIDEN_ALLOWED_MASK (0x8U) +#define ADM_STATUS0_SCU_SPIDEN_ALLOWED_SHIFT (3U) +#define ADM_STATUS0_SCU_SPIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SCU_SPIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_SCU_SPIDEN_ALLOWED_MASK) +#define ADM_STATUS0_SECO_DBGEN_ALLOWED_MASK (0x10U) +#define ADM_STATUS0_SECO_DBGEN_ALLOWED_SHIFT (4U) +#define ADM_STATUS0_SECO_DBGEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SECO_DBGEN_ALLOWED_SHIFT)) & ADM_STATUS0_SECO_DBGEN_ALLOWED_MASK) +#define ADM_STATUS0_APPS_NIDEN_ALLOWED_MASK (0x1E0U) +#define ADM_STATUS0_APPS_NIDEN_ALLOWED_SHIFT (5U) +#define ADM_STATUS0_APPS_NIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APPS_NIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_APPS_NIDEN_ALLOWED_MASK) +#define ADM_STATUS0_APPS_DBGEN_ALLOWED_MASK (0x1E00U) +#define ADM_STATUS0_APPS_DBGEN_ALLOWED_SHIFT (9U) +#define ADM_STATUS0_APPS_DBGEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APPS_DBGEN_ALLOWED_SHIFT)) & ADM_STATUS0_APPS_DBGEN_ALLOWED_MASK) +#define ADM_STATUS0_APPS_SPNIDEN_ALLOWED_MASK (0x1E000U) +#define ADM_STATUS0_APPS_SPNIDEN_ALLOWED_SHIFT (13U) +#define ADM_STATUS0_APPS_SPNIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APPS_SPNIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_APPS_SPNIDEN_ALLOWED_MASK) +#define ADM_STATUS0_APPS_SPIDEN_ALLOWED_MASK (0x1E0000U) +#define ADM_STATUS0_APPS_SPIDEN_ALLOWED_SHIFT (17U) +#define ADM_STATUS0_APPS_SPIDEN_ALLOWED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APPS_SPIDEN_ALLOWED_SHIFT)) & ADM_STATUS0_APPS_SPIDEN_ALLOWED_MASK) +#define ADM_STATUS0_EARLY_FUSES_VALID_MASK (0x200000U) +#define ADM_STATUS0_EARLY_FUSES_VALID_SHIFT (21U) +#define ADM_STATUS0_EARLY_FUSES_VALID(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_EARLY_FUSES_VALID_SHIFT)) & ADM_STATUS0_EARLY_FUSES_VALID_MASK) +#define ADM_STATUS0_SCU_FUSES_VALID_MASK (0x400000U) +#define ADM_STATUS0_SCU_FUSES_VALID_SHIFT (22U) +#define ADM_STATUS0_SCU_FUSES_VALID(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SCU_FUSES_VALID_SHIFT)) & ADM_STATUS0_SCU_FUSES_VALID_MASK) +#define ADM_STATUS0_ALL_FUSES_VALID_MASK (0x800000U) +#define ADM_STATUS0_ALL_FUSES_VALID_SHIFT (23U) +#define ADM_STATUS0_ALL_FUSES_VALID(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_ALL_FUSES_VALID_SHIFT)) & ADM_STATUS0_ALL_FUSES_VALID_MASK) +#define ADM_STATUS0_HAB_ONLY_CRYPTO_MASK (0x1000000U) +#define ADM_STATUS0_HAB_ONLY_CRYPTO_SHIFT (24U) +#define ADM_STATUS0_HAB_ONLY_CRYPTO(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_HAB_ONLY_CRYPTO_SHIFT)) & ADM_STATUS0_HAB_ONLY_CRYPTO_MASK) +#define ADM_STATUS0_APB_GPR_ILLEGAL_RD_MASK (0x2000000U) +#define ADM_STATUS0_APB_GPR_ILLEGAL_RD_SHIFT (25U) +#define ADM_STATUS0_APB_GPR_ILLEGAL_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APB_GPR_ILLEGAL_RD_SHIFT)) & ADM_STATUS0_APB_GPR_ILLEGAL_RD_MASK) +#define ADM_STATUS0_APB_GPR_ILLEGAL_WR_MASK (0x4000000U) +#define ADM_STATUS0_APB_GPR_ILLEGAL_WR_SHIFT (26U) +#define ADM_STATUS0_APB_GPR_ILLEGAL_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APB_GPR_ILLEGAL_WR_SHIFT)) & ADM_STATUS0_APB_GPR_ILLEGAL_WR_MASK) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_RD_MASK (0x8000000U) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_RD_SHIFT (27U) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_RD(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APB_SCU_GPR_ILLEGAL_RD_SHIFT)) & ADM_STATUS0_APB_SCU_GPR_ILLEGAL_RD_MASK) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_WR_MASK (0x10000000U) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_WR_SHIFT (28U) +#define ADM_STATUS0_APB_SCU_GPR_ILLEGAL_WR(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_APB_SCU_GPR_ILLEGAL_WR_SHIFT)) & ADM_STATUS0_APB_SCU_GPR_ILLEGAL_WR_MASK) +#define ADM_STATUS0_SDP_DISABLE_MASK (0x20000000U) +#define ADM_STATUS0_SDP_DISABLE_SHIFT (29U) +#define ADM_STATUS0_SDP_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SDP_DISABLE_SHIFT)) & ADM_STATUS0_SDP_DISABLE_MASK) +#define ADM_STATUS0_SDP_WO_MASK (0x40000000U) +#define ADM_STATUS0_SDP_WO_SHIFT (30U) +#define ADM_STATUS0_SDP_WO(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SDP_WO_SHIFT)) & ADM_STATUS0_SDP_WO_MASK) +#define ADM_STATUS0_SECO_FW_MASK (0x80000000U) +#define ADM_STATUS0_SECO_FW_SHIFT (31U) +#define ADM_STATUS0_SECO_FW(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS0_SECO_FW_SHIFT)) & ADM_STATUS0_SECO_FW_MASK) + +/*! @name STATUS1 - Status register for SCU. */ +#define ADM_STATUS1_CL_SV_MASK (0x1U) +#define ADM_STATUS1_CL_SV_SHIFT (0U) +#define ADM_STATUS1_CL_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_CL_SV_SHIFT)) & ADM_STATUS1_CL_SV_MASK) +#define ADM_STATUS1_UERR_SV_MASK (0x2U) +#define ADM_STATUS1_UERR_SV_SHIFT (1U) +#define ADM_STATUS1_UERR_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_UERR_SV_SHIFT)) & ADM_STATUS1_UERR_SV_MASK) +#define ADM_STATUS1_TAMPER_SV_MASK (0x4U) +#define ADM_STATUS1_TAMPER_SV_SHIFT (2U) +#define ADM_STATUS1_TAMPER_SV(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_TAMPER_SV_SHIFT)) & ADM_STATUS1_TAMPER_SV_MASK) +#define ADM_STATUS1_LIFE_CYCLE_MASK (0x3FF8U) +#define ADM_STATUS1_LIFE_CYCLE_SHIFT (3U) +#define ADM_STATUS1_LIFE_CYCLE(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_LIFE_CYCLE_SHIFT)) & ADM_STATUS1_LIFE_CYCLE_MASK) +#define ADM_STATUS1_HDCP_ENCRYPTED_MASK (0x4000U) +#define ADM_STATUS1_HDCP_ENCRYPTED_SHIFT (14U) +#define ADM_STATUS1_HDCP_ENCRYPTED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_HDCP_ENCRYPTED_SHIFT)) & ADM_STATUS1_HDCP_ENCRYPTED_MASK) +#define ADM_STATUS1_NXP_SECRETS_PRESENT_MASK (0x8000U) +#define ADM_STATUS1_NXP_SECRETS_PRESENT_SHIFT (15U) +#define ADM_STATUS1_NXP_SECRETS_PRESENT(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_NXP_SECRETS_PRESENT_SHIFT)) & ADM_STATUS1_NXP_SECRETS_PRESENT_MASK) +#define ADM_STATUS1_SECO_HOLD_MASK (0x10000U) +#define ADM_STATUS1_SECO_HOLD_SHIFT (16U) +#define ADM_STATUS1_SECO_HOLD(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_SECO_HOLD_SHIFT)) & ADM_STATUS1_SECO_HOLD_MASK) +#define ADM_STATUS1_SCU_HOLD_MASK (0x20000U) +#define ADM_STATUS1_SCU_HOLD_SHIFT (17U) +#define ADM_STATUS1_SCU_HOLD(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_SCU_HOLD_SHIFT)) & ADM_STATUS1_SCU_HOLD_MASK) +#define ADM_STATUS1_SNVS_HOLD_MASK (0x40000U) +#define ADM_STATUS1_SNVS_HOLD_SHIFT (18U) +#define ADM_STATUS1_SNVS_HOLD(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_SNVS_HOLD_SHIFT)) & ADM_STATUS1_SNVS_HOLD_MASK) +#define ADM_STATUS1_FIELD_IS_PROGRAMMED_MASK (0x80000U) +#define ADM_STATUS1_FIELD_IS_PROGRAMMED_SHIFT (19U) +#define ADM_STATUS1_FIELD_IS_PROGRAMMED(x) (((uint32_t)(((uint32_t)(x)) << ADM_STATUS1_FIELD_IS_PROGRAMMED_SHIFT)) & ADM_STATUS1_FIELD_IS_PROGRAMMED_MASK) + +/*! @name GPR0 - */ +#define ADM_GPR0_BANK0_MASK (0xFFFFFFFFU) +#define ADM_GPR0_BANK0_SHIFT (0U) +#define ADM_GPR0_BANK0(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR0_BANK0_SHIFT)) & ADM_GPR0_BANK0_MASK) + +/* The count of ADM_GPR0 */ +#define ADM_GPR0_COUNT (4U) + +/*! @name GPR1 - */ +#define ADM_GPR1_BANK1_MASK (0xFFFFFFFFU) +#define ADM_GPR1_BANK1_SHIFT (0U) +#define ADM_GPR1_BANK1(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR1_BANK1_SHIFT)) & ADM_GPR1_BANK1_MASK) + +/* The count of ADM_GPR1 */ +#define ADM_GPR1_COUNT (4U) + +/*! @name GPR2 - */ +#define ADM_GPR2_BANK2_MASK (0xFFFFFFFFU) +#define ADM_GPR2_BANK2_SHIFT (0U) +#define ADM_GPR2_BANK2(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR2_BANK2_SHIFT)) & ADM_GPR2_BANK2_MASK) + +/* The count of ADM_GPR2 */ +#define ADM_GPR2_COUNT (4U) + +/*! @name GPR3 - */ +#define ADM_GPR3_BANK3_MASK (0xFFFFFFFFU) +#define ADM_GPR3_BANK3_SHIFT (0U) +#define ADM_GPR3_BANK3(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR3_BANK3_SHIFT)) & ADM_GPR3_BANK3_MASK) + +/* The count of ADM_GPR3 */ +#define ADM_GPR3_COUNT (4U) + +/*! @name GPR4 - */ +#define ADM_GPR4_BANK4_MASK (0xFFFFFFFFU) +#define ADM_GPR4_BANK4_SHIFT (0U) +#define ADM_GPR4_BANK4(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR4_BANK4_SHIFT)) & ADM_GPR4_BANK4_MASK) + +/* The count of ADM_GPR4 */ +#define ADM_GPR4_COUNT (4U) + +/*! @name GPR5 - */ +#define ADM_GPR5_BANK5_MASK (0xFFFFFFFFU) +#define ADM_GPR5_BANK5_SHIFT (0U) +#define ADM_GPR5_BANK5(x) (((uint32_t)(((uint32_t)(x)) << ADM_GPR5_BANK5_SHIFT)) & ADM_GPR5_BANK5_MASK) + +/* The count of ADM_GPR5 */ +#define ADM_GPR5_COUNT (4U) + +/*! @name SECO_SUPER_ROOT_KEY_HASH - */ +#define ADM_SECO_SUPER_ROOT_KEY_HASH_VALUE_MASK (0xFFFFFFFFU) +#define ADM_SECO_SUPER_ROOT_KEY_HASH_VALUE_SHIFT (0U) +#define ADM_SECO_SUPER_ROOT_KEY_HASH_VALUE(x) (((uint32_t)(((uint32_t)(x)) << ADM_SECO_SUPER_ROOT_KEY_HASH_VALUE_SHIFT)) & ADM_SECO_SUPER_ROOT_KEY_HASH_VALUE_MASK) + +/* The count of ADM_SECO_SUPER_ROOT_KEY_HASH */ +#define ADM_SECO_SUPER_ROOT_KEY_HASH_COUNT (8U) + +/*! @name HDMI_SUPER_ROOT_KEY_HASH - */ +#define ADM_HDMI_SUPER_ROOT_KEY_HASH_VALUE_MASK (0xFFFFFFFFU) +#define ADM_HDMI_SUPER_ROOT_KEY_HASH_VALUE_SHIFT (0U) +#define ADM_HDMI_SUPER_ROOT_KEY_HASH_VALUE(x) (((uint32_t)(((uint32_t)(x)) << ADM_HDMI_SUPER_ROOT_KEY_HASH_VALUE_SHIFT)) & ADM_HDMI_SUPER_ROOT_KEY_HASH_VALUE_MASK) + +/* The count of ADM_HDMI_SUPER_ROOT_KEY_HASH */ +#define ADM_HDMI_SUPER_ROOT_KEY_HASH_COUNT (8U) + +/*! @name CAAM_PWRCTRL_REF - CAAM PWRCTRL reg for reference */ +#define ADM_CAAM_PWRCTRL_REF_VALUE_MASK (0xFFFFFFU) +#define ADM_CAAM_PWRCTRL_REF_VALUE_SHIFT (0U) +#define ADM_CAAM_PWRCTRL_REF_VALUE(x) (((uint32_t)(((uint32_t)(x)) << ADM_CAAM_PWRCTRL_REF_VALUE_SHIFT)) & ADM_CAAM_PWRCTRL_REF_VALUE_MASK) +#define ADM_CAAM_PWRCTRL_REF_LOCK_PWR_REF_MASK (0x80000000U) +#define ADM_CAAM_PWRCTRL_REF_LOCK_PWR_REF_SHIFT (31U) +#define ADM_CAAM_PWRCTRL_REF_LOCK_PWR_REF(x) (((uint32_t)(((uint32_t)(x)) << ADM_CAAM_PWRCTRL_REF_LOCK_PWR_REF_SHIFT)) & ADM_CAAM_PWRCTRL_REF_LOCK_PWR_REF_MASK) + +/*! @name SPARE - */ +#define ADM_SPARE_VALUE_MASK (0xFFFFFFFFU) +#define ADM_SPARE_VALUE_SHIFT (0U) +#define ADM_SPARE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << ADM_SPARE_VALUE_SHIFT)) & ADM_SPARE_VALUE_MASK) + +/* The count of ADM_SPARE */ +#define ADM_SPARE_COUNT (4U) + + +/*! + * @} + */ /* end of group ADM_Register_Masks */ + + +/* ADM - Peripheral instance base addresses */ +/** Peripheral ADM base pointer */ +#define ADM ((ADM_Type *)ADM_BASE) +/** Array initializer of ADM peripheral base addresses */ +#define ADM_BASE_ADDRS { ADM_BASE } +/** Array initializer of ADM peripheral base pointers */ +#define ADM_BASE_PTRS { ADM } + +/*! + * @} + */ /* end of group ADM_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* ADM_H */ + diff --git a/platform/devices/MX8/MX8_asmc.h b/platform/devices/MX8/MX8_asmc.h new file mode 100755 index 0000000..3a64970 --- /dev/null +++ b/platform/devices/MX8/MX8_asmc.h @@ -0,0 +1,171 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_ASMC_REGISTERS_H +#define HW_ASMC_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- ASMC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ASMC_Peripheral_Access_Layer ASMC Peripheral Access Layer + * @{ + */ + +/** ASMC - Register Layout Typedef */ +typedef struct { + __I uint32_t SRS; /**< System Reset Status Register, offset: 0x0 */ + uint8_t RESERVED_0[4]; + __IO uint32_t PMPROT; /**< Power Mode Protection register, offset: 0x8 */ + __IO uint32_t PMCTRL; /**< Power Mode Control register, offset: 0xC */ + __IO uint32_t STOPCTRL; /**< Stop Control Register, offset: 0x10 */ + __I uint32_t PMSTAT; /**< Power Mode Status register, offset: 0x14 */ +} ASMC_Type; + +/* ---------------------------------------------------------------------------- + -- ASMC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ASMC_Register_Masks ASMC Register Masks + * @{ + */ + +/*! @name SRS - System Reset Status Register */ +#define ASMC_SRS_WAKEUP_MASK (0x1U) +#define ASMC_SRS_WAKEUP_SHIFT (0U) +#define ASMC_SRS_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_WAKEUP_SHIFT)) & ASMC_SRS_WAKEUP_MASK) +#define ASMC_SRS_WDOG1_MASK (0x20U) +#define ASMC_SRS_WDOG1_SHIFT (5U) +#define ASMC_SRS_WDOG1(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_WDOG1_SHIFT)) & ASMC_SRS_WDOG1_MASK) +#define ASMC_SRS_RES_MASK (0x40U) +#define ASMC_SRS_RES_SHIFT (6U) +#define ASMC_SRS_RES(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_RES_SHIFT)) & ASMC_SRS_RES_MASK) +#define ASMC_SRS_POR_MASK (0x80U) +#define ASMC_SRS_POR_SHIFT (7U) +#define ASMC_SRS_POR(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_POR_SHIFT)) & ASMC_SRS_POR_MASK) +#define ASMC_SRS_LOCKUP_MASK (0x200U) +#define ASMC_SRS_LOCKUP_SHIFT (9U) +#define ASMC_SRS_LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_LOCKUP_SHIFT)) & ASMC_SRS_LOCKUP_MASK) +#define ASMC_SRS_SW_MASK (0x400U) +#define ASMC_SRS_SW_SHIFT (10U) +#define ASMC_SRS_SW(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_SW_SHIFT)) & ASMC_SRS_SW_MASK) +#define ASMC_SRS_UECC_MASK (0x1000U) +#define ASMC_SRS_UECC_SHIFT (12U) +#define ASMC_SRS_UECC(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRS_UECC_SHIFT)) & ASMC_SRS_UECC_MASK) + +#define ASMC_SRSH_MSI_MASK (0x10000U) +#define ASMC_SRSH_MSI_SHIFT (16U) +#define ASMC_SRSH_MSI(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_MSI_SHIFT)) & ASMC_SRSH_MSI_MASK) +#define ASMC_SRSH_SNVS_MASK (0x20000U) +#define ASMC_SRSH_SNVS_SHIFT (17U) +#define ASMC_SRSH_PANIC(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_PANIC_SHIFT)) & ASMC_SRSH_PANIC_MASK) +#define ASMC_SRSH_PANIC_MASK (0x40000U) +#define ASMC_SRSH_PANIC_SHIFT (18U) +#define ASMC_SRSH_PANIC(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_PANIC_SHIFT)) & ASMC_SRSH_PANIC_MASK) +#define ASMC_SRSH_JTAG_MASK (0x80000U) +#define ASMC_SRSH_JTAG_SHIFT (19U) +#define ASMC_SRSH_JTAG(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_JTAG_SHIFT)) & ASMC_SRSH_JTAG_MASK) +#define ASMC_SRSH_WDOG_MASK (0x100000U) +#define ASMC_SRSH_WDOG_SHIFT (20U) +#define ASMC_SRSH_WDOG(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_WDOG_SHIFT)) & ASMC_SRSH_WDOG_MASK) +#define ASMC_SRSH_SW_MASK (0x200000U) +#define ASMC_SRSH_SW_SHIFT (21U) +#define ASMC_SRSH_SRS(x) (((uint32_t)(((uint32_t)(x)) << ASMC_SRSH_SW_SHIFT)) & ASMC_SRSH_SW_MASK) + +/*! @name PMPROT - Power Mode Protection register */ +#define ASMC_PMPROT_AVLLS_MASK (0x2U) +#define ASMC_PMPROT_AVLLS_SHIFT (1U) +#define ASMC_PMPROT_AVLLS(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMPROT_AVLLS_SHIFT)) & ASMC_PMPROT_AVLLS_MASK) +#define ASMC_PMPROT_ALLS_MASK (0x8U) +#define ASMC_PMPROT_ALLS_SHIFT (3U) +#define ASMC_PMPROT_ALLS(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMPROT_ALLS_SHIFT)) & ASMC_PMPROT_ALLS_MASK) +#define ASMC_PMPROT_AVLP_MASK (0x20U) +#define ASMC_PMPROT_AVLP_SHIFT (5U) +#define ASMC_PMPROT_AVLP(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMPROT_AVLP_SHIFT)) & ASMC_PMPROT_AVLP_MASK) +#define ASMC_PMPROT_AHSRUN_MASK (0x80U) +#define ASMC_PMPROT_AHSRUN_SHIFT (7U) +#define ASMC_PMPROT_AHSRUN(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMPROT_AHSRUN_SHIFT)) & ASMC_PMPROT_AHSRUN_MASK) + +/*! @name PMCTRL - Power Mode Control register */ +#define ASMC_PMCTRL_STOPM_MASK (0x7U) +#define ASMC_PMCTRL_STOPM_SHIFT (0U) +#define ASMC_PMCTRL_STOPM(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMCTRL_STOPM_SHIFT)) & ASMC_PMCTRL_STOPM_MASK) +#define ASMC_PMCTRL_RUNM_MASK (0x60U) +#define ASMC_PMCTRL_RUNM_SHIFT (5U) +#define ASMC_PMCTRL_RUNM(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMCTRL_RUNM_SHIFT)) & ASMC_PMCTRL_RUNM_MASK) + +/*! @name STOPCTRL - Stop Control Register */ +#define ASMC_STOPCTRL_PSTOPO_MASK (0xC0U) +#define ASMC_STOPCTRL_PSTOPO_SHIFT (6U) +#define ASMC_STOPCTRL_PSTOPO(x) (((uint32_t)(((uint32_t)(x)) << ASMC_STOPCTRL_PSTOPO_SHIFT)) & ASMC_STOPCTRL_PSTOPO_MASK) + +/*! @name PMSTAT - Power Mode Status register */ +#define ASMC_PMSTAT_PMSTAT_MASK (0xFFU) +#define ASMC_PMSTAT_PMSTAT_SHIFT (0U) +#define ASMC_PMSTAT_PMSTAT(x) (((uint32_t)(((uint32_t)(x)) << ASMC_PMSTAT_PMSTAT_SHIFT)) & ASMC_PMSTAT_PMSTAT_MASK) + + +/*! + * @} + */ /* end of group ASMC_Register_Masks */ + + +/** Peripheral ASMC base pointer */ +#define ASMC ((ASMC_Type *)ASMC_BASE) +/** Array initializer of ASMC peripheral base addresses */ +#define ASMC_BASE_ADDRS { ASMC_BASE } +/** Array initializer of ASMC peripheral base pointers */ +#define ASMC_BASE_PTRS { ASMC } + +/*! + * @} + */ /* end of group ASMC_Peripheral_Access_Layer */ + +#endif /* HW_ASMC_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_csr.h b/platform/devices/MX8/MX8_csr.h new file mode 100755 index 0000000..684a10b --- /dev/null +++ b/platform/devices/MX8/MX8_csr.h @@ -0,0 +1,150 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_csr.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for CSR + * + * CMSIS Peripheral Access Layer for CSR + */ + +#ifndef CSR_H +#define CSR_H /**< Symbol preventing repeated inclusion */ + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- CSR Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CSR_Peripheral_Access_Layer CSR Peripheral Access Layer + * @{ + */ + +/** CSR - Register Layout Typedef */ +typedef struct { + __IO uint32_t CSR_LP_PG[16]; /**< Control and Status Registers, LP_PG0-LP_PG3 offset 0x9000 */ + __IO uint32_t CSR_PORT_CONFIG; /**< Control and Status Registers, PORT_CONFIG offset 0x9040 */ + uint8_t RESERVED_18[188]; + __IO uint32_t GPR_CSR_CTRL[196]; /**< Control and Status Registers, offset 0x9100 */ +} CSR_Type; + +/** CSR2 - Register Layout Typedef */ +typedef struct { + __IO uint32_t GPR_CSR_CTRL[256]; /**< Control and Status Registers, offset 0x9100 */ +} CSR2_Type; + +/* CSR - Peripheral instance base addresses */ +/** Peripheral CSR base address */ +#define CSR_BASE (0u) +/** Peripheral CSR base pointer */ +#define CSR ((CSR_Type *)CSR_BASE) +/** Array initializer of CSR peripheral base addresses */ +#define CSR_BASE_ADDRS { CSR_BASE } +/** Array initializer of CSR peripheral base pointers */ +#define CSR_BASE_PTRS { CSR } + +/*! + * @} + */ /* end of group CSR_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* CSR_H */ + diff --git a/platform/devices/MX8/MX8_ddr_phy.h b/platform/devices/MX8/MX8_ddr_phy.h new file mode 100755 index 0000000..afbb594 --- /dev/null +++ b/platform/devices/MX8/MX8_ddr_phy.h @@ -0,0 +1,1925 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of Freescale Semiconductor, Inc. nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** ################################################################### +*/ + +#ifndef HW_DDR_PHY_REGISTERS_H +#define HW_DDR_PHY_REGISTERS_H + +//JDG change base addr for DDR_PHY +#define DDR_PHY_BASE_ADDR(X) (0x5c000000UL + ((U32(X) * 0x100000UL) + 0x10000UL)) + +// Following defines registers offset of the Synopsys DesignWare Cores LPDDR4 multiPHY Utility Block (PUB) +#define DDR_PHY_RIDR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x000U)) +#define DDR_PHY_RIDR_0 0x5c010000 +#define DDR_PHY_RIDR_1 0x5c110000 +#define DDR_PHY_PIR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x001U)) +#define DDR_PHY_PIR_0 0x5c010004 +#define DDR_PHY_PIR_1 0x5c110004 +#define DDR_PHY_PGCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x004U)) +#define DDR_PHY_PGCR0_0 0x5c010010 +#define DDR_PHY_PGCR0_1 0x5c110010 +#define DDR_PHY_PGCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x005U)) +#define DDR_PHY_PGCR1_0 0x5c010014 +#define DDR_PHY_PGCR1_1 0x5c110014 +#define DDR_PHY_PGCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x006U)) +#define DDR_PHY_PGCR2_0 0x5c010018 +#define DDR_PHY_PGCR2_1 0x5c110018 +#define DDR_PHY_PGCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x007U)) +#define DDR_PHY_PGCR3_0 0x5c01001c +#define DDR_PHY_PGCR3_1 0x5c11001c +#define DDR_PHY_PGCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x008U)) +#define DDR_PHY_PGCR4_0 0x5c010020 +#define DDR_PHY_PGCR4_1 0x5c110020 +#define DDR_PHY_PGCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x009U)) +#define DDR_PHY_PGCR5_0 0x5c010024 +#define DDR_PHY_PGCR5_1 0x5c110024 +#define DDR_PHY_PGCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x00AU)) +#define DDR_PHY_PGCR6_0 0x5c010028 +#define DDR_PHY_PGCR6_1 0x5c110028 +#define DDR_PHY_PGCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x00BU)) +#define DDR_PHY_PGCR7_0 0x5c01002c +#define DDR_PHY_PGCR7_1 0x5c11002c +#define DDR_PHY_PGSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x00CU)) +#define DDR_PHY_PGSR0_0 0x5c010030 +#define DDR_PHY_PGSR0_1 0x5c110030 +#define DDR_PHY_PGSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x00DU)) +#define DDR_PHY_PGSR1_0 0x5c010034 +#define DDR_PHY_PGSR1_1 0x5c110034 +#define DDR_PHY_PGSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x00EU)) +#define DDR_PHY_PGSR2_0 0x5c010038 +#define DDR_PHY_PGSR2_1 0x5c110038 +#define DDR_PHY_PTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x010U)) +#define DDR_PHY_PTR0_0 0x5c010040 +#define DDR_PHY_PTR0_1 0x5c110040 +#define DDR_PHY_PTR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x011U)) +#define DDR_PHY_PTR1_0 0x5c010044 +#define DDR_PHY_PTR1_1 0x5c110044 +#define DDR_PHY_PTR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x012U)) +#define DDR_PHY_PTR2_0 0x5c010048 +#define DDR_PHY_PTR2_1 0x5c110048 +#define DDR_PHY_PTR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x013U)) +#define DDR_PHY_PTR3_0 0x5c01004c +#define DDR_PHY_PTR3_1 0x5c11004c +#define DDR_PHY_PTR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x014U)) +#define DDR_PHY_PTR4_0 0x5c010050 +#define DDR_PHY_PTR4_1 0x5c110050 +#define DDR_PHY_PTR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x015U)) +#define DDR_PHY_PTR5_0 0x5c010054 +#define DDR_PHY_PTR5_1 0x5c110054 +#define DDR_PHY_PTR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x016U)) +#define DDR_PHY_PTR6_0 0x5c010058 +#define DDR_PHY_PTR6_1 0x5c110058 +#define DDR_PHY_PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01AU)) +#define DDR_PHY_PLLCR0_0 0x5c010068 +#define DDR_PHY_PLLCR0_1 0x5c110068 +#define DDR_PHY_PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01BU)) +#define DDR_PHY_PLLCR1_0 0x5c01006c +#define DDR_PHY_PLLCR1_1 0x5c11006c +#define DDR_PHY_PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01CU)) +#define DDR_PHY_PLLCR2_0 0x5c010070 +#define DDR_PHY_PLLCR2_1 0x5c110070 +#define DDR_PHY_PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01DU)) +#define DDR_PHY_PLLCR3_0 0x5c010074 +#define DDR_PHY_PLLCR3_1 0x5c110074 +#define DDR_PHY_PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01EU)) +#define DDR_PHY_PLLCR4_0 0x5c010078 +#define DDR_PHY_PLLCR4_1 0x5c110078 +#define DDR_PHY_PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x01FU)) +#define DDR_PHY_PLLCR5_0 0x5c01007c +#define DDR_PHY_PLLCR5_1 0x5c11007c +#define DDR_PHY_DXCCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x022U)) +#define DDR_PHY_DXCCR_0 0x5c010088 +#define DDR_PHY_DXCCR_1 0x5c110088 +#define DDR_PHY_DSGCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x024U)) +#define DDR_PHY_DSGCR_0 0x5c010090 +#define DDR_PHY_DSGCR_1 0x5c110090 +#define DDR_PHY_ODTCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x026U)) +#define DDR_PHY_ODTCR_0 0x5c010098 +#define DDR_PHY_ODTCR_1 0x5c110098 +#define DDR_PHY_AACR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x028U)) +#define DDR_PHY_AACR_0 0x5c0100a0 +#define DDR_PHY_AACR_1 0x5c1100a0 +#define DDR_PHY_GPR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x030U)) +#define DDR_PHY_GPR0_0 0x5c0100c0 +#define DDR_PHY_GPR0_1 0x5c1100c0 +#define DDR_PHY_GPR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x031U)) +#define DDR_PHY_GPR1_0 0x5c0100c4 +#define DDR_PHY_GPR1_1 0x5c1100c4 +#define DDR_PHY_DCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x040U)) +#define DDR_PHY_DCR_0 0x5c010100 +#define DDR_PHY_DCR_1 0x5c110100 +#define DDR_PHY_DTPR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x044U)) +#define DDR_PHY_DTPR0_0 0x5c010110 +#define DDR_PHY_DTPR0_1 0x5c110110 +#define DDR_PHY_DTPR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x045U)) +#define DDR_PHY_DTPR1_0 0x5c010114 +#define DDR_PHY_DTPR1_1 0x5c110114 +#define DDR_PHY_DTPR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x046U)) +#define DDR_PHY_DTPR2_0 0x5c010118 +#define DDR_PHY_DTPR2_1 0x5c110118 +#define DDR_PHY_DTPR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x047U)) +#define DDR_PHY_DTPR3_0 0x5c01011c +#define DDR_PHY_DTPR3_1 0x5c11011c +#define DDR_PHY_DTPR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x048U)) +#define DDR_PHY_DTPR4_0 0x5c010120 +#define DDR_PHY_DTPR4_1 0x5c110120 +#define DDR_PHY_DTPR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x049U)) +#define DDR_PHY_DTPR5_0 0x5c010124 +#define DDR_PHY_DTPR5_1 0x5c110124 +#define DDR_PHY_RDIMMGCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x050U)) +#define DDR_PHY_RDIMMGCR0_0 0x5c010140 +#define DDR_PHY_RDIMMGCR0_1 0x5c110140 +#define DDR_PHY_RDIMMGCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x051U)) +#define DDR_PHY_RDIMMGCR1_0 0x5c010144 +#define DDR_PHY_RDIMMGCR1_1 0x5c110144 +#define DDR_PHY_RDIMMGCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x052U) +#define DDR_PHY_RDIMMGCR2_0 0x5c010148 +#define DDR_PHY_RDIMMGCR2_1 0x5c110148 +#define DDR_PHY_RDIMMCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x054U)) +#define DDR_PHY_RDIMMCR0_0 0x5c010150 +#define DDR_PHY_RDIMMCR0_1 0x5c110150 +#define DDR_PHY_RDIMMCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x055U)) +#define DDR_PHY_RDIMMCR1_0 0x5c010154 +#define DDR_PHY_RDIMMCR1_1 0x5c110154 +#define DDR_PHY_RDIMMCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x056U)) +#define DDR_PHY_RDIMMCR2_0 0x5c010158 +#define DDR_PHY_RDIMMCR2_1 0x5c110158 +#define DDR_PHY_RDIMMCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x057U)) +#define DDR_PHY_RDIMMCR3_0 0x5c01015c +#define DDR_PHY_RDIMMCR3_1 0x5c11015c +#define DDR_PHY_RDIMMCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x058U)) +#define DDR_PHY_RDIMMCR4_0 0x5c010160 +#define DDR_PHY_RDIMMCR4_1 0x5c110160 +#define DDR_PHY_SCHCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x05AU)) +#define DDR_PHY_SCHCR0_0 0x5c010168 +#define DDR_PHY_SCHCR0_1 0x5c110168 +#define DDR_PHY_SCHCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x05BU)) +#define DDR_PHY_SCHCR1_0 0x5c01016c +#define DDR_PHY_SCHCR1_1 0x5c11016c +#define DDR_PHY_MR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x060U)) +#define DDR_PHY_MR0_0 0x5c010180 +#define DDR_PHY_MR0_1 0x5c110180 +#define DDR_PHY_MR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x061U)) +#define DDR_PHY_MR1_0 0x5c010184 +#define DDR_PHY_MR1_1 0x5c110184 +#define DDR_PHY_MR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x062U)) +#define DDR_PHY_MR2_0 0x5c010188 +#define DDR_PHY_MR2_1 0x5c110188 +#define DDR_PHY_MR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x063U)) +#define DDR_PHY_MR3_0 0x5c01018c +#define DDR_PHY_MR3_1 0x5c11018c +#define DDR_PHY_MR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x064U)) +#define DDR_PHY_MR4_0 0x5c010190 +#define DDR_PHY_MR4_1 0x5c110190 +#define DDR_PHY_MR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x065U)) +#define DDR_PHY_MR5_0 0x5c010194 +#define DDR_PHY_MR5_1 0x5c110194 +#define DDR_PHY_MR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x066U)) +#define DDR_PHY_MR6_0 0x5c010198 +#define DDR_PHY_MR6_1 0x5c110198 +#define DDR_PHY_MR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x067U)) +#define DDR_PHY_MR7_0 0x5c01019c +#define DDR_PHY_MR7_1 0x5c11019c +#define DDR_PHY_MR11(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x06BU)) +#define DDR_PHY_MR11_0 0x5c0101ac +#define DDR_PHY_MR11_1 0x5c1101ac +#define DDR_PHY_MR12(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x06CU)) +#define DDR_PHY_MR12_0 0x5c0101b0 +#define DDR_PHY_MR12_1 0x5c1101b0 +#define DDR_PHY_MR13(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x06DU)) +#define DDR_PHY_MR13_0 0x5c0101b4 +#define DDR_PHY_MR13_1 0x5c1101b4 +#define DDR_PHY_MR14(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x06EU)) +#define DDR_PHY_MR14_0 0x5c0101b8 +#define DDR_PHY_MR14_1 0x5c1101b8 +#define DDR_PHY_MR22(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x076U)) +#define DDR_PHY_MR22_0 0x5c0101d8 +#define DDR_PHY_MR22_1 0x5c1101d8 +#define DDR_PHY_DTCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x080U)) +#define DDR_PHY_DTCR0_0 0x5c010200 +#define DDR_PHY_DTCR0_1 0x5c110200 +#define DDR_PHY_DTCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x081U)) +#define DDR_PHY_DTCR1_0 0x5c010204 +#define DDR_PHY_DTCR1_1 0x5c110204 +#define DDR_PHY_DTAR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x082U)) +#define DDR_PHY_DTAR0_0 0x5c010208 +#define DDR_PHY_DTAR0_1 0x5c110208 +#define DDR_PHY_DTAR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x083U)) +#define DDR_PHY_DTAR1_0 0x5c01020c +#define DDR_PHY_DTAR1_1 0x5c11020c +#define DDR_PHY_DTAR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x084U)) +#define DDR_PHY_DTAR2_0 0x5c010210 +#define DDR_PHY_DTAR2_1 0x5c110210 +#define DDR_PHY_DTDR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x086U)) +#define DDR_PHY_DTDR0_0 0x5c010218 +#define DDR_PHY_DTDR0_1 0x5c110218 +#define DDR_PHY_DTDR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x087U)) +#define DDR_PHY_DTDR1_0 0x5c01021c +#define DDR_PHY_DTDR1_1 0x5c11021c +#define DDR_PHY_DTEDR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x08CU)) +#define DDR_PHY_DTEDR0_0 0x5c010230 +#define DDR_PHY_DTEDR0_1 0x5c110230 +#define DDR_PHY_DTEDR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x08CU)) +#define DDR_PHY_DTEDR1_0 0x5c010230 +#define DDR_PHY_DTEDR1_1 0x5c110230 +#define DDR_PHY_DTEDR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x08CU)) +#define DDR_PHY_DTEDR2_0 0x5c010230 +#define DDR_PHY_DTEDR2_1 0x5c110230 +#define DDR_PHY_VTDR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x08FU)) +#define DDR_PHY_VTDR_0 0x5c01023c +#define DDR_PHY_VTDR_1 0x5c11023c +#define DDR_PHY_CATR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x090U)) +#define DDR_PHY_CATR0_0 0x5c010240 +#define DDR_PHY_CATR0_1 0x5c110240 +#define DDR_PHY_CATR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x091U)) +#define DDR_PHY_CATR1_0 0x5c010244 +#define DDR_PHY_CATR1_1 0x5c110244 +#define DDR_PHY_PGCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x092U)) +#define DDR_PHY_PGCR8_0 0x5c010248 +#define DDR_PHY_PGCR8_1 0x5c110248 +#define DDR_PHY_DQSDR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x094U)) +#define DDR_PHY_DQSDR0_0 0x5c010250 +#define DDR_PHY_DQSDR0_1 0x5c110250 +#define DDR_PHY_DQSDR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x095U)) +#define DDR_PHY_DQSDR1_0 0x5c010254 +#define DDR_PHY_DQSDR1_1 0x5c110254 +#define DDR_PHY_DQSDR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x096U)) +#define DDR_PHY_DQSDR2_0 0x5c010258 +#define DDR_PHY_DQSDR2_1 0x5c110258 +#define DDR_PHY_DCUAR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C0U)) +#define DDR_PHY_DCUAR_0 0x5c010300 +#define DDR_PHY_DCUAR_1 0x5c110300 +#define DDR_PHY_DCUDR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C1U)) +#define DDR_PHY_DCUDR_0 0x5c010304 +#define DDR_PHY_DCUDR_1 0x5c110304 +#define DDR_PHY_DCURR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C2U)) +#define DDR_PHY_DCURR_0 0x5c010308 +#define DDR_PHY_DCURR_1 0x5c110308 +#define DDR_PHY_DCULR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C3U)) +#define DDR_PHY_DCULR_0 0x5c01030c +#define DDR_PHY_DCULR_1 0x5c11030c +#define DDR_PHY_DCUGCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C4U)) +#define DDR_PHY_DCUGCR_0 0x5c010310 +#define DDR_PHY_DCUGCR_1 0x5c110310 +#define DDR_PHY_DCUTPR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C5U)) +#define DDR_PHY_DCUTPR_0 0x5c010314 +#define DDR_PHY_DCUTPR_1 0x5c110314 +#define DDR_PHY_DCUSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C6U)) +#define DDR_PHY_DCUSR0_0 0x5c010318 +#define DDR_PHY_DCUSR0_1 0x5c110318 +#define DDR_PHY_DCUSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x0C7U)) +#define DDR_PHY_DCUSR1_0 0x5c01031c +#define DDR_PHY_DCUSR1_1 0x5c11031c +#define DDR_PHY_BISTRR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x100U)) +#define DDR_PHY_BISTRR_0 0x5c010400 +#define DDR_PHY_BISTRR_1 0x5c110400 +#define DDR_PHY_BISTWCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x101U)) +#define DDR_PHY_BISTWCR_0 0x5c010404 +#define DDR_PHY_BISTWCR_1 0x5c110404 +#define DDR_PHY_BISTMSKR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x102U)) +#define DDR_PHY_BISTMSKR0_0 0x5c010408 +#define DDR_PHY_BISTMSKR0_1 0x5c110408 +#define DDR_PHY_BISTMSKR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x103U)) +#define DDR_PHY_BISTMSKR1_0 0x5c01040c +#define DDR_PHY_BISTMSKR1_1 0x5c11040c +#define DDR_PHY_BISTMSKR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x104U)) +#define DDR_PHY_BISTMSKR2_0 0x5c010410 +#define DDR_PHY_BISTMSKR2_1 0x5c110410 +#define DDR_PHY_BISTLSR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x105U)) +#define DDR_PHY_BISTLSR_0 0x5c010414 +#define DDR_PHY_BISTLSR_1 0x5c110414 +#define DDR_PHY_BISTAR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x106U)) +#define DDR_PHY_BISTAR0_0 0x5c010418 +#define DDR_PHY_BISTAR0_1 0x5c110418 +#define DDR_PHY_BISTAR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x107U)) +#define DDR_PHY_BISTAR1_0 0x5c01041c +#define DDR_PHY_BISTAR1_1 0x5c11041c +#define DDR_PHY_BISTAR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x108U)) +#define DDR_PHY_BISTAR2_0 0x5c010420 +#define DDR_PHY_BISTAR2_1 0x5c110420 +#define DDR_PHY_BISTAR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x109U)) +#define DDR_PHY_BISTAR3_0 0x5c010424 +#define DDR_PHY_BISTAR3_1 0x5c110424 +#define DDR_PHY_BISTAR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10AU)) +#define DDR_PHY_BISTAR4_0 0x5c010428 +#define DDR_PHY_BISTAR4_1 0x5c110428 +#define DDR_PHY_BISTUDPR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10BU)) +#define DDR_PHY_BISTUDPR_0 0x5c01042c +#define DDR_PHY_BISTUDPR_1 0x5c11042c +#define DDR_PHY_BISTGSR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10CU)) +#define DDR_PHY_BISTGSR_0 0x5c010430 +#define DDR_PHY_BISTGSR_1 0x5c110430 +#define DDR_PHY_BISTWER0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10DU)) +#define DDR_PHY_BISTWER0_0 0x5c010434 +#define DDR_PHY_BISTWER0_1 0x5c110434 +#define DDR_PHY_BISTWER1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10EU)) +#define DDR_PHY_BISTWER1_0 0x5c010438 +#define DDR_PHY_BISTWER1_1 0x5c110438 +#define DDR_PHY_BISTBER0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x10FU)) +#define DDR_PHY_BISTBER0_0 0x5c01043c +#define DDR_PHY_BISTBER0_1 0x5c11043c +#define DDR_PHY_BISTBER1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x110U)) +#define DDR_PHY_BISTBER1_0 0x5c010440 +#define DDR_PHY_BISTBER1_1 0x5c110440 +#define DDR_PHY_BISTBER2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x111U)) +#define DDR_PHY_BISTBER2_0 0x5c010444 +#define DDR_PHY_BISTBER2_1 0x5c110444 +#define DDR_PHY_BISTBER3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x112U)) +#define DDR_PHY_BISTBER3_0 0x5c010448 +#define DDR_PHY_BISTBER3_1 0x5c110448 +#define DDR_PHY_BISTBER4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x113U)) +#define DDR_PHY_BISTBER4_0 0x5c01044c +#define DDR_PHY_BISTBER4_1 0x5c11044c +#define DDR_PHY_BISTWCSR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x114U)) +#define DDR_PHY_BISTWCSR_0 0x5c010450 +#define DDR_PHY_BISTWCSR_1 0x5c110450 +#define DDR_PHY_BISTFWR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x115U)) +#define DDR_PHY_BISTFWR0_0 0x5c010454 +#define DDR_PHY_BISTFWR0_1 0x5c110454 +#define DDR_PHY_BISTFWR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x116U)) +#define DDR_PHY_BISTFWR1_0 0x5c010458 +#define DDR_PHY_BISTFWR1_1 0x5c110458 +#define DDR_PHY_BISTFWR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x117U)) +#define DDR_PHY_BISTFWR2_0 0x5c01045c +#define DDR_PHY_BISTFWR2_1 0x5c11045c +#define DDR_PHY_BISTBER5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x118U)) +#define DDR_PHY_BISTBER5_0 0x5c010460 +#define DDR_PHY_BISTBER5_1 0x5c110460 +#define DDR_PHY_RANKIDR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x137U)) +#define DDR_PHY_RANKIDR_0 0x5c0104dc +#define DDR_PHY_RANKIDR_1 0x5c1104dc +#define DDR_PHY_RIOCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x138U)) +#define DDR_PHY_RIOCR0_0 0x5c0104e0 +#define DDR_PHY_RIOCR0_1 0x5c1104e0 +#define DDR_PHY_RIOCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x139U)) +#define DDR_PHY_RIOCR1_0 0x5c0104e4 +#define DDR_PHY_RIOCR1_1 0x5c1104e4 +#define DDR_PHY_RIOCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x13AU)) +#define DDR_PHY_RIOCR2_0 0x5c0104e8 +#define DDR_PHY_RIOCR2_1 0x5c1104e8 +#define DDR_PHY_RIOCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x13BU)) +#define DDR_PHY_RIOCR3_0 0x5c0104ec +#define DDR_PHY_RIOCR3_1 0x5c1104ec +#define DDR_PHY_RIOCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x13CU)) +#define DDR_PHY_RIOCR4_0 0x5c0104f0 +#define DDR_PHY_RIOCR4_1 0x5c1104f0 +#define DDR_PHY_RIOCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x13DU)) +#define DDR_PHY_RIOCR5_0 0x5c0104f4 +#define DDR_PHY_RIOCR5_1 0x5c1104f4 +#define DDR_PHY_ACIOCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x140U)) +#define DDR_PHY_ACIOCR0_0 0x5c010500 +#define DDR_PHY_ACIOCR0_1 0x5c110500 +#define DDR_PHY_ACIOCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x141U)) +#define DDR_PHY_ACIOCR1_0 0x5c010504 +#define DDR_PHY_ACIOCR1_1 0x5c110504 +#define DDR_PHY_ACIOCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x142U)) +#define DDR_PHY_ACIOCR2_0 0x5c010508 +#define DDR_PHY_ACIOCR2_1 0x5c110508 +#define DDR_PHY_ACIOCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x143U)) +#define DDR_PHY_ACIOCR3_0 0x5c01050c +#define DDR_PHY_ACIOCR3_1 0x5c11050c +#define DDR_PHY_ACIOCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x144U)) +#define DDR_PHY_ACIOCR4_0 0x5c010510 +#define DDR_PHY_ACIOCR4_1 0x5c110510 +#define DDR_PHY_ACIOCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x145U)) +#define DDR_PHY_ACIOCR5_0 0x5c010514 +#define DDR_PHY_ACIOCR5_1 0x5c110514 +#define DDR_PHY_IOVCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x148U)) +#define DDR_PHY_IOVCR0_0 0x5c010520 +#define DDR_PHY_IOVCR0_1 0x5c110520 +#define DDR_PHY_IOVCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x149U)) +#define DDR_PHY_IOVCR1_0 0x5c010524 +#define DDR_PHY_IOVCR1_1 0x5c110524 +#define DDR_PHY_VTCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x14AU)) +#define DDR_PHY_VTCR0_0 0x5c010528 +#define DDR_PHY_VTCR0_1 0x5c110528 +#define DDR_PHY_VTCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x14BU)) +#define DDR_PHY_VTCR1_0 0x5c01052c +#define DDR_PHY_VTCR1_1 0x5c11052c +#define DDR_PHY_ACBDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x150U)) +#define DDR_PHY_ACBDLR0_0 0x5c010540 +#define DDR_PHY_ACBDLR0_1 0x5c110540 +#define DDR_PHY_ACBDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x151U)) +#define DDR_PHY_ACBDLR1_0 0x5c010544 +#define DDR_PHY_ACBDLR1_1 0x5c110544 +#define DDR_PHY_ACBDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x152U)) +#define DDR_PHY_ACBDLR2_0 0x5c010548 +#define DDR_PHY_ACBDLR2_1 0x5c110548 +#define DDR_PHY_ACBDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x153U)) +#define DDR_PHY_ACBDLR3_0 0x5c01054c +#define DDR_PHY_ACBDLR3_1 0x5c11054c +#define DDR_PHY_ACBDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x154U)) +#define DDR_PHY_ACBDLR4_0 0x5c010550 +#define DDR_PHY_ACBDLR4_1 0x5c110550 +#define DDR_PHY_ACBDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x155U)) +#define DDR_PHY_ACBDLR5_0 0x5c010554 +#define DDR_PHY_ACBDLR5_1 0x5c110554 +#define DDR_PHY_ACBDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x156U)) +#define DDR_PHY_ACBDLR6_0 0x5c010558 +#define DDR_PHY_ACBDLR6_1 0x5c110558 +#define DDR_PHY_ACBDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x157U)) +#define DDR_PHY_ACBDLR7_0 0x5c01055c +#define DDR_PHY_ACBDLR7_1 0x5c11055c +#define DDR_PHY_ACBDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x158U)) +#define DDR_PHY_ACBDLR8_0 0x5c010560 +#define DDR_PHY_ACBDLR8_1 0x5c110560 +#define DDR_PHY_ACBDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x159U)) +#define DDR_PHY_ACBDLR9_0 0x5c010564 +#define DDR_PHY_ACBDLR9_1 0x5c110564 +#define DDR_PHY_ACBDLR10(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15AU)) +#define DDR_PHY_ACBDLR10_0 0x5c010568 +#define DDR_PHY_ACBDLR10_1 0x5c110568 +#define DDR_PHY_ACBDLR11(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15BU)) +#define DDR_PHY_ACBDLR11_0 0x5c01056c +#define DDR_PHY_ACBDLR11_1 0x5c11056c +#define DDR_PHY_ACBDLR12(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15CU)) +#define DDR_PHY_ACBDLR12_0 0x5c010570 +#define DDR_PHY_ACBDLR12_1 0x5c110570 +#define DDR_PHY_ACBDLR13(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15DU)) +#define DDR_PHY_ACBDLR13_0 0x5c010574 +#define DDR_PHY_ACBDLR13_1 0x5c110574 +#define DDR_PHY_ACBDLR14(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15EU)) +#define DDR_PHY_ACBDLR14_0 0x5c010578 +#define DDR_PHY_ACBDLR14_1 0x5c110578 +#define DDR_PHY_ACBDLR15(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x15FU)) +#define DDR_PHY_ACBDLR15_0 0x5c01057c +#define DDR_PHY_ACBDLR15_1 0x5c11057c +#define DDR_PHY_ACBDLR16(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x160U)) +#define DDR_PHY_ACBDLR16_0 0x5c010580 +#define DDR_PHY_ACBDLR16_1 0x5c110580 +#define DDR_PHY_ACLCDLR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x161U)) +#define DDR_PHY_ACLCDLR_0 0x5c010584 +#define DDR_PHY_ACLCDLR_1 0x5c110584 +#define DDR_PHY_ACMDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x168U)) +#define DDR_PHY_ACMDLR0_0 0x5c0105a0 +#define DDR_PHY_ACMDLR0_1 0x5c1105a0 +#define DDR_PHY_ACMDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x169U)) +#define DDR_PHY_ACMDLR1_0 0x5c0105a4 +#define DDR_PHY_ACMDLR1_1 0x5c1105a4 +#define DDR_PHY_ZQCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A0U)) +#define DDR_PHY_ZQCR_0 0x5c010680 +#define DDR_PHY_ZQCR_1 0x5c110680 +#define DDR_PHY_ZQ0PR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A1U)) +#define DDR_PHY_ZQ0PR0_0 0x5c010684 +#define DDR_PHY_ZQ0PR0_1 0x5c110684 +#define DDR_PHY_ZQ0PR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A2U)) +#define DDR_PHY_ZQ0PR1_0 0x5c010688 +#define DDR_PHY_ZQ0PR1_1 0x5c110688 +#define DDR_PHY_ZQ0DR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A3U)) +#define DDR_PHY_ZQ0DR0_0 0x5c01068c +#define DDR_PHY_ZQ0DR0_1 0x5c11068c +#define DDR_PHY_ZQ0DR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A4U)) +#define DDR_PHY_ZQ0DR1_0 0x5c010690 +#define DDR_PHY_ZQ0DR1_1 0x5c110690 +#define DDR_PHY_ZQ0OR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A5U)) +#define DDR_PHY_ZQ0OR0_0 0x5c010694 +#define DDR_PHY_ZQ0OR0_1 0x5c110694 +#define DDR_PHY_ZQ0OR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A6U)) +#define DDR_PHY_ZQ0OR1_0 0x5c010698 +#define DDR_PHY_ZQ0OR1_1 0x5c110698 +#define DDR_PHY_ZQ0SR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A7U)) +#define DDR_PHY_ZQ0SR_0 0x5c01069c +#define DDR_PHY_ZQ0SR_1 0x5c11069c +#define DDR_PHY_ZQ1PR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1A9U)) +#define DDR_PHY_ZQ1PR0_0 0x5c0106a4 +#define DDR_PHY_ZQ1PR0_1 0x5c1106a4 +#define DDR_PHY_ZQ1PR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1AAU)) +#define DDR_PHY_ZQ1PR1_0 0x5c0106a8 +#define DDR_PHY_ZQ1PR1_1 0x5c1106a8 +#define DDR_PHY_ZQ1DR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1ABU)) +#define DDR_PHY_ZQ1DR0_0 0x5c0106ac +#define DDR_PHY_ZQ1DR0_1 0x5c1106ac +#define DDR_PHY_ZQ1DR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1ACU)) +#define DDR_PHY_ZQ1DR1_0 0x5c0106b0 +#define DDR_PHY_ZQ1DR1_1 0x5c1106b0 +#define DDR_PHY_ZQ1OR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1ADU)) +#define DDR_PHY_ZQ1OR0_0 0x5c0106b4 +#define DDR_PHY_ZQ1OR0_1 0x5c1106b4 +#define DDR_PHY_ZQ1OR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1AEU)) +#define DDR_PHY_ZQ1OR1_0 0x5c0106b8 +#define DDR_PHY_ZQ1OR1_1 0x5c1106b8 +#define DDR_PHY_ZQ1SR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1AFU)) +#define DDR_PHY_ZQ1SR_0 0x5c0106bc +#define DDR_PHY_ZQ1SR_1 0x5c1106bc +#define DDR_PHY_ZQ2PR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B1U)) +#define DDR_PHY_ZQ2PR0_0 0x5c0106c4 +#define DDR_PHY_ZQ2PR0_1 0x5c1106c4 +#define DDR_PHY_ZQ2PR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B2U)) +#define DDR_PHY_ZQ2PR1_0 0x5c0106c8 +#define DDR_PHY_ZQ2PR1_1 0x5c1106c8 +#define DDR_PHY_ZQ2DR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B3U)) +#define DDR_PHY_ZQ2DR0_0 0x5c0106cc +#define DDR_PHY_ZQ2DR0_1 0x5c1106cc +#define DDR_PHY_ZQ2DR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B4U)) +#define DDR_PHY_ZQ2DR1_0 0x5c0106d0 +#define DDR_PHY_ZQ2DR1_1 0x5c1106d0 +#define DDR_PHY_ZQ2OR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B5U)) +#define DDR_PHY_ZQ2OR0_0 0x5c0106d4 +#define DDR_PHY_ZQ2OR0_1 0x5c1106d4 +#define DDR_PHY_ZQ2OR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B6U)) +#define DDR_PHY_ZQ2OR1_0 0x5c0106d8 +#define DDR_PHY_ZQ2OR1_1 0x5c1106d8 +#define DDR_PHY_ZQ2SR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B7U)) +#define DDR_PHY_ZQ2SR_0 0x5c0106dc +#define DDR_PHY_ZQ2SR_1 0x5c1106dc +#define DDR_PHY_ZQ3PR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1B9U)) +#define DDR_PHY_ZQ3PR0_0 0x5c0106e4 +#define DDR_PHY_ZQ3PR0_1 0x5c1106e4 +#define DDR_PHY_ZQ3PR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BAU)) +#define DDR_PHY_ZQ3PR1_0 0x5c0106e8 +#define DDR_PHY_ZQ3PR1_1 0x5c1106e8 +#define DDR_PHY_ZQ3DR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BBU)) +#define DDR_PHY_ZQ3DR0_0 0x5c0106ec +#define DDR_PHY_ZQ3DR0_1 0x5c1106ec +#define DDR_PHY_ZQ3DR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BCU)) +#define DDR_PHY_ZQ3DR1_0 0x5c0106f0 +#define DDR_PHY_ZQ3DR1_1 0x5c1106f0 +#define DDR_PHY_ZQ3OR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BDU)) +#define DDR_PHY_ZQ3OR0_0 0x5c0106f4 +#define DDR_PHY_ZQ3OR0_1 0x5c1106f4 +#define DDR_PHY_ZQ3OR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BEU)) +#define DDR_PHY_ZQ3OR1_0 0x5c0106f8 +#define DDR_PHY_ZQ3OR1_1 0x5c1106f8 +#define DDR_PHY_ZQ3SR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1BFU)) +#define DDR_PHY_ZQ3SR_0 0x5c0106fc +#define DDR_PHY_ZQ3SR_1 0x5c1106fc +#define DDR_PHY_DX0GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C0U)) +#define DDR_PHY_DX0GCR0_0 0x5c010700 +#define DDR_PHY_DX0GCR0_1 0x5c110700 +#define DDR_PHY_DX0GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C1U)) +#define DDR_PHY_DX0GCR1_0 0x5c010704 +#define DDR_PHY_DX0GCR1_1 0x5c110704 +#define DDR_PHY_DX0GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C2U)) +#define DDR_PHY_DX0GCR2_0 0x5c010708 +#define DDR_PHY_DX0GCR2_1 0x5c110708 +#define DDR_PHY_DX0GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C3U)) +#define DDR_PHY_DX0GCR3_0 0x5c01070c +#define DDR_PHY_DX0GCR3_1 0x5c11070c +#define DDR_PHY_DX0GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C4U)) +#define DDR_PHY_DX0GCR4_0 0x5c010710 +#define DDR_PHY_DX0GCR4_1 0x5c110710 +#define DDR_PHY_DX0GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C5U)) +#define DDR_PHY_DX0GCR5_0 0x5c010714 +#define DDR_PHY_DX0GCR5_1 0x5c110714 +#define DDR_PHY_DX0GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C6U)) +#define DDR_PHY_DX0GCR6_0 0x5c010718 +#define DDR_PHY_DX0GCR6_1 0x5c110718 +#define DDR_PHY_DX0GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C7U)) +#define DDR_PHY_DX0GCR7_0 0x5c01071c +#define DDR_PHY_DX0GCR7_1 0x5c11071c +#define DDR_PHY_DX0GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C8U)) +#define DDR_PHY_DX0GCR8_0 0x5c010720 +#define DDR_PHY_DX0GCR8_1 0x5c110720 +#define DDR_PHY_DX0GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1C9U)) +#define DDR_PHY_DX0GCR9_0 0x5c010724 +#define DDR_PHY_DX0GCR9_1 0x5c110724 +#define DDR_PHY_DX0DQMAP0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1CAU)) +#define DDR_PHY_DX0DQMAP0_0 0x5c010728 +#define DDR_PHY_DX0DQMAP0_1 0x5c110728 +#define DDR_PHY_DX0DQMAP1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1CBU)) +#define DDR_PHY_DX0DQMAP1_0 0x5c01072c +#define DDR_PHY_DX0DQMAP1_1 0x5c11072c +#define DDR_PHY_DX0BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D0U)) +#define DDR_PHY_DX0BDLR0_0 0x5c010740 +#define DDR_PHY_DX0BDLR0_1 0x5c110740 +#define DDR_PHY_DX0BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D1U)) +#define DDR_PHY_DX0BDLR1_0 0x5c010744 +#define DDR_PHY_DX0BDLR1_1 0x5c110744 +#define DDR_PHY_DX0BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D2U)) +#define DDR_PHY_DX0BDLR2_0 0x5c010748 +#define DDR_PHY_DX0BDLR2_1 0x5c110748 +#define DDR_PHY_DX0BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D4U)) +#define DDR_PHY_DX0BDLR3_0 0x5c010750 +#define DDR_PHY_DX0BDLR3_1 0x5c110750 +#define DDR_PHY_DX0BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D5U)) +#define DDR_PHY_DX0BDLR4_0 0x5c010754 +#define DDR_PHY_DX0BDLR4_1 0x5c110754 +#define DDR_PHY_DX0BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D6U)) +#define DDR_PHY_DX0BDLR5_0 0x5c010758 +#define DDR_PHY_DX0BDLR5_1 0x5c110758 +#define DDR_PHY_DX0BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D8U)) +#define DDR_PHY_DX0BDLR6_0 0x5c010760 +#define DDR_PHY_DX0BDLR6_1 0x5c110760 +#define DDR_PHY_DX0BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1D9U)) +#define DDR_PHY_DX0BDLR7_0 0x5c010764 +#define DDR_PHY_DX0BDLR7_1 0x5c110764 +#define DDR_PHY_DX0BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1DAU)) +#define DDR_PHY_DX0BDLR8_0 0x5c010768 +#define DDR_PHY_DX0BDLR8_1 0x5c110768 +#define DDR_PHY_DX0BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1DBU)) +#define DDR_PHY_DX0BDLR9_0 0x5c01076c +#define DDR_PHY_DX0BDLR9_1 0x5c11076c +#define DDR_PHY_DX0LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E0U)) +#define DDR_PHY_DX0LCDLR0_0 0x5c010780 +#define DDR_PHY_DX0LCDLR0_1 0x5c110780 +#define DDR_PHY_DX0LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E1U)) +#define DDR_PHY_DX0LCDLR1_0 0x5c010784 +#define DDR_PHY_DX0LCDLR1_1 0x5c110784 +#define DDR_PHY_DX0LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E2U)) +#define DDR_PHY_DX0LCDLR2_0 0x5c010788 +#define DDR_PHY_DX0LCDLR2_1 0x5c110788 +#define DDR_PHY_DX0LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E3U)) +#define DDR_PHY_DX0LCDLR3_0 0x5c01078c +#define DDR_PHY_DX0LCDLR3_1 0x5c11078c +#define DDR_PHY_DX0LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E4U)) +#define DDR_PHY_DX0LCDLR4_0 0x5c010790 +#define DDR_PHY_DX0LCDLR4_1 0x5c110790 +#define DDR_PHY_DX0LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E5U)) +#define DDR_PHY_DX0LCDLR5_0 0x5c010794 +#define DDR_PHY_DX0LCDLR5_1 0x5c110794 +#define DDR_PHY_DX0MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E8U)) +#define DDR_PHY_DX0MDLR0_0 0x5c0107a0 +#define DDR_PHY_DX0MDLR0_1 0x5c1107a0 +#define DDR_PHY_DX0MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1E9U)) +#define DDR_PHY_DX0MDLR1_0 0x5c0107a4 +#define DDR_PHY_DX0MDLR1_1 0x5c1107a4 +#define DDR_PHY_DX0GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F0U)) +#define DDR_PHY_DX0GTR0_0 0x5c0107c0 +#define DDR_PHY_DX0GTR0_1 0x5c1107c0 +#define DDR_PHY_DX0RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F4U)) +#define DDR_PHY_DX0RSR0_0 0x5c0107d0 +#define DDR_PHY_DX0RSR0_1 0x5c1107d0 +#define DDR_PHY_DX0RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F5U)) +#define DDR_PHY_DX0RSR1_0 0x5c0107d4 +#define DDR_PHY_DX0RSR1_1 0x5c1107d4 +#define DDR_PHY_DX0RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F6U)) +#define DDR_PHY_DX0RSR2_0 0x5c0107d8 +#define DDR_PHY_DX0RSR2_1 0x5c1107d8 +#define DDR_PHY_DX0RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F7U)) +#define DDR_PHY_DX0RSR3_0 0x5c0107dc +#define DDR_PHY_DX0RSR3_1 0x5c1107dc +#define DDR_PHY_DX0GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F8U)) +#define DDR_PHY_DX0GSR0_0 0x5c0107e0 +#define DDR_PHY_DX0GSR0_1 0x5c1107e0 +#define DDR_PHY_DX0GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1F9U)) +#define DDR_PHY_DX0GSR1_0 0x5c0107e4 +#define DDR_PHY_DX0GSR1_1 0x5c1107e4 +#define DDR_PHY_DX0GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1FAU)) +#define DDR_PHY_DX0GSR2_0 0x5c0107e8 +#define DDR_PHY_DX0GSR2_1 0x5c1107e8 +#define DDR_PHY_DX0GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1FBU)) +#define DDR_PHY_DX0GSR3_0 0x5c0107ec +#define DDR_PHY_DX0GSR3_1 0x5c1107ec +#define DDR_PHY_DX0GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1FCU)) +#define DDR_PHY_DX0GSR4_0 0x5c0107f0 +#define DDR_PHY_DX0GSR4_1 0x5c1107f0 +#define DDR_PHY_DX0GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1FDU)) +#define DDR_PHY_DX0GSR5_0 0x5c0107f4 +#define DDR_PHY_DX0GSR5_1 0x5c1107f4 +#define DDR_PHY_DX0GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x1FEU)) +#define DDR_PHY_DX0GSR6_0 0x5c0107f8 +#define DDR_PHY_DX0GSR6_1 0x5c1107f8 +#define DDR_PHY_DX1GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x200U)) +#define DDR_PHY_DX1GCR0_0 0x5c010800 +#define DDR_PHY_DX1GCR0_1 0x5c110800 +#define DDR_PHY_DX1GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x201U)) +#define DDR_PHY_DX1GCR1_0 0x5c010804 +#define DDR_PHY_DX1GCR1_1 0x5c110804 +#define DDR_PHY_DX1GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x202U)) +#define DDR_PHY_DX1GCR2_0 0x5c010808 +#define DDR_PHY_DX1GCR2_1 0x5c110808 +#define DDR_PHY_DX1GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x203U)) +#define DDR_PHY_DX1GCR3_0 0x5c01080c +#define DDR_PHY_DX1GCR3_1 0x5c11080c +#define DDR_PHY_DX1GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x204U)) +#define DDR_PHY_DX1GCR4_0 0x5c010810 +#define DDR_PHY_DX1GCR4_1 0x5c110810 +#define DDR_PHY_DX1GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x205U)) +#define DDR_PHY_DX1GCR5_0 0x5c010814 +#define DDR_PHY_DX1GCR5_1 0x5c110814 +#define DDR_PHY_DX1GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x206U)) +#define DDR_PHY_DX1GCR6_0 0x5c010818 +#define DDR_PHY_DX1GCR6_1 0x5c110818 +#define DDR_PHY_DX1GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x207U)) +#define DDR_PHY_DX1GCR7_0 0x5c01081c +#define DDR_PHY_DX1GCR7_1 0x5c11081c +#define DDR_PHY_DX1GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x208U)) +#define DDR_PHY_DX1GCR8_0 0x5c010820 +#define DDR_PHY_DX1GCR8_1 0x5c110820 +#define DDR_PHY_DX1GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x209U)) +#define DDR_PHY_DX1GCR9_0 0x5c010824 +#define DDR_PHY_DX1GCR9_1 0x5c110824 +#define DDR_PHY_DX1DQMAP0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x20AU)) +#define DDR_PHY_DX1DQMAP0_0 0x5c010828 +#define DDR_PHY_DX1DQMAP0_1 0x5c110828 +#define DDR_PHY_DX1DQMAP1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x20BU)) +#define DDR_PHY_DX1DQMAP1_0 0x5c01082c +#define DDR_PHY_DX1DQMAP1_1 0x5c11082c +#define DDR_PHY_DX1BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x210U)) +#define DDR_PHY_DX1BDLR0_0 0x5c010840 +#define DDR_PHY_DX1BDLR0_1 0x5c110840 +#define DDR_PHY_DX1BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x211U)) +#define DDR_PHY_DX1BDLR1_0 0x5c010844 +#define DDR_PHY_DX1BDLR1_1 0x5c110844 +#define DDR_PHY_DX1BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x212U)) +#define DDR_PHY_DX1BDLR2_0 0x5c010848 +#define DDR_PHY_DX1BDLR2_1 0x5c110848 +#define DDR_PHY_DX1BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x214U)) +#define DDR_PHY_DX1BDLR3_0 0x5c010850 +#define DDR_PHY_DX1BDLR3_1 0x5c110850 +#define DDR_PHY_DX1BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x215U)) +#define DDR_PHY_DX1BDLR4_0 0x5c010854 +#define DDR_PHY_DX1BDLR4_1 0x5c110854 +#define DDR_PHY_DX1BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x216U)) +#define DDR_PHY_DX1BDLR5_0 0x5c010858 +#define DDR_PHY_DX1BDLR5_1 0x5c110858 +#define DDR_PHY_DX1BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x218U)) +#define DDR_PHY_DX1BDLR6_0 0x5c010860 +#define DDR_PHY_DX1BDLR6_1 0x5c110860 +#define DDR_PHY_DX1BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x219U)) +#define DDR_PHY_DX1BDLR7_0 0x5c010864 +#define DDR_PHY_DX1BDLR7_1 0x5c110864 +#define DDR_PHY_DX1BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x21AU)) +#define DDR_PHY_DX1BDLR8_0 0x5c010868 +#define DDR_PHY_DX1BDLR8_1 0x5c110868 +#define DDR_PHY_DX1BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x21BU)) +#define DDR_PHY_DX1BDLR9_0 0x5c01086c +#define DDR_PHY_DX1BDLR9_1 0x5c11086c +#define DDR_PHY_DX1LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x220U)) +#define DDR_PHY_DX1LCDLR0_0 0x5c010880 +#define DDR_PHY_DX1LCDLR0_1 0x5c110880 +#define DDR_PHY_DX1LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x221U)) +#define DDR_PHY_DX1LCDLR1_0 0x5c010884 +#define DDR_PHY_DX1LCDLR1_1 0x5c110884 +#define DDR_PHY_DX1LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x222U)) +#define DDR_PHY_DX1LCDLR2_0 0x5c010888 +#define DDR_PHY_DX1LCDLR2_1 0x5c110888 +#define DDR_PHY_DX1LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x223U)) +#define DDR_PHY_DX1LCDLR3_0 0x5c01088c +#define DDR_PHY_DX1LCDLR3_1 0x5c11088c +#define DDR_PHY_DX1LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x224U)) +#define DDR_PHY_DX1LCDLR4_0 0x5c010890 +#define DDR_PHY_DX1LCDLR4_1 0x5c110890 +#define DDR_PHY_DX1LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x225U)) +#define DDR_PHY_DX1LCDLR5_0 0x5c010894 +#define DDR_PHY_DX1LCDLR5_1 0x5c110894 +#define DDR_PHY_DX1MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x228U)) +#define DDR_PHY_DX1MDLR0_0 0x5c0108a0 +#define DDR_PHY_DX1MDLR0_1 0x5c1108a0 +#define DDR_PHY_DX1MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x229U)) +#define DDR_PHY_DX1MDLR1_0 0x5c0108a4 +#define DDR_PHY_DX1MDLR1_1 0x5c1108a4 +#define DDR_PHY_DX1GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x230U)) +#define DDR_PHY_DX1GTR0_0 0x5c0108c0 +#define DDR_PHY_DX1GTR0_1 0x5c1108c0 +#define DDR_PHY_DX1RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x234U)) +#define DDR_PHY_DX1RSR0_0 0x5c0108d0 +#define DDR_PHY_DX1RSR0_1 0x5c1108d0 +#define DDR_PHY_DX1RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x235U)) +#define DDR_PHY_DX1RSR1_0 0x5c0108d4 +#define DDR_PHY_DX1RSR1_1 0x5c1108d4 +#define DDR_PHY_DX1RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x236U)) +#define DDR_PHY_DX1RSR2_0 0x5c0108d8 +#define DDR_PHY_DX1RSR2_1 0x5c1108d8 +#define DDR_PHY_DX1RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x237U)) +#define DDR_PHY_DX1RSR3_0 0x5c0108dc +#define DDR_PHY_DX1RSR3_1 0x5c1108dc +#define DDR_PHY_DX1GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x238U)) +#define DDR_PHY_DX1GSR0_0 0x5c0108e0 +#define DDR_PHY_DX1GSR0_1 0x5c1108e0 +#define DDR_PHY_DX1GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x239U)) +#define DDR_PHY_DX1GSR1_0 0x5c0108e4 +#define DDR_PHY_DX1GSR1_1 0x5c1108e4 +#define DDR_PHY_DX1GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x23AU)) +#define DDR_PHY_DX1GSR2_0 0x5c0108e8 +#define DDR_PHY_DX1GSR2_1 0x5c1108e8 +#define DDR_PHY_DX1GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x23BU)) +#define DDR_PHY_DX1GSR3_0 0x5c0108ec +#define DDR_PHY_DX1GSR3_1 0x5c1108ec +#define DDR_PHY_DX1GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x23CU)) +#define DDR_PHY_DX1GSR4_0 0x5c0108f0 +#define DDR_PHY_DX1GSR4_1 0x5c1108f0 +#define DDR_PHY_DX1GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x23DU)) +#define DDR_PHY_DX1GSR5_0 0x5c0108f4 +#define DDR_PHY_DX1GSR5_1 0x5c1108f4 +#define DDR_PHY_DX1GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x23EU)) +#define DDR_PHY_DX1GSR6_0 0x5c0108f8 +#define DDR_PHY_DX1GSR6_1 0x5c1108f8 +#define DDR_PHY_DX2GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x240U)) +#define DDR_PHY_DX2GCR0_0 0x5c010900 +#define DDR_PHY_DX2GCR0_1 0x5c110900 +#define DDR_PHY_DX2GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x241U)) +#define DDR_PHY_DX2GCR1_0 0x5c010904 +#define DDR_PHY_DX2GCR1_1 0x5c110904 +#define DDR_PHY_DX2GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x242U)) +#define DDR_PHY_DX2GCR2_0 0x5c010908 +#define DDR_PHY_DX2GCR2_1 0x5c110908 +#define DDR_PHY_DX2GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x243U)) +#define DDR_PHY_DX2GCR3_0 0x5c01090c +#define DDR_PHY_DX2GCR3_1 0x5c11090c +#define DDR_PHY_DX2GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x244U)) +#define DDR_PHY_DX2GCR4_0 0x5c010910 +#define DDR_PHY_DX2GCR4_1 0x5c110910 +#define DDR_PHY_DX2GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x245U)) +#define DDR_PHY_DX2GCR5_0 0x5c010914 +#define DDR_PHY_DX2GCR5_1 0x5c110914 +#define DDR_PHY_DX2GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x246U)) +#define DDR_PHY_DX2GCR6_0 0x5c010918 +#define DDR_PHY_DX2GCR6_1 0x5c110918 +#define DDR_PHY_DX2GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x247U)) +#define DDR_PHY_DX2GCR7_0 0x5c01091c +#define DDR_PHY_DX2GCR7_1 0x5c11091c +#define DDR_PHY_DX2GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x248U)) +#define DDR_PHY_DX2GCR8_0 0x5c010920 +#define DDR_PHY_DX2GCR8_1 0x5c110920 +#define DDR_PHY_DX2GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x249U)) +#define DDR_PHY_DX2GCR9_0 0x5c010924 +#define DDR_PHY_DX2GCR9_1 0x5c110924 +#define DDR_PHY_DX2DQMAP0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x24AU)) +#define DDR_PHY_DX2DQMAP0_0 0x5c010928 +#define DDR_PHY_DX2DQMAP0_1 0x5c110928 +#define DDR_PHY_DX2DQMAP1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x24BU)) +#define DDR_PHY_DX2DQMAP1_0 0x5c01092c +#define DDR_PHY_DX2DQMAP1_1 0x5c11092c +#define DDR_PHY_DX2BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x250U)) +#define DDR_PHY_DX2BDLR0_0 0x5c010940 +#define DDR_PHY_DX2BDLR0_1 0x5c110940 +#define DDR_PHY_DX2BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x251U)) +#define DDR_PHY_DX2BDLR1_0 0x5c010944 +#define DDR_PHY_DX2BDLR1_1 0x5c110944 +#define DDR_PHY_DX2BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x252U)) +#define DDR_PHY_DX2BDLR2_0 0x5c010948 +#define DDR_PHY_DX2BDLR2_1 0x5c110948 +#define DDR_PHY_DX2BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x254U)) +#define DDR_PHY_DX2BDLR3_0 0x5c010950 +#define DDR_PHY_DX2BDLR3_1 0x5c110950 +#define DDR_PHY_DX2BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x255U)) +#define DDR_PHY_DX2BDLR4_0 0x5c010954 +#define DDR_PHY_DX2BDLR4_1 0x5c110954 +#define DDR_PHY_DX2BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x256U)) +#define DDR_PHY_DX2BDLR5_0 0x5c010958 +#define DDR_PHY_DX2BDLR5_1 0x5c110958 +#define DDR_PHY_DX2BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x258U)) +#define DDR_PHY_DX2BDLR6_0 0x5c010960 +#define DDR_PHY_DX2BDLR6_1 0x5c110960 +#define DDR_PHY_DX2BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x259U)) +#define DDR_PHY_DX2BDLR7_0 0x5c010964 +#define DDR_PHY_DX2BDLR7_1 0x5c110964 +#define DDR_PHY_DX2BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x25AU)) +#define DDR_PHY_DX2BDLR8_0 0x5c010968 +#define DDR_PHY_DX2BDLR8_1 0x5c110968 +#define DDR_PHY_DX2BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x25BU)) +#define DDR_PHY_DX2BDLR9_0 0x5c01096c +#define DDR_PHY_DX2BDLR9_1 0x5c11096c +#define DDR_PHY_DX2LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x260U)) +#define DDR_PHY_DX2LCDLR0_0 0x5c010980 +#define DDR_PHY_DX2LCDLR0_1 0x5c110980 +#define DDR_PHY_DX2LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x261U)) +#define DDR_PHY_DX2LCDLR1_0 0x5c010984 +#define DDR_PHY_DX2LCDLR1_1 0x5c110984 +#define DDR_PHY_DX2LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x262U)) +#define DDR_PHY_DX2LCDLR2_0 0x5c010988 +#define DDR_PHY_DX2LCDLR2_1 0x5c110988 +#define DDR_PHY_DX2LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x263U)) +#define DDR_PHY_DX2LCDLR3_0 0x5c01098c +#define DDR_PHY_DX2LCDLR3_1 0x5c11098c +#define DDR_PHY_DX2LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x264U)) +#define DDR_PHY_DX2LCDLR4_0 0x5c010990 +#define DDR_PHY_DX2LCDLR4_1 0x5c110990 +#define DDR_PHY_DX2LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x265U)) +#define DDR_PHY_DX2LCDLR5_0 0x5c010994 +#define DDR_PHY_DX2LCDLR5_1 0x5c110994 +#define DDR_PHY_DX2MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x268U)) +#define DDR_PHY_DX2MDLR0_0 0x5c0109a0 +#define DDR_PHY_DX2MDLR0_1 0x5c1109a0 +#define DDR_PHY_DX2MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x269U)) +#define DDR_PHY_DX2MDLR1_0 0x5c0109a4 +#define DDR_PHY_DX2MDLR1_1 0x5c1109a4 +#define DDR_PHY_DX2GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x270U)) +#define DDR_PHY_DX2GTR0_0 0x5c0109c0 +#define DDR_PHY_DX2GTR0_1 0x5c1109c0 +#define DDR_PHY_DX2RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x274U)) +#define DDR_PHY_DX2RSR0_0 0x5c0109d0 +#define DDR_PHY_DX2RSR0_1 0x5c1109d0 +#define DDR_PHY_DX2RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x275U)) +#define DDR_PHY_DX2RSR1_0 0x5c0109d4 +#define DDR_PHY_DX2RSR1_1 0x5c1109d4 +#define DDR_PHY_DX2RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x276U)) +#define DDR_PHY_DX2RSR2_0 0x5c0109d8 +#define DDR_PHY_DX2RSR2_1 0x5c1109d8 +#define DDR_PHY_DX2RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x277U)) +#define DDR_PHY_DX2RSR3_0 0x5c0109dc +#define DDR_PHY_DX2RSR3_1 0x5c1109dc +#define DDR_PHY_DX2GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x278U)) +#define DDR_PHY_DX2GSR0_0 0x5c0109e0 +#define DDR_PHY_DX2GSR0_1 0x5c1109e0 +#define DDR_PHY_DX2GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x279U)) +#define DDR_PHY_DX2GSR1_0 0x5c0109e4 +#define DDR_PHY_DX2GSR1_1 0x5c1109e4 +#define DDR_PHY_DX2GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x27AU)) +#define DDR_PHY_DX2GSR2_0 0x5c0109e8 +#define DDR_PHY_DX2GSR2_1 0x5c1109e8 +#define DDR_PHY_DX2GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x27BU)) +#define DDR_PHY_DX2GSR3_0 0x5c0109ec +#define DDR_PHY_DX2GSR3_1 0x5c1109ec +#define DDR_PHY_DX2GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x27CU)) +#define DDR_PHY_DX2GSR4_0 0x5c0109f0 +#define DDR_PHY_DX2GSR4_1 0x5c1109f0 +#define DDR_PHY_DX2GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x27DU)) +#define DDR_PHY_DX2GSR5_0 0x5c0109f4 +#define DDR_PHY_DX2GSR5_1 0x5c1109f4 +#define DDR_PHY_DX2GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x27EU)) +#define DDR_PHY_DX2GSR6_0 0x5c0109f8 +#define DDR_PHY_DX2GSR6_1 0x5c1109f8 +#define DDR_PHY_DX3GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x280U)) +#define DDR_PHY_DX3GCR0_0 0x5c010a00 +#define DDR_PHY_DX3GCR0_1 0x5c110a00 +#define DDR_PHY_DX3GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x281U)) +#define DDR_PHY_DX3GCR1_0 0x5c010a04 +#define DDR_PHY_DX3GCR1_1 0x5c110a04 +#define DDR_PHY_DX3GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x282U)) +#define DDR_PHY_DX3GCR2_0 0x5c010a08 +#define DDR_PHY_DX3GCR2_1 0x5c110a08 +#define DDR_PHY_DX3GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x283U)) +#define DDR_PHY_DX3GCR3_0 0x5c010a0c +#define DDR_PHY_DX3GCR3_1 0x5c110a0c +#define DDR_PHY_DX3GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x284U)) +#define DDR_PHY_DX3GCR4_0 0x5c010a10 +#define DDR_PHY_DX3GCR4_1 0x5c110a10 +#define DDR_PHY_DX3GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x285U)) +#define DDR_PHY_DX3GCR5_0 0x5c010a14 +#define DDR_PHY_DX3GCR5_1 0x5c110a14 +#define DDR_PHY_DX3GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x286U)) +#define DDR_PHY_DX3GCR6_0 0x5c010a18 +#define DDR_PHY_DX3GCR6_1 0x5c110a18 +#define DDR_PHY_DX3GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x287U)) +#define DDR_PHY_DX3GCR7_0 0x5c010a1c +#define DDR_PHY_DX3GCR7_1 0x5c110a1c +#define DDR_PHY_DX3GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x288U)) +#define DDR_PHY_DX3GCR8_0 0x5c010a20 +#define DDR_PHY_DX3GCR8_1 0x5c110a20 +#define DDR_PHY_DX3GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x289U)) +#define DDR_PHY_DX3GCR9_0 0x5c010a24 +#define DDR_PHY_DX3GCR9_1 0x5c110a24 +#define DDR_PHY_DX3DQMAP0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x28AU)) +#define DDR_PHY_DX3DQMAP0_0 0x5c010a28 +#define DDR_PHY_DX3DQMAP0_1 0x5c110a28 +#define DDR_PHY_DX3DQMAP1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x28BU)) +#define DDR_PHY_DX3DQMAP1_0 0x5c010a2c +#define DDR_PHY_DX3DQMAP1_1 0x5c110a2c +#define DDR_PHY_DX3BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x290U)) +#define DDR_PHY_DX3BDLR0_0 0x5c010a40 +#define DDR_PHY_DX3BDLR0_1 0x5c110a40 +#define DDR_PHY_DX3BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x291U)) +#define DDR_PHY_DX3BDLR1_0 0x5c010a44 +#define DDR_PHY_DX3BDLR1_1 0x5c110a44 +#define DDR_PHY_DX3BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x292U)) +#define DDR_PHY_DX3BDLR2_0 0x5c010a48 +#define DDR_PHY_DX3BDLR2_1 0x5c110a48 +#define DDR_PHY_DX3BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x294U)) +#define DDR_PHY_DX3BDLR3_0 0x5c010a50 +#define DDR_PHY_DX3BDLR3_1 0x5c110a50 +#define DDR_PHY_DX3BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x295U)) +#define DDR_PHY_DX3BDLR4_0 0x5c010a54 +#define DDR_PHY_DX3BDLR4_1 0x5c110a54 +#define DDR_PHY_DX3BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x296U)) +#define DDR_PHY_DX3BDLR5_0 0x5c010a58 +#define DDR_PHY_DX3BDLR5_1 0x5c110a58 +#define DDR_PHY_DX3BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x298U)) +#define DDR_PHY_DX3BDLR6_0 0x5c010a60 +#define DDR_PHY_DX3BDLR6_1 0x5c110a60 +#define DDR_PHY_DX3BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x299U)) +#define DDR_PHY_DX3BDLR7_0 0x5c010a64 +#define DDR_PHY_DX3BDLR7_1 0x5c110a64 +#define DDR_PHY_DX3BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x29AU)) +#define DDR_PHY_DX3BDLR8_0 0x5c010a68 +#define DDR_PHY_DX3BDLR8_1 0x5c110a68 +#define DDR_PHY_DX3BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x29BU)) +#define DDR_PHY_DX3BDLR9_0 0x5c010a6c +#define DDR_PHY_DX3BDLR9_1 0x5c110a6c +#define DDR_PHY_DX3LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A0U)) +#define DDR_PHY_DX3LCDLR0_0 0x5c010a80 +#define DDR_PHY_DX3LCDLR0_1 0x5c110a80 +#define DDR_PHY_DX3LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A1U)) +#define DDR_PHY_DX3LCDLR1_0 0x5c010a84 +#define DDR_PHY_DX3LCDLR1_1 0x5c110a84 +#define DDR_PHY_DX3LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A2U)) +#define DDR_PHY_DX3LCDLR2_0 0x5c010a88 +#define DDR_PHY_DX3LCDLR2_1 0x5c110a88 +#define DDR_PHY_DX3LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A3U)) +#define DDR_PHY_DX3LCDLR3_0 0x5c010a8c +#define DDR_PHY_DX3LCDLR3_1 0x5c110a8c +#define DDR_PHY_DX3LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A4U)) +#define DDR_PHY_DX3LCDLR4_0 0x5c010a90 +#define DDR_PHY_DX3LCDLR4_1 0x5c110a90 +#define DDR_PHY_DX3LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A5U)) +#define DDR_PHY_DX3LCDLR5_0 0x5c010a94 +#define DDR_PHY_DX3LCDLR5_1 0x5c110a94 +#define DDR_PHY_DX3MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A8U)) +#define DDR_PHY_DX3MDLR0_0 0x5c010aa0 +#define DDR_PHY_DX3MDLR0_1 0x5c110aa0 +#define DDR_PHY_DX3MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2A9U)) +#define DDR_PHY_DX3MDLR1_0 0x5c010aa4 +#define DDR_PHY_DX3MDLR1_1 0x5c110aa4 +#define DDR_PHY_DX3GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B0U)) +#define DDR_PHY_DX3GTR0_0 0x5c010ac0 +#define DDR_PHY_DX3GTR0_1 0x5c110ac0 +#define DDR_PHY_DX3RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B4U)) +#define DDR_PHY_DX3RSR0_0 0x5c010ad0 +#define DDR_PHY_DX3RSR0_1 0x5c110ad0 +#define DDR_PHY_DX3RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B5U)) +#define DDR_PHY_DX3RSR1_0 0x5c010ad4 +#define DDR_PHY_DX3RSR1_1 0x5c110ad4 +#define DDR_PHY_DX3RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B6U)) +#define DDR_PHY_DX3RSR2_0 0x5c010ad8 +#define DDR_PHY_DX3RSR2_1 0x5c110ad8 +#define DDR_PHY_DX3RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B7U)) +#define DDR_PHY_DX3RSR3_0 0x5c010adc +#define DDR_PHY_DX3RSR3_1 0x5c110adc +#define DDR_PHY_DX3GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B8U)) +#define DDR_PHY_DX3GSR0_0 0x5c010ae0 +#define DDR_PHY_DX3GSR0_1 0x5c110ae0 +#define DDR_PHY_DX3GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2B9U)) +#define DDR_PHY_DX3GSR1_0 0x5c010ae4 +#define DDR_PHY_DX3GSR1_1 0x5c110ae4 +#define DDR_PHY_DX3GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2BAU)) +#define DDR_PHY_DX3GSR2_0 0x5c010ae8 +#define DDR_PHY_DX3GSR2_1 0x5c110ae8 +#define DDR_PHY_DX3GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2BBU)) +#define DDR_PHY_DX3GSR3_0 0x5c010aec +#define DDR_PHY_DX3GSR3_1 0x5c110aec +#define DDR_PHY_DX3GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2BCU)) +#define DDR_PHY_DX3GSR4_0 0x5c010af0 +#define DDR_PHY_DX3GSR4_1 0x5c110af0 +#define DDR_PHY_DX3GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2BDU)) +#define DDR_PHY_DX3GSR5_0 0x5c010af4 +#define DDR_PHY_DX3GSR5_1 0x5c110af4 +#define DDR_PHY_DX3GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2BEU)) +#define DDR_PHY_DX3GSR6_0 0x5c010af8 +#define DDR_PHY_DX3GSR6_1 0x5c110af8 +#define DDR_PHY_DX4GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C0U)) +#define DDR_PHY_DX4GCR0_0 0x5c010b00 +#define DDR_PHY_DX4GCR0_1 0x5c110b00 +#define DDR_PHY_DX4GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C1U)) +#define DDR_PHY_DX4GCR1_0 0x5c010b04 +#define DDR_PHY_DX4GCR1_1 0x5c110b04 +#define DDR_PHY_DX4GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C2U)) +#define DDR_PHY_DX4GCR2_0 0x5c010b08 +#define DDR_PHY_DX4GCR2_1 0x5c110b08 +#define DDR_PHY_DX4GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C3U)) +#define DDR_PHY_DX4GCR3_0 0x5c010b0c +#define DDR_PHY_DX4GCR3_1 0x5c110b0c +#define DDR_PHY_DX4GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C4U)) +#define DDR_PHY_DX4GCR4_0 0x5c010b10 +#define DDR_PHY_DX4GCR4_1 0x5c110b10 +#define DDR_PHY_DX4GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C5U)) +#define DDR_PHY_DX4GCR5_0 0x5c010b14 +#define DDR_PHY_DX4GCR5_1 0x5c110b14 +#define DDR_PHY_DX4GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C6U)) +#define DDR_PHY_DX4GCR6_0 0x5c010b18 +#define DDR_PHY_DX4GCR6_1 0x5c110b18 +#define DDR_PHY_DX4GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C7U)) +#define DDR_PHY_DX4GCR7_0 0x5c010b1c +#define DDR_PHY_DX4GCR7_1 0x5c110b1c +#define DDR_PHY_DX4GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C8U)) +#define DDR_PHY_DX4GCR8_0 0x5c010b20 +#define DDR_PHY_DX4GCR8_1 0x5c110b20 +#define DDR_PHY_DX4GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2C9U)) +#define DDR_PHY_DX4GCR9_0 0x5c010b24 +#define DDR_PHY_DX4GCR9_1 0x5c110b24 +#define DDR_PHY_DX4DQMAP0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2CAU)) +#define DDR_PHY_DX4DQMAP0_0 0x5c010b28 +#define DDR_PHY_DX4DQMAP0_1 0x5c110b28 +#define DDR_PHY_DX4DQMAP1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2CBU)) +#define DDR_PHY_DX4DQMAP1_0 0x5c010b2c +#define DDR_PHY_DX4DQMAP1_1 0x5c110b2c +#define DDR_PHY_DX4BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D0U)) +#define DDR_PHY_DX4BDLR0_0 0x5c010b40 +#define DDR_PHY_DX4BDLR0_1 0x5c110b40 +#define DDR_PHY_DX4BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D1U)) +#define DDR_PHY_DX4BDLR1_0 0x5c010b44 +#define DDR_PHY_DX4BDLR1_1 0x5c110b44 +#define DDR_PHY_DX4BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D2U)) +#define DDR_PHY_DX4BDLR2_0 0x5c010b48 +#define DDR_PHY_DX4BDLR2_1 0x5c110b48 +#define DDR_PHY_DX4BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D4U)) +#define DDR_PHY_DX4BDLR3_0 0x5c010b50 +#define DDR_PHY_DX4BDLR3_1 0x5c110b50 +#define DDR_PHY_DX4BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D5U)) +#define DDR_PHY_DX4BDLR4_0 0x5c010b54 +#define DDR_PHY_DX4BDLR4_1 0x5c110b54 +#define DDR_PHY_DX4BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D6U)) +#define DDR_PHY_DX4BDLR5_0 0x5c010b58 +#define DDR_PHY_DX4BDLR5_1 0x5c110b58 +#define DDR_PHY_DX4BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D8U)) +#define DDR_PHY_DX4BDLR6_0 0x5c010b60 +#define DDR_PHY_DX4BDLR6_1 0x5c110b60 +#define DDR_PHY_DX4BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2D9U)) +#define DDR_PHY_DX4BDLR7_0 0x5c010b64 +#define DDR_PHY_DX4BDLR7_1 0x5c110b64 +#define DDR_PHY_DX4BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2DAU)) +#define DDR_PHY_DX4BDLR8_0 0x5c010b68 +#define DDR_PHY_DX4BDLR8_1 0x5c110b68 +#define DDR_PHY_DX4BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2DBU)) +#define DDR_PHY_DX4BDLR9_0 0x5c010b6c +#define DDR_PHY_DX4BDLR9_1 0x5c110b6c +#define DDR_PHY_DX4LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E0U)) +#define DDR_PHY_DX4LCDLR0_0 0x5c010b80 +#define DDR_PHY_DX4LCDLR0_1 0x5c110b80 +#define DDR_PHY_DX4LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E1U)) +#define DDR_PHY_DX4LCDLR1_0 0x5c010b84 +#define DDR_PHY_DX4LCDLR1_1 0x5c110b84 +#define DDR_PHY_DX4LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E2U)) +#define DDR_PHY_DX4LCDLR2_0 0x5c010b88 +#define DDR_PHY_DX4LCDLR2_1 0x5c110b88 +#define DDR_PHY_DX4LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E3U)) +#define DDR_PHY_DX4LCDLR3_0 0x5c010b8c +#define DDR_PHY_DX4LCDLR3_1 0x5c110b8c +#define DDR_PHY_DX4LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E4U)) +#define DDR_PHY_DX4LCDLR4_0 0x5c010b90 +#define DDR_PHY_DX4LCDLR4_1 0x5c110b90 +#define DDR_PHY_DX4LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E5U)) +#define DDR_PHY_DX4LCDLR5_0 0x5c010b94 +#define DDR_PHY_DX4LCDLR5_1 0x5c110b94 +#define DDR_PHY_DX4MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E8U)) +#define DDR_PHY_DX4MDLR0_0 0x5c010ba0 +#define DDR_PHY_DX4MDLR0_1 0x5c110ba0 +#define DDR_PHY_DX4MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2E9U)) +#define DDR_PHY_DX4MDLR1_0 0x5c010ba4 +#define DDR_PHY_DX4MDLR1_1 0x5c110ba4 +#define DDR_PHY_DX4GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F0U)) +#define DDR_PHY_DX4GTR0_0 0x5c010bc0 +#define DDR_PHY_DX4GTR0_1 0x5c110bc0 +#define DDR_PHY_DX4RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F4U)) +#define DDR_PHY_DX4RSR0_0 0x5c010bd0 +#define DDR_PHY_DX4RSR0_1 0x5c110bd0 +#define DDR_PHY_DX4RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F5U)) +#define DDR_PHY_DX4RSR1_0 0x5c010bd4 +#define DDR_PHY_DX4RSR1_1 0x5c110bd4 +#define DDR_PHY_DX4RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F6U)) +#define DDR_PHY_DX4RSR2_0 0x5c010bd8 +#define DDR_PHY_DX4RSR2_1 0x5c110bd8 +#define DDR_PHY_DX4RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F7U)) +#define DDR_PHY_DX4RSR3_0 0x5c010bdc +#define DDR_PHY_DX4RSR3_1 0x5c110bdc +#define DDR_PHY_DX4GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F8U)) +#define DDR_PHY_DX4GSR0_0 0x5c010be0 +#define DDR_PHY_DX4GSR0_1 0x5c110be0 +#define DDR_PHY_DX4GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2F9U)) +#define DDR_PHY_DX4GSR1_0 0x5c010be4 +#define DDR_PHY_DX4GSR1_1 0x5c110be4 +#define DDR_PHY_DX4GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2FAU)) +#define DDR_PHY_DX4GSR2_0 0x5c010be8 +#define DDR_PHY_DX4GSR2_1 0x5c110be8 +#define DDR_PHY_DX4GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2FBU)) +#define DDR_PHY_DX4GSR3_0 0x5c010bec +#define DDR_PHY_DX4GSR3_1 0x5c110bec +#define DDR_PHY_DX4GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2FCU)) +#define DDR_PHY_DX4GSR4_0 0x5c010bf0 +#define DDR_PHY_DX4GSR4_1 0x5c110bf0 +#define DDR_PHY_DX4GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2FDU)) +#define DDR_PHY_DX4GSR5_0 0x5c010bf4 +#define DDR_PHY_DX4GSR5_1 0x5c110bf4 +#define DDR_PHY_DX4GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x2FEU)) +#define DDR_PHY_DX4GSR6_0 0x5c010bf8 +#define DDR_PHY_DX4GSR6_1 0x5c110bf8 +#define DDR_PHY_DX5GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x300U)) +#define DDR_PHY_DX5GCR0_0 0x5c010c00 +#define DDR_PHY_DX5GCR0_1 0x5c110c00 +#define DDR_PHY_DX5GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x301U)) +#define DDR_PHY_DX5GCR1_0 0x5c010c04 +#define DDR_PHY_DX5GCR1_1 0x5c110c04 +#define DDR_PHY_DX5GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x302U)) +#define DDR_PHY_DX5GCR2_0 0x5c010c08 +#define DDR_PHY_DX5GCR2_1 0x5c110c08 +#define DDR_PHY_DX5GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x303U)) +#define DDR_PHY_DX5GCR3_0 0x5c010c0c +#define DDR_PHY_DX5GCR3_1 0x5c110c0c +#define DDR_PHY_DX5GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x304U)) +#define DDR_PHY_DX5GCR4_0 0x5c010c10 +#define DDR_PHY_DX5GCR4_1 0x5c110c10 +#define DDR_PHY_DX5GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x305U)) +#define DDR_PHY_DX5GCR5_0 0x5c010c14 +#define DDR_PHY_DX5GCR5_1 0x5c110c14 +#define DDR_PHY_DX5GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x306U)) +#define DDR_PHY_DX5GCR6_0 0x5c010c18 +#define DDR_PHY_DX5GCR6_1 0x5c110c18 +#define DDR_PHY_DX5GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x307U)) +#define DDR_PHY_DX5GCR7_0 0x5c010c1c +#define DDR_PHY_DX5GCR7_1 0x5c110c1c +#define DDR_PHY_DX5GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x308U)) +#define DDR_PHY_DX5GCR8_0 0x5c010c20 +#define DDR_PHY_DX5GCR8_1 0x5c110c20 +#define DDR_PHY_DX5GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x309U)) +#define DDR_PHY_DX5GCR9_0 0x5c010c24 +#define DDR_PHY_DX5GCR9_1 0x5c110c24 +#define DDR_PHY_DX5BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x310U)) +#define DDR_PHY_DX5BDLR0_0 0x5c010c40 +#define DDR_PHY_DX5BDLR0_1 0x5c110c40 +#define DDR_PHY_DX5BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x311U)) +#define DDR_PHY_DX5BDLR1_0 0x5c010c44 +#define DDR_PHY_DX5BDLR1_1 0x5c110c44 +#define DDR_PHY_DX5BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x312U)) +#define DDR_PHY_DX5BDLR2_0 0x5c010c48 +#define DDR_PHY_DX5BDLR2_1 0x5c110c48 +#define DDR_PHY_DX5BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x314U)) +#define DDR_PHY_DX5BDLR3_0 0x5c010c50 +#define DDR_PHY_DX5BDLR3_1 0x5c110c50 +#define DDR_PHY_DX5BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x315U)) +#define DDR_PHY_DX5BDLR4_0 0x5c010c54 +#define DDR_PHY_DX5BDLR4_1 0x5c110c54 +#define DDR_PHY_DX5BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x316U)) +#define DDR_PHY_DX5BDLR5_0 0x5c010c58 +#define DDR_PHY_DX5BDLR5_1 0x5c110c58 +#define DDR_PHY_DX5BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x318U)) +#define DDR_PHY_DX5BDLR6_0 0x5c010c60 +#define DDR_PHY_DX5BDLR6_1 0x5c110c60 +#define DDR_PHY_DX5BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x319U)) +#define DDR_PHY_DX5BDLR7_0 0x5c010c64 +#define DDR_PHY_DX5BDLR7_1 0x5c110c64 +#define DDR_PHY_DX5BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x31AU)) +#define DDR_PHY_DX5BDLR8_0 0x5c010c68 +#define DDR_PHY_DX5BDLR8_1 0x5c110c68 +#define DDR_PHY_DX5BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x31BU)) +#define DDR_PHY_DX5BDLR9_0 0x5c010c6c +#define DDR_PHY_DX5BDLR9_1 0x5c110c6c +#define DDR_PHY_DX5LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x320U)) +#define DDR_PHY_DX5LCDLR0_0 0x5c010c80 +#define DDR_PHY_DX5LCDLR0_1 0x5c110c80 +#define DDR_PHY_DX5LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x321U)) +#define DDR_PHY_DX5LCDLR1_0 0x5c010c84 +#define DDR_PHY_DX5LCDLR1_1 0x5c110c84 +#define DDR_PHY_DX5LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x322U)) +#define DDR_PHY_DX5LCDLR2_0 0x5c010c88 +#define DDR_PHY_DX5LCDLR2_1 0x5c110c88 +#define DDR_PHY_DX5LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x323U)) +#define DDR_PHY_DX5LCDLR3_0 0x5c010c8c +#define DDR_PHY_DX5LCDLR3_1 0x5c110c8c +#define DDR_PHY_DX5LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x324U)) +#define DDR_PHY_DX5LCDLR4_0 0x5c010c90 +#define DDR_PHY_DX5LCDLR4_1 0x5c110c90 +#define DDR_PHY_DX5LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x325U)) +#define DDR_PHY_DX5LCDLR5_0 0x5c010c94 +#define DDR_PHY_DX5LCDLR5_1 0x5c110c94 +#define DDR_PHY_DX5MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x328U)) +#define DDR_PHY_DX5MDLR0_0 0x5c010ca0 +#define DDR_PHY_DX5MDLR0_1 0x5c110ca0 +#define DDR_PHY_DX5MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x329U)) +#define DDR_PHY_DX5MDLR1_0 0x5c010ca4 +#define DDR_PHY_DX5MDLR1_1 0x5c110ca4 +#define DDR_PHY_DX5GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x330U)) +#define DDR_PHY_DX5GTR0_0 0x5c010cc0 +#define DDR_PHY_DX5GTR0_1 0x5c110cc0 +#define DDR_PHY_DX5RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x334U)) +#define DDR_PHY_DX5RSR0_0 0x5c010cd0 +#define DDR_PHY_DX5RSR0_1 0x5c110cd0 +#define DDR_PHY_DX5RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x335U)) +#define DDR_PHY_DX5RSR1_0 0x5c010cd4 +#define DDR_PHY_DX5RSR1_1 0x5c110cd4 +#define DDR_PHY_DX5RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x336U)) +#define DDR_PHY_DX5RSR2_0 0x5c010cd8 +#define DDR_PHY_DX5RSR2_1 0x5c110cd8 +#define DDR_PHY_DX5RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x337U)) +#define DDR_PHY_DX5RSR3_0 0x5c010cdc +#define DDR_PHY_DX5RSR3_1 0x5c110cdc +#define DDR_PHY_DX5GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x338U)) +#define DDR_PHY_DX5GSR0_0 0x5c010ce0 +#define DDR_PHY_DX5GSR0_1 0x5c110ce0 +#define DDR_PHY_DX5GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x339U)) +#define DDR_PHY_DX5GSR1_0 0x5c010ce4 +#define DDR_PHY_DX5GSR1_1 0x5c110ce4 +#define DDR_PHY_DX5GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x33AU)) +#define DDR_PHY_DX5GSR2_0 0x5c010ce8 +#define DDR_PHY_DX5GSR2_1 0x5c110ce8 +#define DDR_PHY_DX5GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x33BU)) +#define DDR_PHY_DX5GSR3_0 0x5c010cec +#define DDR_PHY_DX5GSR3_1 0x5c110cec +#define DDR_PHY_DX5GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x33CU)) +#define DDR_PHY_DX5GSR4_0 0x5c010cf0 +#define DDR_PHY_DX5GSR4_1 0x5c110cf0 +#define DDR_PHY_DX5GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x33DU)) +#define DDR_PHY_DX5GSR5_0 0x5c010cf4 +#define DDR_PHY_DX5GSR5_1 0x5c110cf4 +#define DDR_PHY_DX5GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x33EU)) +#define DDR_PHY_DX5GSR6_0 0x5c010cf8 +#define DDR_PHY_DX5GSR6_1 0x5c110cf8 +#define DDR_PHY_DX6GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x340U)) +#define DDR_PHY_DX6GCR0_0 0x5c010d00 +#define DDR_PHY_DX6GCR0_1 0x5c110d00 +#define DDR_PHY_DX6GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x341U)) +#define DDR_PHY_DX6GCR1_0 0x5c010d04 +#define DDR_PHY_DX6GCR1_1 0x5c110d04 +#define DDR_PHY_DX6GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x342U)) +#define DDR_PHY_DX6GCR2_0 0x5c010d08 +#define DDR_PHY_DX6GCR2_1 0x5c110d08 +#define DDR_PHY_DX6GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x343U)) +#define DDR_PHY_DX6GCR3_0 0x5c010d0c +#define DDR_PHY_DX6GCR3_1 0x5c110d0c +#define DDR_PHY_DX6GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x344U)) +#define DDR_PHY_DX6GCR4_0 0x5c010d10 +#define DDR_PHY_DX6GCR4_1 0x5c110d10 +#define DDR_PHY_DX6GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x345U)) +#define DDR_PHY_DX6GCR5_0 0x5c010d14 +#define DDR_PHY_DX6GCR5_1 0x5c110d14 +#define DDR_PHY_DX6GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x346U)) +#define DDR_PHY_DX6GCR6_0 0x5c010d18 +#define DDR_PHY_DX6GCR6_1 0x5c110d18 +#define DDR_PHY_DX6GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x347U)) +#define DDR_PHY_DX6GCR7_0 0x5c010d1c +#define DDR_PHY_DX6GCR7_1 0x5c110d1c +#define DDR_PHY_DX6GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x348U)) +#define DDR_PHY_DX6GCR8_0 0x5c010d20 +#define DDR_PHY_DX6GCR8_1 0x5c110d20 +#define DDR_PHY_DX6GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x349U)) +#define DDR_PHY_DX6GCR9_0 0x5c010d24 +#define DDR_PHY_DX6GCR9_1 0x5c110d24 +#define DDR_PHY_DX6BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x350U)) +#define DDR_PHY_DX6BDLR0_0 0x5c010d40 +#define DDR_PHY_DX6BDLR0_1 0x5c110d40 +#define DDR_PHY_DX6BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x351U)) +#define DDR_PHY_DX6BDLR1_0 0x5c010d44 +#define DDR_PHY_DX6BDLR1_1 0x5c110d44 +#define DDR_PHY_DX6BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x352U)) +#define DDR_PHY_DX6BDLR2_0 0x5c010d48 +#define DDR_PHY_DX6BDLR2_1 0x5c110d48 +#define DDR_PHY_DX6BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x354U)) +#define DDR_PHY_DX6BDLR3_0 0x5c010d50 +#define DDR_PHY_DX6BDLR3_1 0x5c110d50 +#define DDR_PHY_DX6BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x355U)) +#define DDR_PHY_DX6BDLR4_0 0x5c010d54 +#define DDR_PHY_DX6BDLR4_1 0x5c110d54 +#define DDR_PHY_DX6BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x356U)) +#define DDR_PHY_DX6BDLR5_0 0x5c010d58 +#define DDR_PHY_DX6BDLR5_1 0x5c110d58 +#define DDR_PHY_DX6BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x358U)) +#define DDR_PHY_DX6BDLR6_0 0x5c010d60 +#define DDR_PHY_DX6BDLR6_1 0x5c110d60 +#define DDR_PHY_DX6BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x359U)) +#define DDR_PHY_DX6BDLR7_0 0x5c010d64 +#define DDR_PHY_DX6BDLR7_1 0x5c110d64 +#define DDR_PHY_DX6BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x35AU)) +#define DDR_PHY_DX6BDLR8_0 0x5c010d68 +#define DDR_PHY_DX6BDLR8_1 0x5c110d68 +#define DDR_PHY_DX6BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x35BU)) +#define DDR_PHY_DX6BDLR9_0 0x5c010d6c +#define DDR_PHY_DX6BDLR9_1 0x5c110d6c +#define DDR_PHY_DX6LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x360U)) +#define DDR_PHY_DX6LCDLR0_0 0x5c010d80 +#define DDR_PHY_DX6LCDLR0_1 0x5c110d80 +#define DDR_PHY_DX6LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x361U)) +#define DDR_PHY_DX6LCDLR1_0 0x5c010d84 +#define DDR_PHY_DX6LCDLR1_1 0x5c110d84 +#define DDR_PHY_DX6LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x362U)) +#define DDR_PHY_DX6LCDLR2_0 0x5c010d88 +#define DDR_PHY_DX6LCDLR2_1 0x5c110d88 +#define DDR_PHY_DX6LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x363U)) +#define DDR_PHY_DX6LCDLR3_0 0x5c010d8c +#define DDR_PHY_DX6LCDLR3_1 0x5c110d8c +#define DDR_PHY_DX6LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x364U)) +#define DDR_PHY_DX6LCDLR4_0 0x5c010d90 +#define DDR_PHY_DX6LCDLR4_1 0x5c110d90 +#define DDR_PHY_DX6LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x365U)) +#define DDR_PHY_DX6LCDLR5_0 0x5c010d94 +#define DDR_PHY_DX6LCDLR5_1 0x5c110d94 +#define DDR_PHY_DX6MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x368U)) +#define DDR_PHY_DX6MDLR0_0 0x5c010da0 +#define DDR_PHY_DX6MDLR0_1 0x5c110da0 +#define DDR_PHY_DX6MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x369U)) +#define DDR_PHY_DX6MDLR1_0 0x5c010da4 +#define DDR_PHY_DX6MDLR1_1 0x5c110da4 +#define DDR_PHY_DX6GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x370U)) +#define DDR_PHY_DX6GTR0_0 0x5c010dc0 +#define DDR_PHY_DX6GTR0_1 0x5c110dc0 +#define DDR_PHY_DX6RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x374U)) +#define DDR_PHY_DX6RSR0_0 0x5c010dd0 +#define DDR_PHY_DX6RSR0_1 0x5c110dd0 +#define DDR_PHY_DX6RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x375U)) +#define DDR_PHY_DX6RSR1_0 0x5c010dd4 +#define DDR_PHY_DX6RSR1_1 0x5c110dd4 +#define DDR_PHY_DX6RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x376U)) +#define DDR_PHY_DX6RSR2_0 0x5c010dd8 +#define DDR_PHY_DX6RSR2_1 0x5c110dd8 +#define DDR_PHY_DX6RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x377U)) +#define DDR_PHY_DX6RSR3_0 0x5c010ddc +#define DDR_PHY_DX6RSR3_1 0x5c110ddc +#define DDR_PHY_DX6GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x378U)) +#define DDR_PHY_DX6GSR0_0 0x5c010de0 +#define DDR_PHY_DX6GSR0_1 0x5c110de0 +#define DDR_PHY_DX6GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x379U)) +#define DDR_PHY_DX6GSR1_0 0x5c010de4 +#define DDR_PHY_DX6GSR1_1 0x5c110de4 +#define DDR_PHY_DX6GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x37AU)) +#define DDR_PHY_DX6GSR2_0 0x5c010de8 +#define DDR_PHY_DX6GSR2_1 0x5c110de8 +#define DDR_PHY_DX6GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x37BU)) +#define DDR_PHY_DX6GSR3_0 0x5c010dec +#define DDR_PHY_DX6GSR3_1 0x5c110dec +#define DDR_PHY_DX6GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x37CU)) +#define DDR_PHY_DX6GSR4_0 0x5c010df0 +#define DDR_PHY_DX6GSR4_1 0x5c110df0 +#define DDR_PHY_DX6GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x37DU)) +#define DDR_PHY_DX6GSR5_0 0x5c010df4 +#define DDR_PHY_DX6GSR5_1 0x5c110df4 +#define DDR_PHY_DX6GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x37EU)) +#define DDR_PHY_DX6GSR6_0 0x5c010df8 +#define DDR_PHY_DX6GSR6_1 0x5c110df8 +#define DDR_PHY_DX7GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x380U)) +#define DDR_PHY_DX7GCR0_0 0x5c010e00 +#define DDR_PHY_DX7GCR0_1 0x5c110e00 +#define DDR_PHY_DX7GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x381U)) +#define DDR_PHY_DX7GCR1_0 0x5c010e04 +#define DDR_PHY_DX7GCR1_1 0x5c110e04 +#define DDR_PHY_DX7GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x382U)) +#define DDR_PHY_DX7GCR2_0 0x5c010e08 +#define DDR_PHY_DX7GCR2_1 0x5c110e08 +#define DDR_PHY_DX7GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x383U)) +#define DDR_PHY_DX7GCR3_0 0x5c010e0c +#define DDR_PHY_DX7GCR3_1 0x5c110e0c +#define DDR_PHY_DX7GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x384U)) +#define DDR_PHY_DX7GCR4_0 0x5c010e10 +#define DDR_PHY_DX7GCR4_1 0x5c110e10 +#define DDR_PHY_DX7GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x385U)) +#define DDR_PHY_DX7GCR5_0 0x5c010e14 +#define DDR_PHY_DX7GCR5_1 0x5c110e14 +#define DDR_PHY_DX7GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x386U)) +#define DDR_PHY_DX7GCR6_0 0x5c010e18 +#define DDR_PHY_DX7GCR6_1 0x5c110e18 +#define DDR_PHY_DX7GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x387U)) +#define DDR_PHY_DX7GCR7_0 0x5c010e1c +#define DDR_PHY_DX7GCR7_1 0x5c110e1c +#define DDR_PHY_DX7GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x388U)) +#define DDR_PHY_DX7GCR8_0 0x5c010e20 +#define DDR_PHY_DX7GCR8_1 0x5c110e20 +#define DDR_PHY_DX7GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x389U)) +#define DDR_PHY_DX7GCR9_0 0x5c010e24 +#define DDR_PHY_DX7GCR9_1 0x5c110e24 +#define DDR_PHY_DX7BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x390U)) +#define DDR_PHY_DX7BDLR0_0 0x5c010e40 +#define DDR_PHY_DX7BDLR0_1 0x5c110e40 +#define DDR_PHY_DX7BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x391U)) +#define DDR_PHY_DX7BDLR1_0 0x5c010e44 +#define DDR_PHY_DX7BDLR1_1 0x5c110e44 +#define DDR_PHY_DX7BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x392U)) +#define DDR_PHY_DX7BDLR2_0 0x5c010e48 +#define DDR_PHY_DX7BDLR2_1 0x5c110e48 +#define DDR_PHY_DX7BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x394U)) +#define DDR_PHY_DX7BDLR3_0 0x5c010e50 +#define DDR_PHY_DX7BDLR3_1 0x5c110e50 +#define DDR_PHY_DX7BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x395U)) +#define DDR_PHY_DX7BDLR4_0 0x5c010e54 +#define DDR_PHY_DX7BDLR4_1 0x5c110e54 +#define DDR_PHY_DX7BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x396U)) +#define DDR_PHY_DX7BDLR5_0 0x5c010e58 +#define DDR_PHY_DX7BDLR5_1 0x5c110e58 +#define DDR_PHY_DX7BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x398U)) +#define DDR_PHY_DX7BDLR6_0 0x5c010e60 +#define DDR_PHY_DX7BDLR6_1 0x5c110e60 +#define DDR_PHY_DX7BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x399U)) +#define DDR_PHY_DX7BDLR7_0 0x5c010e64 +#define DDR_PHY_DX7BDLR7_1 0x5c110e64 +#define DDR_PHY_DX7BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x39AU)) +#define DDR_PHY_DX7BDLR8_0 0x5c010e68 +#define DDR_PHY_DX7BDLR8_1 0x5c110e68 +#define DDR_PHY_DX7BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x39BU)) +#define DDR_PHY_DX7BDLR9_0 0x5c010e6c +#define DDR_PHY_DX7BDLR9_1 0x5c110e6c +#define DDR_PHY_DX7LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A0U)) +#define DDR_PHY_DX7LCDLR0_0 0x5c010e80 +#define DDR_PHY_DX7LCDLR0_1 0x5c110e80 +#define DDR_PHY_DX7LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A1U)) +#define DDR_PHY_DX7LCDLR1_0 0x5c010e84 +#define DDR_PHY_DX7LCDLR1_1 0x5c110e84 +#define DDR_PHY_DX7LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A2U)) +#define DDR_PHY_DX7LCDLR2_0 0x5c010e88 +#define DDR_PHY_DX7LCDLR2_1 0x5c110e88 +#define DDR_PHY_DX7LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A3U)) +#define DDR_PHY_DX7LCDLR3_0 0x5c010e8c +#define DDR_PHY_DX7LCDLR3_1 0x5c110e8c +#define DDR_PHY_DX7LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A4U)) +#define DDR_PHY_DX7LCDLR4_0 0x5c010e90 +#define DDR_PHY_DX7LCDLR4_1 0x5c110e90 +#define DDR_PHY_DX7LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A5U)) +#define DDR_PHY_DX7LCDLR5_0 0x5c010e94 +#define DDR_PHY_DX7LCDLR5_1 0x5c110e94 +#define DDR_PHY_DX7MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A8U)) +#define DDR_PHY_DX7MDLR0_0 0x5c010ea0 +#define DDR_PHY_DX7MDLR0_1 0x5c110ea0 +#define DDR_PHY_DX7MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3A9U)) +#define DDR_PHY_DX7MDLR1_0 0x5c010ea4 +#define DDR_PHY_DX7MDLR1_1 0x5c110ea4 +#define DDR_PHY_DX7GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B0U)) +#define DDR_PHY_DX7GTR0_0 0x5c010ec0 +#define DDR_PHY_DX7GTR0_1 0x5c110ec0 +#define DDR_PHY_DX7RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B4U)) +#define DDR_PHY_DX7RSR0_0 0x5c010ed0 +#define DDR_PHY_DX7RSR0_1 0x5c110ed0 +#define DDR_PHY_DX7RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B5U)) +#define DDR_PHY_DX7RSR1_0 0x5c010ed4 +#define DDR_PHY_DX7RSR1_1 0x5c110ed4 +#define DDR_PHY_DX7RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B6U)) +#define DDR_PHY_DX7RSR2_0 0x5c010ed8 +#define DDR_PHY_DX7RSR2_1 0x5c110ed8 +#define DDR_PHY_DX7RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B7U)) +#define DDR_PHY_DX7RSR3_0 0x5c010edc +#define DDR_PHY_DX7RSR3_1 0x5c110edc +#define DDR_PHY_DX7GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B8U)) +#define DDR_PHY_DX7GSR0_0 0x5c010ee0 +#define DDR_PHY_DX7GSR0_1 0x5c110ee0 +#define DDR_PHY_DX7GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3B9U)) +#define DDR_PHY_DX7GSR1_0 0x5c010ee4 +#define DDR_PHY_DX7GSR1_1 0x5c110ee4 +#define DDR_PHY_DX7GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3BAU)) +#define DDR_PHY_DX7GSR2_0 0x5c010ee8 +#define DDR_PHY_DX7GSR2_1 0x5c110ee8 +#define DDR_PHY_DX7GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3BBU)) +#define DDR_PHY_DX7GSR3_0 0x5c010eec +#define DDR_PHY_DX7GSR3_1 0x5c110eec +#define DDR_PHY_DX7GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3BCU)) +#define DDR_PHY_DX7GSR4_0 0x5c010ef0 +#define DDR_PHY_DX7GSR4_1 0x5c110ef0 +#define DDR_PHY_DX7GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3BDU)) +#define DDR_PHY_DX7GSR5_0 0x5c010ef4 +#define DDR_PHY_DX7GSR5_1 0x5c110ef4 +#define DDR_PHY_DX7GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3BEU)) +#define DDR_PHY_DX7GSR6_0 0x5c010ef8 +#define DDR_PHY_DX7GSR6_1 0x5c110ef8 +#define DDR_PHY_DX8GCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C0U)) +#define DDR_PHY_DX8GCR0_0 0x5c010f00 +#define DDR_PHY_DX8GCR0_1 0x5c110f00 +#define DDR_PHY_DX8GCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C1U)) +#define DDR_PHY_DX8GCR1_0 0x5c010f04 +#define DDR_PHY_DX8GCR1_1 0x5c110f04 +#define DDR_PHY_DX8GCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C2U)) +#define DDR_PHY_DX8GCR2_0 0x5c010f08 +#define DDR_PHY_DX8GCR2_1 0x5c110f08 +#define DDR_PHY_DX8GCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C3U)) +#define DDR_PHY_DX8GCR3_0 0x5c010f0c +#define DDR_PHY_DX8GCR3_1 0x5c110f0c +#define DDR_PHY_DX8GCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C4U)) +#define DDR_PHY_DX8GCR4_0 0x5c010f10 +#define DDR_PHY_DX8GCR4_1 0x5c110f10 +#define DDR_PHY_DX8GCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C5U)) +#define DDR_PHY_DX8GCR5_0 0x5c010f14 +#define DDR_PHY_DX8GCR5_1 0x5c110f14 +#define DDR_PHY_DX8GCR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C6U)) +#define DDR_PHY_DX8GCR6_0 0x5c010f18 +#define DDR_PHY_DX8GCR6_1 0x5c110f18 +#define DDR_PHY_DX8GCR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C7U)) +#define DDR_PHY_DX8GCR7_0 0x5c010f1c +#define DDR_PHY_DX8GCR7_1 0x5c110f1c +#define DDR_PHY_DX8GCR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C8U)) +#define DDR_PHY_DX8GCR8_0 0x5c010f20 +#define DDR_PHY_DX8GCR8_1 0x5c110f20 +#define DDR_PHY_DX8GCR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3C9U)) +#define DDR_PHY_DX8GCR9_0 0x5c010f24 +#define DDR_PHY_DX8GCR9_1 0x5c110f24 +#define DDR_PHY_DX8BDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D0U)) +#define DDR_PHY_DX8BDLR0_0 0x5c010f40 +#define DDR_PHY_DX8BDLR0_1 0x5c110f40 +#define DDR_PHY_DX8BDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D1U)) +#define DDR_PHY_DX8BDLR1_0 0x5c010f44 +#define DDR_PHY_DX8BDLR1_1 0x5c110f44 +#define DDR_PHY_DX8BDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D2U)) +#define DDR_PHY_DX8BDLR2_0 0x5c010f48 +#define DDR_PHY_DX8BDLR2_1 0x5c110f48 +#define DDR_PHY_DX8BDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D4U)) +#define DDR_PHY_DX8BDLR3_0 0x5c010f50 +#define DDR_PHY_DX8BDLR3_1 0x5c110f50 +#define DDR_PHY_DX8BDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D5U)) +#define DDR_PHY_DX8BDLR4_0 0x5c010f54 +#define DDR_PHY_DX8BDLR4_1 0x5c110f54 +#define DDR_PHY_DX8BDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D6U)) +#define DDR_PHY_DX8BDLR5_0 0x5c010f58 +#define DDR_PHY_DX8BDLR5_1 0x5c110f58 +#define DDR_PHY_DX8BDLR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D8U)) +#define DDR_PHY_DX8BDLR6_0 0x5c010f60 +#define DDR_PHY_DX8BDLR6_1 0x5c110f60 +#define DDR_PHY_DX8BDLR7(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3D9U)) +#define DDR_PHY_DX8BDLR7_0 0x5c010f64 +#define DDR_PHY_DX8BDLR7_1 0x5c110f64 +#define DDR_PHY_DX8BDLR8(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3DAU)) +#define DDR_PHY_DX8BDLR8_0 0x5c010f68 +#define DDR_PHY_DX8BDLR8_1 0x5c110f68 +#define DDR_PHY_DX8BDLR9(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3DBU)) +#define DDR_PHY_DX8BDLR9_0 0x5c010f6c +#define DDR_PHY_DX8BDLR9_1 0x5c110f6c +#define DDR_PHY_DX8LCDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E0U)) +#define DDR_PHY_DX8LCDLR0_0 0x5c010f80 +#define DDR_PHY_DX8LCDLR0_1 0x5c110f80 +#define DDR_PHY_DX8LCDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E1U)) +#define DDR_PHY_DX8LCDLR1_0 0x5c010f84 +#define DDR_PHY_DX8LCDLR1_1 0x5c110f84 +#define DDR_PHY_DX8LCDLR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E2U)) +#define DDR_PHY_DX8LCDLR2_0 0x5c010f88 +#define DDR_PHY_DX8LCDLR2_1 0x5c110f88 +#define DDR_PHY_DX8LCDLR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E3U)) +#define DDR_PHY_DX8LCDLR3_0 0x5c010f8c +#define DDR_PHY_DX8LCDLR3_1 0x5c110f8c +#define DDR_PHY_DX8LCDLR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E4U)) +#define DDR_PHY_DX8LCDLR4_0 0x5c010f90 +#define DDR_PHY_DX8LCDLR4_1 0x5c110f90 +#define DDR_PHY_DX8LCDLR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E5U)) +#define DDR_PHY_DX8LCDLR5_0 0x5c010f94 +#define DDR_PHY_DX8LCDLR5_1 0x5c110f94 +#define DDR_PHY_DX8MDLR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E8U)) +#define DDR_PHY_DX8MDLR0_0 0x5c010fa0 +#define DDR_PHY_DX8MDLR0_1 0x5c110fa0 +#define DDR_PHY_DX8MDLR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3E9U)) +#define DDR_PHY_DX8MDLR1_0 0x5c010fa4 +#define DDR_PHY_DX8MDLR1_1 0x5c110fa4 +#define DDR_PHY_DX8GTR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F0U)) +#define DDR_PHY_DX8GTR0_0 0x5c010fc0 +#define DDR_PHY_DX8GTR0_1 0x5c110fc0 +#define DDR_PHY_DX8RSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F4U)) +#define DDR_PHY_DX8RSR0_0 0x5c010fd0 +#define DDR_PHY_DX8RSR0_1 0x5c110fd0 +#define DDR_PHY_DX8RSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F5U)) +#define DDR_PHY_DX8RSR1_0 0x5c010fd4 +#define DDR_PHY_DX8RSR1_1 0x5c110fd4 +#define DDR_PHY_DX8RSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F6U)) +#define DDR_PHY_DX8RSR2_0 0x5c010fd8 +#define DDR_PHY_DX8RSR2_1 0x5c110fd8 +#define DDR_PHY_DX8RSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F7U)) +#define DDR_PHY_DX8RSR3_0 0x5c010fdc +#define DDR_PHY_DX8RSR3_1 0x5c110fdc +#define DDR_PHY_DX8GSR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F8U)) +#define DDR_PHY_DX8GSR0_0 0x5c010fe0 +#define DDR_PHY_DX8GSR0_1 0x5c110fe0 +#define DDR_PHY_DX8GSR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3F9U)) +#define DDR_PHY_DX8GSR1_0 0x5c010fe4 +#define DDR_PHY_DX8GSR1_1 0x5c110fe4 +#define DDR_PHY_DX8GSR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3FAU)) +#define DDR_PHY_DX8GSR2_0 0x5c010fe8 +#define DDR_PHY_DX8GSR2_1 0x5c110fe8 +#define DDR_PHY_DX8GSR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3FBU)) +#define DDR_PHY_DX8GSR3_0 0x5c010fec +#define DDR_PHY_DX8GSR3_1 0x5c110fec +#define DDR_PHY_DX8GSR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3FCU)) +#define DDR_PHY_DX8GSR4_0 0x5c010ff0 +#define DDR_PHY_DX8GSR4_1 0x5c110ff0 +#define DDR_PHY_DX8GSR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3FDU)) +#define DDR_PHY_DX8GSR5_0 0x5c010ff4 +#define DDR_PHY_DX8GSR5_1 0x5c110ff4 +#define DDR_PHY_DX8GSR6(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x3FEU)) +#define DDR_PHY_DX8GSR6_0 0x5c010ff8 +#define DDR_PHY_DX8GSR6_1 0x5c110ff8 +#define DDR_PHY_DX8SL0OSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x500U)) +#define DDR_PHY_DX8SL0OSC_0 0x5c011400 +#define DDR_PHY_DX8SL0OSC_1 0x5c111400 +#define DDR_PHY_DX8SL0PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x501U)) +#define DDR_PHY_DX8SL0PLLCR0_0 0x5c011404 +#define DDR_PHY_DX8SL0PLLCR0_1 0x5c111404 +#define DDR_PHY_DX8SL0PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x502U)) +#define DDR_PHY_DX8SL0PLLCR1_0 0x5c011408 +#define DDR_PHY_DX8SL0PLLCR1_1 0x5c111408 +#define DDR_PHY_DX8SL0PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x503U)) +#define DDR_PHY_DX8SL0PLLCR2_0 0x5c01140c +#define DDR_PHY_DX8SL0PLLCR2_1 0x5c11140c +#define DDR_PHY_DX8SL0PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x504U)) +#define DDR_PHY_DX8SL0PLLCR3_0 0x5c011410 +#define DDR_PHY_DX8SL0PLLCR3_1 0x5c111410 +#define DDR_PHY_DX8SL0PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x505U)) +#define DDR_PHY_DX8SL0PLLCR4_0 0x5c011414 +#define DDR_PHY_DX8SL0PLLCR4_1 0x5c111414 +#define DDR_PHY_DX8SL0PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x506U)) +#define DDR_PHY_DX8SL0PLLCR5_0 0x5c011418 +#define DDR_PHY_DX8SL0PLLCR5_1 0x5c111418 +#define DDR_PHY_DX8SL0DQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x507U)) +#define DDR_PHY_DX8SL0DQSCTL_0 0x5c01141c +#define DDR_PHY_DX8SL0DQSCTL_1 0x5c11141c +#define DDR_PHY_DX8SL0TRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x508U)) +#define DDR_PHY_DX8SL0TRNCTL_0 0x5c011420 +#define DDR_PHY_DX8SL0TRNCTL_1 0x5c111420 +#define DDR_PHY_DX8SL0DDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x509U)) +#define DDR_PHY_DX8SL0DDLCTL_0 0x5c011424 +#define DDR_PHY_DX8SL0DDLCTL_1 0x5c111424 +#define DDR_PHY_DX8SL0DXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x50AU)) +#define DDR_PHY_DX8SL0DXCTL1_0 0x5c011428 +#define DDR_PHY_DX8SL0DXCTL1_1 0x5c111428 +#define DDR_PHY_DX8SL0DXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x50BU)) +#define DDR_PHY_DX8SL0DXCTL2_0 0x5c01142c +#define DDR_PHY_DX8SL0DXCTL2_1 0x5c11142c +#define DDR_PHY_DX8SL0IOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x50CU)) +#define DDR_PHY_DX8SL0IOCR_0 0x5c011430 +#define DDR_PHY_DX8SL0IOCR_1 0x5c111430 +#define DDR_PHY_DX8SL1OSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x510U)) +#define DDR_PHY_DX8SL1OSC_0 0x5c011440 +#define DDR_PHY_DX8SL1OSC_1 0x5c111440 +#define DDR_PHY_DX8SL1PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x511U)) +#define DDR_PHY_DX8SL1PLLCR0_0 0x5c011444 +#define DDR_PHY_DX8SL1PLLCR0_1 0x5c111444 +#define DDR_PHY_DX8SL1PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x512U)) +#define DDR_PHY_DX8SL1PLLCR1_0 0x5c011448 +#define DDR_PHY_DX8SL1PLLCR1_1 0x5c111448 +#define DDR_PHY_DX8SL1PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x513U)) +#define DDR_PHY_DX8SL1PLLCR2_0 0x5c01144c +#define DDR_PHY_DX8SL1PLLCR2_1 0x5c11144c +#define DDR_PHY_DX8SL1PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x514U)) +#define DDR_PHY_DX8SL1PLLCR3_0 0x5c011450 +#define DDR_PHY_DX8SL1PLLCR3_1 0x5c111450 +#define DDR_PHY_DX8SL1PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x515U)) +#define DDR_PHY_DX8SL1PLLCR4_0 0x5c011454 +#define DDR_PHY_DX8SL1PLLCR4_1 0x5c111454 +#define DDR_PHY_DX8SL1PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x516U)) +#define DDR_PHY_DX8SL1PLLCR5_0 0x5c011458 +#define DDR_PHY_DX8SL1PLLCR5_1 0x5c111458 +#define DDR_PHY_DX8SL1DQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x517U)) +#define DDR_PHY_DX8SL1DQSCTL_0 0x5c01145c +#define DDR_PHY_DX8SL1DQSCTL_1 0x5c11145c +#define DDR_PHY_DX8SL1TRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x518U)) +#define DDR_PHY_DX8SL1TRNCTL_0 0x5c011460 +#define DDR_PHY_DX8SL1TRNCTL_1 0x5c111460 +#define DDR_PHY_DX8SL1DDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x519U)) +#define DDR_PHY_DX8SL1DDLCTL_0 0x5c011464 +#define DDR_PHY_DX8SL1DDLCTL_1 0x5c111464 +#define DDR_PHY_DX8SL1DXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x51AU)) +#define DDR_PHY_DX8SL1DXCTL1_0 0x5c011468 +#define DDR_PHY_DX8SL1DXCTL1_1 0x5c111468 +#define DDR_PHY_DX8SL1DXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x51BU)) +#define DDR_PHY_DX8SL1DXCTL2_0 0x5c01146c +#define DDR_PHY_DX8SL1DXCTL2_1 0x5c11146c +#define DDR_PHY_DX8SL1IOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x51CU)) +#define DDR_PHY_DX8SL1IOCR_0 0x5c011470 +#define DDR_PHY_DX8SL1IOCR_1 0x5c111470 +#define DDR_PHY_DX8SL2OSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x520U)) +#define DDR_PHY_DX8SL2OSC_0 0x5c011480 +#define DDR_PHY_DX8SL2OSC_1 0x5c111480 +#define DDR_PHY_DX8SL2PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x521U)) +#define DDR_PHY_DX8SL2PLLCR0_0 0x5c011484 +#define DDR_PHY_DX8SL2PLLCR0_1 0x5c111484 +#define DDR_PHY_DX8SL2PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x522U)) +#define DDR_PHY_DX8SL2PLLCR1_0 0x5c011488 +#define DDR_PHY_DX8SL2PLLCR1_1 0x5c111488 +#define DDR_PHY_DX8SL2PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x523U)) +#define DDR_PHY_DX8SL2PLLCR2_0 0x5c01148c +#define DDR_PHY_DX8SL2PLLCR2_1 0x5c11148c +#define DDR_PHY_DX8SL2PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x524U)) +#define DDR_PHY_DX8SL2PLLCR3_0 0x5c011490 +#define DDR_PHY_DX8SL2PLLCR3_1 0x5c111490 +#define DDR_PHY_DX8SL2PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x525U)) +#define DDR_PHY_DX8SL2PLLCR4_0 0x5c011494 +#define DDR_PHY_DX8SL2PLLCR4_1 0x5c111494 +#define DDR_PHY_DX8SL2PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x526U)) +#define DDR_PHY_DX8SL2PLLCR5_0 0x5c011498 +#define DDR_PHY_DX8SL2PLLCR5_1 0x5c111498 +#define DDR_PHY_DX8SL2DQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x527U)) +#define DDR_PHY_DX8SL2DQSCTL_0 0x5c01149c +#define DDR_PHY_DX8SL2DQSCTL_1 0x5c11149c +#define DDR_PHY_DX8SL2TRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x528U)) +#define DDR_PHY_DX8SL2TRNCTL_0 0x5c0114a0 +#define DDR_PHY_DX8SL2TRNCTL_1 0x5c1114a0 +#define DDR_PHY_DX8SL2DDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x529U)) +#define DDR_PHY_DX8SL2DDLCTL_0 0x5c0114a4 +#define DDR_PHY_DX8SL2DDLCTL_1 0x5c1114a4 +#define DDR_PHY_DX8SL2DXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x52AU)) +#define DDR_PHY_DX8SL2DXCTL1_0 0x5c0114a8 +#define DDR_PHY_DX8SL2DXCTL1_1 0x5c1114a8 +#define DDR_PHY_DX8SL2DXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x52BU)) +#define DDR_PHY_DX8SL2DXCTL2_0 0x5c0114ac +#define DDR_PHY_DX8SL2DXCTL2_1 0x5c1114ac +#define DDR_PHY_DX8SL2IOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x52CU)) +#define DDR_PHY_DX8SL2IOCR_0 0x5c0114b0 +#define DDR_PHY_DX8SL2IOCR_1 0x5c1114b0 +#define DDR_PHY_DX8SL3OSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x530U)) +#define DDR_PHY_DX8SL3OSC_0 0x5c0114c0 +#define DDR_PHY_DX8SL3OSC_1 0x5c1114c0 +#define DDR_PHY_DX8SL3PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x531U)) +#define DDR_PHY_DX8SL3PLLCR0_0 0x5c0114c4 +#define DDR_PHY_DX8SL3PLLCR0_1 0x5c1114c4 +#define DDR_PHY_DX8SL3PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x532U)) +#define DDR_PHY_DX8SL3PLLCR1_0 0x5c0114c8 +#define DDR_PHY_DX8SL3PLLCR1_1 0x5c1114c8 +#define DDR_PHY_DX8SL3PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x533U)) +#define DDR_PHY_DX8SL3PLLCR2_0 0x5c0114cc +#define DDR_PHY_DX8SL3PLLCR2_1 0x5c1114cc +#define DDR_PHY_DX8SL3PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x534U)) +#define DDR_PHY_DX8SL3PLLCR3_0 0x5c0114d0 +#define DDR_PHY_DX8SL3PLLCR3_1 0x5c1114d0 +#define DDR_PHY_DX8SL3PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x535U)) +#define DDR_PHY_DX8SL3PLLCR4_0 0x5c0114d4 +#define DDR_PHY_DX8SL3PLLCR4_1 0x5c1114d4 +#define DDR_PHY_DX8SL3PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x536U)) +#define DDR_PHY_DX8SL3PLLCR5_0 0x5c0114d8 +#define DDR_PHY_DX8SL3PLLCR5_1 0x5c1114d8 +#define DDR_PHY_DX8SL3DQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x537U)) +#define DDR_PHY_DX8SL3DQSCTL_0 0x5c0114dc +#define DDR_PHY_DX8SL3DQSCTL_1 0x5c1114dc +#define DDR_PHY_DX8SL3TRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x538U)) +#define DDR_PHY_DX8SL3TRNCTL_0 0x5c0114e0 +#define DDR_PHY_DX8SL3TRNCTL_1 0x5c1114e0 +#define DDR_PHY_DX8SL3DDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x539U)) +#define DDR_PHY_DX8SL3DDLCTL_0 0x5c0114e4 +#define DDR_PHY_DX8SL3DDLCTL_1 0x5c1114e4 +#define DDR_PHY_DX8SL3DXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x53AU)) +#define DDR_PHY_DX8SL3DXCTL1_0 0x5c0114e8 +#define DDR_PHY_DX8SL3DXCTL1_1 0x5c1114e8 +#define DDR_PHY_DX8SL3DXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x53BU)) +#define DDR_PHY_DX8SL3DXCTL2_0 0x5c0114ec +#define DDR_PHY_DX8SL3DXCTL2_1 0x5c1114ec +#define DDR_PHY_DX8SL3IOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x53CU)) +#define DDR_PHY_DX8SL3IOCR_0 0x5c0114f0 +#define DDR_PHY_DX8SL3IOCR_1 0x5c1114f0 +#define DDR_PHY_DX8SL4OSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x540U)) +#define DDR_PHY_DX8SL4OSC_0 0x5c011500 +#define DDR_PHY_DX8SL4OSC_1 0x5c111500 +#define DDR_PHY_DX8SL4PLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x541U)) +#define DDR_PHY_DX8SL4PLLCR0_0 0x5c011504 +#define DDR_PHY_DX8SL4PLLCR0_1 0x5c111504 +#define DDR_PHY_DX8SL4PLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x542U)) +#define DDR_PHY_DX8SL4PLLCR1_0 0x5c011508 +#define DDR_PHY_DX8SL4PLLCR1_1 0x5c111508 +#define DDR_PHY_DX8SL4PLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x543U)) +#define DDR_PHY_DX8SL4PLLCR2_0 0x5c01150c +#define DDR_PHY_DX8SL4PLLCR2_1 0x5c11150c +#define DDR_PHY_DX8SL4PLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x544U)) +#define DDR_PHY_DX8SL4PLLCR3_0 0x5c011510 +#define DDR_PHY_DX8SL4PLLCR3_1 0x5c111510 +#define DDR_PHY_DX8SL4PLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x545U)) +#define DDR_PHY_DX8SL4PLLCR4_0 0x5c011514 +#define DDR_PHY_DX8SL4PLLCR4_1 0x5c111514 +#define DDR_PHY_DX8SL4PLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x546U)) +#define DDR_PHY_DX8SL4PLLCR5_0 0x5c011518 +#define DDR_PHY_DX8SL4PLLCR5_1 0x5c111518 +#define DDR_PHY_DX8SL4DQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x547U)) +#define DDR_PHY_DX8SL4DQSCTL_0 0x5c01151c +#define DDR_PHY_DX8SL4DQSCTL_1 0x5c11151c +#define DDR_PHY_DX8SL4TRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x548U)) +#define DDR_PHY_DX8SL4TRNCTL_0 0x5c011520 +#define DDR_PHY_DX8SL4TRNCTL_1 0x5c111520 +#define DDR_PHY_DX8SL4DDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x549U)) +#define DDR_PHY_DX8SL4DDLCTL_0 0x5c011524 +#define DDR_PHY_DX8SL4DDLCTL_1 0x5c111524 +#define DDR_PHY_DX8SL4DXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x54AU)) +#define DDR_PHY_DX8SL4DXCTL1_0 0x5c011528 +#define DDR_PHY_DX8SL4DXCTL1_1 0x5c111528 +#define DDR_PHY_DX8SL4DXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x54BU)) +#define DDR_PHY_DX8SL4DXCTL2_0 0x5c01152c +#define DDR_PHY_DX8SL4DXCTL2_1 0x5c11152c +#define DDR_PHY_DX8SL4IOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x54CU)) +#define DDR_PHY_DX8SL4IOCR_0 0x5c011530 +#define DDR_PHY_DX8SL4IOCR_1 0x5c111530 +#define DDR_PHY_DX8SLbOSC(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F0U)) +#define DDR_PHY_DX8SLbOSC_0 0x5c0117c0 +#define DDR_PHY_DX8SLbOSC_1 0x5c1117c0 +#define DDR_PHY_DX8SLbPLLCR0(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F1U)) +#define DDR_PHY_DX8SLbPLLCR0_0 0x5c0117c4 +#define DDR_PHY_DX8SLbPLLCR0_1 0x5c1117c4 +#define DDR_PHY_DX8SLbPLLCR1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F2U)) +#define DDR_PHY_DX8SLbPLLCR1_0 0x5c0117c8 +#define DDR_PHY_DX8SLbPLLCR1_1 0x5c1117c8 +#define DDR_PHY_DX8SLbPLLCR2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F3U)) +#define DDR_PHY_DX8SLbPLLCR2_0 0x5c0117cc +#define DDR_PHY_DX8SLbPLLCR2_1 0x5c1117cc +#define DDR_PHY_DX8SLbPLLCR3(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F4U)) +#define DDR_PHY_DX8SLbPLLCR3_0 0x5c0117d0 +#define DDR_PHY_DX8SLbPLLCR3_1 0x5c1117d0 +#define DDR_PHY_DX8SLbPLLCR4(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F5U)) +#define DDR_PHY_DX8SLbPLLCR4_0 0x5c0117d4 +#define DDR_PHY_DX8SLbPLLCR4_1 0x5c1117d4 +#define DDR_PHY_DX8SLbPLLCR5(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F6U)) +#define DDR_PHY_DX8SLbPLLCR5_0 0x5c0117d8 +#define DDR_PHY_DX8SLbPLLCR5_1 0x5c1117d8 +#define DDR_PHY_DX8SLbDQSCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F7U)) +#define DDR_PHY_DX8SLbDQSCTL_0 0x5c0117dc +#define DDR_PHY_DX8SLbDQSCTL_1 0x5c1117dc +#define DDR_PHY_DX8SLbTRNCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F8U)) +#define DDR_PHY_DX8SLbTRNCTL_0 0x5c0117e0 +#define DDR_PHY_DX8SLbTRNCTL_1 0x5c1117e0 +#define DDR_PHY_DX8SLbDDLCTL(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5F9U)) +#define DDR_PHY_DX8SLbDDLCTL_0 0x5c0117e4 +#define DDR_PHY_DX8SLbDDLCTL_1 0x5c1117e4 +#define DDR_PHY_DX8SLbDXCTL1(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5FAU)) +#define DDR_PHY_DX8SLbDXCTL1_0 0x5c0117e8 +#define DDR_PHY_DX8SLbDXCTL1_1 0x5c1117e8 +#define DDR_PHY_DX8SLbDXCTL2(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5FBU)) +#define DDR_PHY_DX8SLbDXCTL2_0 0x5c0117ec +#define DDR_PHY_DX8SLbDXCTL2_1 0x5c1117ec +#define DDR_PHY_DX8SLbIOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5FCU)) +#define DDR_PHY_DX8SLbIOCR_0 0x5c0117f0 +#define DDR_PHY_DX8SLbIOCR_1 0x5c1117f0 +#define DDR_PHY_DX4SLbIOCR(X) REG32(DDR_PHY_BASE_ADDR(X) + (4U*0x5FDU)) +#define DDR_PHY_DX4SLbIOCR_0 0x5c0117f4 +#define DDR_PHY_DX4SLbIOCR_1 0x5c1117f4 + +#endif + diff --git a/platform/devices/MX8/MX8_ddrc.h b/platform/devices/MX8/MX8_ddrc.h new file mode 100755 index 0000000..80dbb54 --- /dev/null +++ b/platform/devices/MX8/MX8_ddrc.h @@ -0,0 +1,662 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of Freescale Semiconductor, Inc. nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** ################################################################### +*/ + +#ifndef HW_DDRC_REGISTERS_H +#define HW_DDRC_REGISTERS_H + +//JDG change base addr for DDRC +#define DDRC_BASE_ADDR(X) (0x5c000000UL + ((U32(X) * 0x100000UL))) + +#define DDRC_MSTR(X) REG32(DDRC_BASE_ADDR(X) + 0x00U) +#define DDRC_MSTR_0 0x5c000000 +#define DDRC_MSTR_1 0x5c100000 +#define DDRC_STAT(X) REG32(DDRC_BASE_ADDR(X) + 0x04U) +#define DDRC_STAT_0 0x5c000004 +#define DDRC_STAT_1 0x5c100004 +#define DDRC_MRCTRL0(X) REG32(DDRC_BASE_ADDR(X) + 0x10U) +#define DDRC_MRCTRL0_0 0x5c000010 +#define DDRC_MRCTRL0_1 0x5c100010 +#define DDRC_MRCTRL1(X) REG32(DDRC_BASE_ADDR(X) + 0x14U) +#define DDRC_MRCTRL1_0 0x5c000014 +#define DDRC_MRCTRL1_1 0x5c100014 +#define DDRC_MRSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x18U) +#define DDRC_MRSTAT_0 0x5c000018 +#define DDRC_MRSTAT_1 0x5c100018 +#define DDRC_MRCTRL2(X) REG32(DDRC_BASE_ADDR(X) + 0x1cU) +#define DDRC_MRCTRL2_0 0x5c00001c +#define DDRC_MRCTRL2_1 0x5c10001c +#define DDRC_DERATEEN(X) REG32(DDRC_BASE_ADDR(X) + 0x20U) +#define DDRC_DERATEEN_0 0x5c000020 +#define DDRC_DERATEEN_1 0x5c100020 +#define DDRC_DERATEINT(X) REG32(DDRC_BASE_ADDR(X) + 0x24U) +#define DDRC_DERATEINT_0 0x5c000024 +#define DDRC_DERATEINT_1 0x5c100024 +#define DDRC_PWRCTL(X) REG32(DDRC_BASE_ADDR(X) + 0x30U) +#define DDRC_PWRCTL_0 0x5c000030 +#define DDRC_PWRCTL_1 0x5c100030 +#define DDRC_PWRTMG(X) REG32(DDRC_BASE_ADDR(X) + 0x34U) +#define DDRC_PWRTMG_0 0x5c000034 +#define DDRC_PWRTMG_1 0x5c100034 +#define DDRC_HWLPCTL(X) REG32(DDRC_BASE_ADDR(X) + 0x38U) +#define DDRC_HWLPCTL_0 0x5c000038 +#define DDRC_HWLPCTL_1 0x5c100038 +#define DDRC_RFSHCTL0(X) REG32(DDRC_BASE_ADDR(X) + 0x50U) +#define DDRC_RFSHCTL0_0 0x5c000050 +#define DDRC_RFSHCTL0_1 0x5c100050 +#define DDRC_RFSHCTL1(X) REG32(DDRC_BASE_ADDR(X) + 0x54U) +#define DDRC_RFSHCTL1_0 0x5c000054 +#define DDRC_RFSHCTL1_1 0x5c100054 +#define DDRC_RFSHCTL2(X) REG32(DDRC_BASE_ADDR(X) + 0x58U) +#define DDRC_RFSHCTL2_0 0x5c000058 +#define DDRC_RFSHCTL2_1 0x5c100058 +#define DDRC_RFSHCTL3(X) REG32(DDRC_BASE_ADDR(X) + 0x60U) +#define DDRC_RFSHCTL3_0 0x5c000060 +#define DDRC_RFSHCTL3_1 0x5c100060 +#define DDRC_RFSHTMG(X) REG32(DDRC_BASE_ADDR(X) + 0x64U) +#define DDRC_RFSHTMG_0 0x5c000064 +#define DDRC_RFSHTMG_1 0x5c100064 +#define DDRC_ECCCFG0(X) REG32(DDRC_BASE_ADDR(X) + 0x70U) +#define DDRC_ECCCFG0_0 0x5c000070 +#define DDRC_ECCCFG0_1 0x5c100070 +#define DDRC_ECCCFG1(X) REG32(DDRC_BASE_ADDR(X) + 0x74U) +#define DDRC_ECCCFG1_0 0x5c000074 +#define DDRC_ECCCFG1_1 0x5c100074 +#define DDRC_ECCSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x78U) +#define DDRC_ECCSTAT_0 0x5c000078 +#define DDRC_ECCSTAT_1 0x5c100078 +#define DDRC_ECCCLR(X) REG32(DDRC_BASE_ADDR(X) + 0x7cU) +#define DDRC_ECCCLR_0 0x5c00007c +#define DDRC_ECCCLR_1 0x5c10007c +#define DDRC_ECCERRCNT(X) REG32(DDRC_BASE_ADDR(X) + 0x80U) +#define DDRC_ECCERRCNT_0 0x5c000080 +#define DDRC_ECCERRCNT_1 0x5c100080 +#define DDRC_ECCCADDR0(X) REG32(DDRC_BASE_ADDR(X) + 0x84U) +#define DDRC_ECCCADDR0_0 0x5c000084 +#define DDRC_ECCCADDR0_1 0x5c100084 +#define DDRC_ECCCADDR1(X) REG32(DDRC_BASE_ADDR(X) + 0x88U) +#define DDRC_ECCCADDR1_0 0x5c000088 +#define DDRC_ECCCADDR1_1 0x5c100088 +#define DDRC_ECCCSYN0(X) REG32(DDRC_BASE_ADDR(X) + 0x8cU) +#define DDRC_ECCCSYN0_0 0x5c00008c +#define DDRC_ECCCSYN0_1 0x5c10008c +#define DDRC_ECCCSYN1(X) REG32(DDRC_BASE_ADDR(X) + 0x90U) +#define DDRC_ECCCSYN1_0 0x5c000090 +#define DDRC_ECCCSYN1_1 0x5c100090 +#define DDRC_ECCCSYN2(X) REG32(DDRC_BASE_ADDR(X) + 0x94U) +#define DDRC_ECCCSYN2_0 0x5c000094 +#define DDRC_ECCCSYN2_1 0x5c100094 +#define DDRC_ECCBITMASK0(X) REG32(DDRC_BASE_ADDR(X) + 0x98U) +#define DDRC_ECCBITMASK0_0 0x5c000098 +#define DDRC_ECCBITMASK0_1 0x5c100098 +#define DDRC_ECCBITMASK1(X) REG32(DDRC_BASE_ADDR(X) + 0x9cU) +#define DDRC_ECCBITMASK1_0 0x5c00009c +#define DDRC_ECCBITMASK1_1 0x5c10009c +#define DDRC_ECCBITMASK2(X) REG32(DDRC_BASE_ADDR(X) + 0xa0U) +#define DDRC_ECCBITMASK2_0 0x5c0000a0 +#define DDRC_ECCBITMASK2_1 0x5c1000a0 +#define DDRC_ECCUADDR0(X) REG32(DDRC_BASE_ADDR(X) + 0xa4U) +#define DDRC_ECCUADDR0_0 0x5c0000a4 +#define DDRC_ECCUADDR0_1 0x5c1000a4 +#define DDRC_ECCUADDR1(X) REG32(DDRC_BASE_ADDR(X) + 0xa8U) +#define DDRC_ECCUADDR1_0 0x5c0000a8 +#define DDRC_ECCUADDR1_1 0x5c1000a8 +#define DDRC_ECCUSYN0(X) REG32(DDRC_BASE_ADDR(X) + 0xacU) +#define DDRC_ECCUSYN0_0 0x5c0000ac +#define DDRC_ECCUSYN0_1 0x5c1000ac +#define DDRC_ECCUSYN1(X) REG32(DDRC_BASE_ADDR(X) + 0xb0U) +#define DDRC_ECCUSYN1_0 0x5c0000b0 +#define DDRC_ECCUSYN1_1 0x5c1000b0 +#define DDRC_ECCUSYN2(X) REG32(DDRC_BASE_ADDR(X) + 0xb4U) +#define DDRC_ECCUSYN2_0 0x5c0000b4 +#define DDRC_ECCUSYN2_1 0x5c1000b4 +#define DDRC_ECCPOISONADDR0(X) REG32(DDRC_BASE_ADDR(X) + 0xb8U) +#define DDRC_ECCPOISONADDR0_0 0x5c0000b8 +#define DDRC_ECCPOISONADDR0_1 0x5c1000b8 +#define DDRC_ECCPOISONADDR1(X) REG32(DDRC_BASE_ADDR(X) + 0xbcU) +#define DDRC_ECCPOISONADDR1_0 0x5c0000bc +#define DDRC_ECCPOISONADDR1_1 0x5c1000bc +#define DDRC_CRCPARCTL0(X) REG32(DDRC_BASE_ADDR(X) + 0xc0U) +#define DDRC_CRCPARCTL0_0 0x5c0000c0 +#define DDRC_CRCPARCTL0_1 0x5c1000c0 +#define DDRC_CRCPARCTL1(X) REG32(DDRC_BASE_ADDR(X) + 0xc4U) +#define DDRC_CRCPARCTL1_0 0x5c0000c4 +#define DDRC_CRCPARCTL1_1 0x5c1000c4 +#define DDRC_CRCPARCTL2(X) REG32(DDRC_BASE_ADDR(X) + 0xc8U) +#define DDRC_CRCPARCTL2_0 0x5c0000c8 +#define DDRC_CRCPARCTL2_1 0x5c1000c8 +#define DDRC_CRCPARSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0xccU) +#define DDRC_CRCPARSTAT_0 0x5c0000cc +#define DDRC_CRCPARSTAT_1 0x5c1000cc +#define DDRC_INIT0(X) REG32(DDRC_BASE_ADDR(X) + 0xd0U) +#define DDRC_INIT0_0 0x5c0000d0 +#define DDRC_INIT0_1 0x5c1000d0 +#define DDRC_INIT1(X) REG32(DDRC_BASE_ADDR(X) + 0xd4U) +#define DDRC_INIT1_0 0x5c0000d4 +#define DDRC_INIT1_1 0x5c1000d4 +#define DDRC_INIT2(X) REG32(DDRC_BASE_ADDR(X) + 0xd8U) +#define DDRC_INIT2_0 0x5c0000d8 +#define DDRC_INIT2_1 0x5c1000d8 +#define DDRC_INIT3(X) REG32(DDRC_BASE_ADDR(X) + 0xdcU) +#define DDRC_INIT3_0 0x5c0000dc +#define DDRC_INIT3_1 0x5c1000dc +#define DDRC_INIT4(X) REG32(DDRC_BASE_ADDR(X) + 0xe0U) +#define DDRC_INIT4_0 0x5c0000e0 +#define DDRC_INIT4_1 0x5c1000e0 +#define DDRC_INIT5(X) REG32(DDRC_BASE_ADDR(X) + 0xe4U) +#define DDRC_INIT5_0 0x5c0000e4 +#define DDRC_INIT5_1 0x5c1000e4 +#define DDRC_INIT6(X) REG32(DDRC_BASE_ADDR(X) + 0xe8U) +#define DDRC_INIT6_0 0x5c0000e8 +#define DDRC_INIT6_1 0x5c1000e8 +#define DDRC_INIT7(X) REG32(DDRC_BASE_ADDR(X) + 0xecU) +#define DDRC_INIT7_0 0x5c0000ec +#define DDRC_INIT7_1 0x5c1000ec +#define DDRC_DIMMCTL(X) REG32(DDRC_BASE_ADDR(X) + 0xf0U) +#define DDRC_DIMMCTL_0 0x5c0000f0 +#define DDRC_DIMMCTL_1 0x5c1000f0 +#define DDRC_RANKCTL(X) REG32(DDRC_BASE_ADDR(X) + 0xf4U) +#define DDRC_RANKCTL_0 0x5c0000f4 +#define DDRC_RANKCTL_1 0x5c1000f4 +#define DDRC_DRAMTMG0(X) REG32(DDRC_BASE_ADDR(X) + 0x100U) +#define DDRC_DRAMTMG0_0 0x5c000100 +#define DDRC_DRAMTMG0_1 0x5c100100 +#define DDRC_DRAMTMG1(X) REG32(DDRC_BASE_ADDR(X) + 0x104U) +#define DDRC_DRAMTMG1_0 0x5c000104 +#define DDRC_DRAMTMG1_1 0x5c100104 +#define DDRC_DRAMTMG2(X) REG32(DDRC_BASE_ADDR(X) + 0x108U) +#define DDRC_DRAMTMG2_0 0x5c000108 +#define DDRC_DRAMTMG2_1 0x5c100108 +#define DDRC_DRAMTMG3(X) REG32(DDRC_BASE_ADDR(X) + 0x10cU) +#define DDRC_DRAMTMG3_0 0x5c00010c +#define DDRC_DRAMTMG3_1 0x5c10010c +#define DDRC_DRAMTMG4(X) REG32(DDRC_BASE_ADDR(X) + 0x110U) +#define DDRC_DRAMTMG4_0 0x5c000110 +#define DDRC_DRAMTMG4_1 0x5c100110 +#define DDRC_DRAMTMG5(X) REG32(DDRC_BASE_ADDR(X) + 0x114U) +#define DDRC_DRAMTMG5_0 0x5c000114 +#define DDRC_DRAMTMG5_1 0x5c100114 +#define DDRC_DRAMTMG6(X) REG32(DDRC_BASE_ADDR(X) + 0x118U) +#define DDRC_DRAMTMG6_0 0x5c000118 +#define DDRC_DRAMTMG6_1 0x5c100118 +#define DDRC_DRAMTMG7(X) REG32(DDRC_BASE_ADDR(X) + 0x11cU) +#define DDRC_DRAMTMG7_0 0x5c00011c +#define DDRC_DRAMTMG7_1 0x5c10011c +#define DDRC_DRAMTMG8(X) REG32(DDRC_BASE_ADDR(X) + 0x120U) +#define DDRC_DRAMTMG8_0 0x5c000120 +#define DDRC_DRAMTMG8_1 0x5c100120 +#define DDRC_DRAMTMG9(X) REG32(DDRC_BASE_ADDR(X) + 0x124U) +#define DDRC_DRAMTMG9_0 0x5c000124 +#define DDRC_DRAMTMG9_1 0x5c100124 +#define DDRC_DRAMTMG10(X) REG32(DDRC_BASE_ADDR(X) + 0x128U) +#define DDRC_DRAMTMG10_0 0x5c000128 +#define DDRC_DRAMTMG10_1 0x5c100128 +#define DDRC_DRAMTMG11(X) REG32(DDRC_BASE_ADDR(X) + 0x12cU) +#define DDRC_DRAMTMG11_0 0x5c00012c +#define DDRC_DRAMTMG11_1 0x5c10012c +#define DDRC_DRAMTMG12(X) REG32(DDRC_BASE_ADDR(X) + 0x130U) +#define DDRC_DRAMTMG12_0 0x5c000130 +#define DDRC_DRAMTMG12_1 0x5c100130 +#define DDRC_DRAMTMG13(X) REG32(DDRC_BASE_ADDR(X) + 0x134U) +#define DDRC_DRAMTMG13_0 0x5c000134 +#define DDRC_DRAMTMG13_1 0x5c100134 +#define DDRC_DRAMTMG14(X) REG32(DDRC_BASE_ADDR(X) + 0x138U) +#define DDRC_DRAMTMG14_0 0x5c000138 +#define DDRC_DRAMTMG14_1 0x5c100138 +#define DDRC_DRAMTMG15(X) REG32(DDRC_BASE_ADDR(X) + 0x13CU) +#define DDRC_DRAMTMG15_0 0x5c00013c +#define DDRC_DRAMTMG15_1 0x5c10013c +#define DDRC_DRAMTMG16(X) REG32(DDRC_BASE_ADDR(X) + 0x140U) +#define DDRC_DRAMTMG16_0 0x5c000140 +#define DDRC_DRAMTMG16_1 0x5c100140 +// +#define DDRC_ZQCTL0(X) REG32(DDRC_BASE_ADDR(X) + 0x180U) +#define DDRC_ZQCTL0_0 0x5c000180 +#define DDRC_ZQCTL0_1 0x5c100180 +#define DDRC_ZQCTL1(X) REG32(DDRC_BASE_ADDR(X) + 0x184U) +#define DDRC_ZQCTL1_0 0x5c000184 +#define DDRC_ZQCTL1_1 0x5c100184 +#define DDRC_ZQCTL2(X) REG32(DDRC_BASE_ADDR(X) + 0x188U) +#define DDRC_ZQCTL2_0 0x5c000188 +#define DDRC_ZQCTL2_1 0x5c100188 +#define DDRC_ZQSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x18cU) +#define DDRC_ZQSTAT_0 0x5c00018c +#define DDRC_ZQSTAT_1 0x5c10018c +#define DDRC_DFITMG0(X) REG32(DDRC_BASE_ADDR(X) + 0x190U) +#define DDRC_DFITMG0_0 0x5c000190 +#define DDRC_DFITMG0_1 0x5c100190 +#define DDRC_DFITMG1(X) REG32(DDRC_BASE_ADDR(X) + 0x194U) +#define DDRC_DFITMG1_0 0x5c000194 +#define DDRC_DFITMG1_1 0x5c100194 +#define DDRC_DFILPCFG0(X) REG32(DDRC_BASE_ADDR(X) + 0x198U) +#define DDRC_DFILPCFG0_0 0x5c000198 +#define DDRC_DFILPCFG0_1 0x5c100198 +#define DDRC_DFILPCFG1(X) REG32(DDRC_BASE_ADDR(X) + 0x19cU) +#define DDRC_DFILPCFG1_0 0x5c00019c +#define DDRC_DFILPCFG1_1 0x5c10019c +#define DDRC_DFIUPD0(X) REG32(DDRC_BASE_ADDR(X) + 0x1a0U) +#define DDRC_DFIUPD0_0 0x5c0001a0 +#define DDRC_DFIUPD0_1 0x5c1001a0 +#define DDRC_DFIUPD1(X) REG32(DDRC_BASE_ADDR(X) + 0x1a4U) +#define DDRC_DFIUPD1_0 0x5c0001a4 +#define DDRC_DFIUPD1_1 0x5c1001a4 +#define DDRC_DFIUPD2(X) REG32(DDRC_BASE_ADDR(X) + 0x1a8U) +#define DDRC_DFIUPD2_0 0x5c0001a8 +#define DDRC_DFIUPD2_1 0x5c1001a8 +#define DDRC_DFIUPD3(X) REG32(DDRC_BASE_ADDR(X) + 0x1acU) // iMX8 hasn't it +#define DDRC_DFIMISC(X) REG32(DDRC_BASE_ADDR(X) + 0x1b0U) +#define DDRC_DFIMISC_0 0x5c0001b0 +#define DDRC_DFIMISC_1 0x5c1001b0 +#define DDRC_DFITMG2(X) REG32(DDRC_BASE_ADDR(X) + 0x1b4U) +#define DDRC_DFITMG2_0 0x5c0001b4 +#define DDRC_DFITMG2_1 0x5c1001b4 +#define DDRC_DFITMG3(X) REG32(DDRC_BASE_ADDR(X) + 0x1b8U) +#define DDRC_DFITMG3_0 0x5c0001b8 +#define DDRC_DFITMG3_1 0x5c1001b8 +// +#define DDRC_DBICTL(X) REG32(DDRC_BASE_ADDR(X) + 0x1c0U) +#define DDRC_DBICTL_0 0x5c0001c0 +#define DDRC_DBICTL_1 0x5c1001c0 +#define DDRC_TRAINCTL0(X) REG32(DDRC_BASE_ADDR(X) + 0x1d0U) +#define DDRC_TRAINCTL0_0 0x5c0001d0 +#define DDRC_TRAINCTL0_1 0x5c1001d0 +#define DDRC_TRAINCTL1(X) REG32(DDRC_BASE_ADDR(X) + 0x1d4U) +#define DDRC_TRAINCTL1_0 0x5c0001d4 +#define DDRC_TRAINCTL1_1 0x5c1001d4 +#define DDRC_TRAINCTL2(X) REG32(DDRC_BASE_ADDR(X) + 0x1d8U) +#define DDRC_TRAINCTL2_0 0x5c0001d8 +#define DDRC_TRAINCTL2_1 0x5c1001d8 +#define DDRC_TRAINSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x1dcU) +#define DDRC_TRAINSTAT_0 0x5c0001dc +#define DDRC_TRAINSTAT_1 0x5c1001dc +#define DDRC_ADDRMAP0(X) REG32(DDRC_BASE_ADDR(X) + 0x200U) +#define DDRC_ADDRMAP0_0 0x5c000200 +#define DDRC_ADDRMAP0_1 0x5c100200 +#define DDRC_ADDRMAP1(X) REG32(DDRC_BASE_ADDR(X) + 0x204U) +#define DDRC_ADDRMAP1_0 0x5c000204 +#define DDRC_ADDRMAP1_1 0x5c100204 +#define DDRC_ADDRMAP2(X) REG32(DDRC_BASE_ADDR(X) + 0x208U) +#define DDRC_ADDRMAP2_0 0x5c000208 +#define DDRC_ADDRMAP2_1 0x5c100208 +#define DDRC_ADDRMAP3(X) REG32(DDRC_BASE_ADDR(X) + 0x20cU) +#define DDRC_ADDRMAP3_0 0x5c00020c +#define DDRC_ADDRMAP3_1 0x5c10020c +#define DDRC_ADDRMAP4(X) REG32(DDRC_BASE_ADDR(X) + 0x210U) +#define DDRC_ADDRMAP4_0 0x5c000210 +#define DDRC_ADDRMAP4_1 0x5c100210 +#define DDRC_ADDRMAP5(X) REG32(DDRC_BASE_ADDR(X) + 0x214U) +#define DDRC_ADDRMAP5_0 0x5c000214 +#define DDRC_ADDRMAP5_1 0x5c100214 +#define DDRC_ADDRMAP6(X) REG32(DDRC_BASE_ADDR(X) + 0x218U) +#define DDRC_ADDRMAP6_0 0x5c000218 +#define DDRC_ADDRMAP6_1 0x5c100218 +#define DDRC_ADDRMAP7(X) REG32(DDRC_BASE_ADDR(X) + 0x21cU) +#define DDRC_ADDRMAP7_0 0x5c00021c +#define DDRC_ADDRMAP7_1 0x5c10021c +#define DDRC_ADDRMAP8(X) REG32(DDRC_BASE_ADDR(X) + 0x220U) +#define DDRC_ADDRMAP8_0 0x5c000220 +#define DDRC_ADDRMAP8_1 0x5c100220 +#define DDRC_ADDRMAP9(X) REG32(DDRC_BASE_ADDR(X) + 0x224U) +#define DDRC_ADDRMAP9_0 0x5c000224 +#define DDRC_ADDRMAP9_1 0x5c100224 +#define DDRC_ADDRMAP10(X) REG32(DDRC_BASE_ADDR(X) + 0x228U) +#define DDRC_ADDRMAP10_0 0x5c000228 +#define DDRC_ADDRMAP10_1 0x5c100228 +#define DDRC_ADDRMAP11(X) REG32(DDRC_BASE_ADDR(X) + 0x22cU) +#define DDRC_ADDRMAP11_0 0x5c00022c +#define DDRC_ADDRMAP11_1 0x5c10022c +// +#define DDRC_ODTCFG(X) REG32(DDRC_BASE_ADDR(X) + 0x240U) +#define DDRC_ODTCFG_0 0x5c000240 +#define DDRC_ODTCFG_1 0x5c100240 +#define DDRC_ODTMAP(X) REG32(DDRC_BASE_ADDR(X) + 0x244U) +#define DDRC_ODTMAP_0 0x5c000244 +#define DDRC_ODTMAP_1 0x5c100244 +#define DDRC_SCHED(X) REG32(DDRC_BASE_ADDR(X) + 0x250U) +#define DDRC_SCHED_0 0x5c000250 +#define DDRC_SCHED_1 0x5c100250 +#define DDRC_SCHED1(X) REG32(DDRC_BASE_ADDR(X) + 0x254U) +#define DDRC_SCHED1_0 0x5c000254 +#define DDRC_SCHED1_1 0x5c100254 +#define DDRC_PERFHPR1(X) REG32(DDRC_BASE_ADDR(X) + 0x25cU) +#define DDRC_PERFHPR1_0 0x5c00025c +#define DDRC_PERFHPR1_1 0x5c10025c +#define DDRC_PERFLPR1(X) REG32(DDRC_BASE_ADDR(X) + 0x264U) +#define DDRC_PERFLPR1_0 0x5c000264 +#define DDRC_PERFLPR1_1 0x5c100264 +#define DDRC_PERFWR1(X) REG32(DDRC_BASE_ADDR(X) + 0x26cU) +#define DDRC_PERFWR1_0 0x5c00026c +#define DDRC_PERFWR1_1 0x5c10026c +#define DDRC_PERFVPR1(X) REG32(DDRC_BASE_ADDR(X) + 0x274U) +#define DDRC_PERFVPR1_0 0x5c000274 +#define DDRC_PERFVPR1_1 0x5c100274 +// +#define DDRC_PERFVPW1(X) REG32(DDRC_BASE_ADDR(X) + 0x278U) +#define DDRC_PERFVPW1_0 0x5c000278 +#define DDRC_PERFVPW1_1 0x5c100278 +// +#define DDRC_DQMAP0(X) REG32(DDRC_BASE_ADDR(X) + 0x280U) +#define DDRC_DQMAP0_0 0x5c000280 +#define DDRC_DQMAP0_1 0x5c100280 +#define DDRC_DQMAP1(X) REG32(DDRC_BASE_ADDR(X) + 0x284U) +#define DDRC_DQMAP1_0 0x5c000284 +#define DDRC_DQMAP1_1 0x5c100284 +#define DDRC_DQMAP2(X) REG32(DDRC_BASE_ADDR(X) + 0x288U) +#define DDRC_DQMAP2_0 0x5c000288 +#define DDRC_DQMAP2_1 0x5c100288 +#define DDRC_DQMAP3(X) REG32(DDRC_BASE_ADDR(X) + 0x28cU) +#define DDRC_DQMAP3_0 0x5c00028c +#define DDRC_DQMAP3_1 0x5c10028c +#define DDRC_DQMAP4(X) REG32(DDRC_BASE_ADDR(X) + 0x290U) +#define DDRC_DQMAP4_0 0x5c000290 +#define DDRC_DQMAP4_1 0x5c100290 +#define DDRC_DQMAP5(X) REG32(DDRC_BASE_ADDR(X) + 0x294U) +#define DDRC_DQMAP5_0 0x5c000294 +#define DDRC_DQMAP5_1 0x5c100294 +#define DDRC_DBG0(X) REG32(DDRC_BASE_ADDR(X) + 0x300U) +#define DDRC_DBG0_0 0x5c000300 +#define DDRC_DBG0_1 0x5c100300 +#define DDRC_DBG1(X) REG32(DDRC_BASE_ADDR(X) + 0x304U) +#define DDRC_DBG1_0 0x5c000304 +#define DDRC_DBG1_1 0x5c100304 +#define DDRC_DBGCAM(X) REG32(DDRC_BASE_ADDR(X) + 0x308U) +#define DDRC_DBGCAM_0 0x5c000308 +#define DDRC_DBGCAM_1 0x5c100308 +#define DDRC_DBGCMD(X) REG32(DDRC_BASE_ADDR(X) + 0x30cU) +#define DDRC_DBGCMD_0 0x5c00030c +#define DDRC_DBGCMD_1 0x5c10030c +#define DDRC_DBGSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x310U) +#define DDRC_DBGSTAT_0 0x5c000310 +#define DDRC_DBGSTAT_1 0x5c100310 +// +#define DDRC_SWCTL(X) REG32(DDRC_BASE_ADDR(X) + 0x320U) +#define DDRC_SWCTL_0 0x5c000320 +#define DDRC_SWCTL_1 0x5c100320 +#define DDRC_SWSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x324U) +#define DDRC_SWSTAT_0 0x5c000324 +#define DDRC_SWSTAT_1 0x5c100324 +#define DDRC_OCPARCFG0(X) REG32(DDRC_BASE_ADDR(X) + 0x330U) +#define DDRC_OCPARCFG0_0 0x5c000330 +#define DDRC_OCPARCFG0_1 0x5c100330 +#define DDRC_OCPARCFG1(X) REG32(DDRC_BASE_ADDR(X) + 0x334U) +#define DDRC_OCPARCFG1_0 0x5c000334 +#define DDRC_OCPARCFG1_1 0x5c100334 +#define DDRC_OCPARCFG2(X) REG32(DDRC_BASE_ADDR(X) + 0x338U) +#define DDRC_OCPARCFG2_0 0x5c000338 +#define DDRC_OCPARCFG2_1 0x5c100338 +#define DDRC_OCPARCFG3(X) REG32(DDRC_BASE_ADDR(X) + 0x33cU) +#define DDRC_OCPARCFG3_0 0x5c00033c +#define DDRC_OCPARCFG3_1 0x5c10033c +#define DDRC_OCPARSTAT0(X) REG32(DDRC_BASE_ADDR(X) + 0x340U) +#define DDRC_OCPARSTAT0_0 0x5c000340 +#define DDRC_OCPARSTAT0_1 0x5c100340 +#define DDRC_OCPARSTAT1(X) REG32(DDRC_BASE_ADDR(X) + 0x344U) +#define DDRC_OCPARSTAT1_0 0x5c000344 +#define DDRC_OCPARSTAT1_1 0x5c100344 +#define DDRC_OCPARWLOG0(X) REG32(DDRC_BASE_ADDR(X) + 0x348U) +#define DDRC_OCPARWLOG0_0 0x5c000348 +#define DDRC_OCPARWLOG0_1 0x5c100348 +#define DDRC_OCPARWLOG1(X) REG32(DDRC_BASE_ADDR(X) + 0x34cU) +#define DDRC_OCPARWLOG1_0 0x5c00034c +#define DDRC_OCPARWLOG1_1 0x5c10034c +#define DDRC_OCPARWLOG2(X) REG32(DDRC_BASE_ADDR(X) + 0x350U) +#define DDRC_OCPARWLOG2_0 0x5c000350 +#define DDRC_OCPARWLOG2_1 0x5c100350 +#define DDRC_OCPARAWLOG0(X) REG32(DDRC_BASE_ADDR(X) + 0x354U) +#define DDRC_OCPARAWLOG0_0 0x5c000354 +#define DDRC_OCPARAWLOG0_1 0x5c100354 +#define DDRC_OCPARAWLOG1(X) REG32(DDRC_BASE_ADDR(X) + 0x358U) +#define DDRC_OCPARAWLOG1_0 0x5c000358 +#define DDRC_OCPARAWLOG1_1 0x5c100358 +#define DDRC_OCPARRLOG0(X) REG32(DDRC_BASE_ADDR(X) + 0x35cU) +#define DDRC_OCPARRLOG0_0 0x5c00035c +#define DDRC_OCPARRLOG0_1 0x5c10035c +#define DDRC_OCPARRLOG1(X) REG32(DDRC_BASE_ADDR(X) + 0x360U) +#define DDRC_OCPARRLOG1_0 0x5c000360 +#define DDRC_OCPARRLOG1_1 0x5c100360 +#define DDRC_OCPARARLOG0(X) REG32(DDRC_BASE_ADDR(X) + 0x364U) +#define DDRC_OCPARARLOG0_0 0x5c000364 +#define DDRC_OCPARARLOG0_1 0x5c100364 +#define DDRC_OCPARARLOG1(X) REG32(DDRC_BASE_ADDR(X) + 0x368U) +#define DDRC_OCPARARLOG1_0 0x5c000368 +#define DDRC_OCPARARLOG1_1 0x5c100368 + +#define DDRC_ECCAPSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x388U) +#define DDRC_ECCAPSTAT_0 0x5c000388 +#define DDRC_ECCAPSTAT_1 0x5c100388 +#define DDRC_PSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0x3fcU) +#define DDRC_PSTAT_0 0x5c0003fc +#define DDRC_PSTAT_1 0x5c1003fc +#define DDRC_PCCFG(X) REG32(DDRC_BASE_ADDR(X) + 0x400U) +#define DDRC_PCCFG_0 0x5c000400 +#define DDRC_PCCFG_1 0x5c100400 +#define DDRC_PCFGR_0(X) REG32(DDRC_BASE_ADDR(X) + 0x404U) +#define DDRC_PCFGR_0_0 0x5c000404 +#define DDRC_PCFGR_0_1 0x5c100404 +#define DDRC_PCFGR_1(X) REG32(DDRC_BASE_ADDR(X) + (1U*0xb0U)+0x404U) +#define DDRC_PCFGR_1_0 0x5c0004b4 +#define DDRC_PCFGR_1_1 0x5c1004b4 +#define DDRC_PCFGR_2(X) REG32(DDRC_BASE_ADDR(X) + (2U*0xb0U)+0x404U) +#define DDRC_PCFGR_2_0 0x5c000564 +#define DDRC_PCFGR_2_1 0x5c100564 +#define DDRC_PCFGR_3(X) REG32(DDRC_BASE_ADDR(X) + (3U*0xb0U)+0x404U) +#define DDRC_PCFGR_3_0 0x5c000614 +#define DDRC_PCFGR_3_1 0x5c100614 +#define DDRC_PCFGW_0(X) REG32(DDRC_BASE_ADDR(X) + 0x408U) +#define DDRC_PCFGW_0_0 0x5c000408 +#define DDRC_PCFGW_0_1 0x5c100408 +#define DDRC_PCFGW_1(X) REG32(DDRC_BASE_ADDR(X) + (1U*0xb0U)+0x408U) +#define DDRC_PCFGW_1_0 0x5c0004b8 +#define DDRC_PCFGW_1_1 0x5c1004b8 +#define DDRC_PCFGW_2(X) REG32(DDRC_BASE_ADDR(X) + (2U*0xb0U)+0x408U) +#define DDRC_PCFGW_2_0 0x5c000568 +#define DDRC_PCFGW_2_1 0x5c100568 +#define DDRC_PCFGW_3(X) REG32(DDRC_BASE_ADDR(X) + (3U*0xb0U)+0x408U) +#define DDRC_PCFGW_3_0 0x5c000618 +#define DDRC_PCFGW_3_1 0x5c100618 +#define DDRC_PCFGC_0(X) REG32(DDRC_BASE_ADDR(X) + 0x40cU) +#define DDRC_PCFGC_0_0 0x5c00040c +#define DDRC_PCFGC_0_1 0x5c10040c +#define DDRC_PCFGIDMASKCH(X) REG32(DDRC_BASE_ADDR(X) + 0x410U) +#define DDRC_PCFGIDMASKCH_0 0x5c000410 +#define DDRC_PCFGIDMASKCH_1 0x5c100410 +#define DDRC_PCFGIDVALUECH(X) REG32(DDRC_BASE_ADDR(X) + 0x414U) +#define DDRC_PCFGIDVALUECH_0 0x5c000414 +#define DDRC_PCFGIDVALUECH_1 0x5c100414 +#define DDRC_PCTRL_0(X) REG32(DDRC_BASE_ADDR(X) + 0x490U) +#define DDRC_PCTRL_0_0 0x5c000490 +#define DDRC_PCTRL_0_1 0x5c100490 +#define DDRC_PCTRL_1(X) REG32(DDRC_BASE_ADDR(X) + 0x490U + (1U*0xb0U)) +#define DDRC_PCTRL_1_0 0x5c000540 +#define DDRC_PCTRL_1_1 0x5c100540 +#define DDRC_PCTRL_2(X) REG32(DDRC_BASE_ADDR(X) + 0x490U + (2U*0xb0U)) +#define DDRC_PCTRL_2_0 0x5c0005f0 +#define DDRC_PCTRL_2_1 0x5c1005f0 +#define DDRC_PCTRL_3(X) REG32(DDRC_BASE_ADDR(X) + 0x490U + (3U*0xb0U)) +#define DDRC_PCTRL_3_0 0x5c0006a0 +#define DDRC_PCTRL_3_1 0x5c1006a0 +#define DDRC_PCFGQOS0_0(X) REG32(DDRC_BASE_ADDR(X) + 0x494U) +#define DDRC_PCFGQOS0_0_0 0x5c000494 +#define DDRC_PCFGQOS0_0_1 0x5c100494 +#define DDRC_PCFGQOS1_0(X) REG32(DDRC_BASE_ADDR(X) + 0x498U) +#define DDRC_PCFGQOS1_0_0 0x5c000498 +#define DDRC_PCFGQOS1_0_1 0x5c100498 +#define DDRC_PCFGWQOS0_0(X) REG32(DDRC_BASE_ADDR(X) + 0x49cU) +#define DDRC_PCFGWQOS0_0_0 0x5c00049c +#define DDRC_PCFGWQOS0_0_1 0x5c10049c +#define DDRC_PCFGWQOS1_0(X) REG32(DDRC_BASE_ADDR(X) + 0x4a0U) +#define DDRC_PCFGWQOS1_0_0 0x5c0004a0 +#define DDRC_PCFGWQOS1_0_1 0x5c1004a0 +#define DDRC_SARBASE0(X) REG32(DDRC_BASE_ADDR(X) + 0xf04U) +#define DDRC_SARBASE0_0 0x5c000f04 +#define DDRC_SARBASE0_1 0x5c100f04 +#define DDRC_SARSIZE0(X) REG32(DDRC_BASE_ADDR(X) + 0xf08U) +#define DDRC_SARSIZE0_0 0x5c000f08 +#define DDRC_SARSIZE0_1 0x5c100f08 +#define DDRC_SBRCTL(X) REG32(DDRC_BASE_ADDR(X) + 0xf24U) +#define DDRC_SBRCTL_0 0x5c000f24 +#define DDRC_SBRCTL_1 0x5c100f24 +#define DDRC_SBRSTAT(X) REG32(DDRC_BASE_ADDR(X) + 0xf28U) +#define DDRC_SBRSTAT_0 0x5c000f28 +#define DDRC_SBRSTAT_1 0x5c100f28 +#define DDRC_SBRWDATA0(X) REG32(DDRC_BASE_ADDR(X) + 0xf2cU) +#define DDRC_SBRWDATA0_0 0x5c000f2c +#define DDRC_SBRWDATA0_1 0x5c100f2c +#define DDRC_SBRWDATA1(X) REG32(DDRC_BASE_ADDR(X) + 0xf30U) +#define DDRC_SBRWDATA1_0 0x5c000f30 +#define DDRC_SBRWDATA1_1 0x5c100f30 +#define DDRC_PDCH(X) REG32(DDRC_BASE_ADDR(X) + 0xf34U) +#define DDRC_PDCH_0 0x5c000f34 +#define DDRC_PDCH_1 0x5c100f34 +#define DDRC_SBRSTART0(X) REG32(DDRC_BASE_ADDR(X) + 0xf38U) +#define DDRC_SBRSTART0_0 0x5c000f38 +#define DDRC_SBRSTART0_1 0x5c100f38 +#define DDRC_SBRSTART1(X) REG32(DDRC_BASE_ADDR(X) + 0xf3cU) +#define DDRC_SBRSTART1_0 0x5c000f3c +#define DDRC_SBRSTART1_1 0x5c100f3c +#define DDRC_SBRRANGE0(X) REG32(DDRC_BASE_ADDR(X) + 0xf40U) +#define DDRC_SBRRANGE0_0 0x5c000f40 +#define DDRC_SBRRANGE0_1 0x5c100f40 +#define DDRC_SBRRANGE1(X) REG32(DDRC_BASE_ADDR(X) + 0xf44U) +#define DDRC_SBRRANGE1_0 0x5c000f44 +#define DDRC_SBRRANGE1_1 0x5c100f44 + +#define DDRC_PCFGW_0_0_ADDR ((vuint8_t*)&(DDRC_PCFGW_0(0))) +#define DDRC_PCFGW_0_1_ADDR ((vuint8_t*)&(DDRC_PCFGW_0(1))) +#define DDRC_PCFGW_0_2_ADDR ((vuint8_t*)&(DDRC_PCFGW_0(2))) +#define DDRC_PCFGW_0_3_ADDR ((vuint8_t*)&(DDRC_PCFGW_0(3))) + +#define DDRC_MRCTRL1_0_ADDR ((vuint8_t*)&(DDRC_MRCTRL1(0))) +#define DDRC_MRCTRL1_1_ADDR ((vuint8_t*)&(DDRC_MRCTRL1(1))) +#define DDRC_MRCTRL1_2_ADDR ((vuint8_t*)&(DDRC_MRCTRL1(2))) +#define DDRC_MRCTRL1_3_ADDR ((vuint8_t*)&(DDRC_MRCTRL1(3))) + + +// SHADOW registers + +#define DDRC_DERATEEN_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2020U) +#define DDRC_DERATEEN_SHADOW_0 0x5c002020 +#define DDRC_DERATEEN_SHADOW_1 0x5c102020 +#define DDRC_DERATEINT_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2024U) +#define DDRC_DERATEINT_SHADOW_0 0x5c002024 +#define DDRC_DERATEINT_SHADOW_1 0x5c102024 +#define DDRC_RFSHCTL0_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2050U) +#define DDRC_RFSHCTL0_SHADOW_0 0x5c002050 +#define DDRC_RFSHCTL0_SHADOW_1 0x5c102050 +#define DDRC_RFSHTMG_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2064U) +#define DDRC_RFSHTMG_SHADOW_0 0x5c002064 +#define DDRC_RFSHTMG_SHADOW_1 0x5c102064 +#define DDRC_INIT3_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x20dcU) +#define DDRC_INIT3_SHADOW_0 0x5c0020dc +#define DDRC_INIT3_SHADOW_1 0x5c1020dc +#define DDRC_INIT4_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x20e0U) +#define DDRC_INIT4_SHADOW_0 0x5c0020e0 +#define DDRC_INIT4_SHADOW_1 0x5c1020e0 +#define DDRC_INIT6_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x20e8U) +#define DDRC_INIT6_SHADOW_0 0x5c0020e8 +#define DDRC_INIT6_SHADOW_1 0x5c1020e8 +#define DDRC_INIT7_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x20ecU) +#define DDRC_INIT7_SHADOW_0 0x5c0020ec +#define DDRC_INIT7_SHADOW_1 0x5c1020ec +#define DDRC_DRAMTMG0_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2100U) +#define DDRC_DRAMTMG0_SHADOW_0 0x5c002100 +#define DDRC_DRAMTMG0_SHADOW_1 0x5c102100 +#define DDRC_DRAMTMG1_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2104U) +#define DDRC_DRAMTMG1_SHADOW_0 0x5c002104 +#define DDRC_DRAMTMG1_SHADOW_1 0x5c102104 +#define DDRC_DRAMTMG2_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2108U) +#define DDRC_DRAMTMG2_SHADOW_0 0x5c002108 +#define DDRC_DRAMTMG2_SHADOW_1 0x5c102108 +#define DDRC_DRAMTMG3_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x210cU) +#define DDRC_DRAMTMG3_SHADOW_0 0x5c00210c +#define DDRC_DRAMTMG3_SHADOW_1 0x5c10210c +#define DDRC_DRAMTMG4_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2110U) +#define DDRC_DRAMTMG4_SHADOW_0 0x5c002110 +#define DDRC_DRAMTMG4_SHADOW_1 0x5c102110 +#define DDRC_DRAMTMG5_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2114U) +#define DDRC_DRAMTMG5_SHADOW_0 0x5c002114 +#define DDRC_DRAMTMG5_SHADOW_1 0x5c102114 +#define DDRC_DRAMTMG6_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2118U) +#define DDRC_DRAMTMG6_SHADOW_0 0x5c002118 +#define DDRC_DRAMTMG6_SHADOW_1 0x5c102118 +#define DDRC_DRAMTMG7_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x211cU) +#define DDRC_DRAMTMG7_SHADOW_0 0x5c00211c +#define DDRC_DRAMTMG7_SHADOW_1 0x5c10211c +#define DDRC_DRAMTMG8_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2120U) +#define DDRC_DRAMTMG8_SHADOW_0 0x5c002120 +#define DDRC_DRAMTMG8_SHADOW_1 0x5c102120 +#define DDRC_DRAMTMG9_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2124U) +#define DDRC_DRAMTMG9_SHADOW_0 0x5c002124 +#define DDRC_DRAMTMG9_SHADOW_1 0x5c102124 +#define DDRC_DRAMTMG10_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2128U) +#define DDRC_DRAMTMG10_SHADOW_0 0x5c002128 +#define DDRC_DRAMTMG10_SHADOW_1 0x5c102128 +#define DDRC_DRAMTMG11_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x212cU) +#define DDRC_DRAMTMG11_SHADOW_0 0x5c00212c +#define DDRC_DRAMTMG11_SHADOW_1 0x5c10212c +#define DDRC_DRAMTMG12_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2130U) +#define DDRC_DRAMTMG12_SHADOW_0 0x5c002130 +#define DDRC_DRAMTMG12_SHADOW_1 0x5c102130 +#define DDRC_DRAMTMG13_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2134U) +#define DDRC_DRAMTMG13_SHADOW_0 0x5c002134 +#define DDRC_DRAMTMG13_SHADOW_1 0x5c102134 +#define DDRC_DRAMTMG14_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2138U) +#define DDRC_DRAMTMG14_SHADOW_0 0x5c002138 +#define DDRC_DRAMTMG14_SHADOW_1 0x5c102138 +#define DDRC_DRAMTMG15_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x213CU) +#define DDRC_DRAMTMG15_SHADOW_0 0x5c00213c +#define DDRC_DRAMTMG15_SHADOW_1 0x5c10213c +#define DDRC_DRAMTMG16_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2140U) +#define DDRC_DRAMTMG16_SHADOW_0 0x5c002140 +#define DDRC_DRAMTMG16_SHADOW_1 0x5c102140 +#define DDRC_ZQCTL0_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2180U) +#define DDRC_ZQCTL0_SHADOW_0 0x5c002180 +#define DDRC_ZQCTL0_SHADOW_1 0x5c102180 +#define DDRC_DFITMG0_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2190U) +#define DDRC_DFITMG0_SHADOW_0 0x5c002190 +#define DDRC_DFITMG0_SHADOW_1 0x5c102190 +#define DDRC_DFITMG1_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2194U) +#define DDRC_DFITMG1_SHADOW_0 0x5c002194 +#define DDRC_DFITMG1_SHADOW_1 0x5c102194 +#define DDRC_DFITMG2_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x21b4U) +#define DDRC_DFITMG2_SHADOW_0 0x5c0021b4 +#define DDRC_DFITMG2_SHADOW_1 0x5c1021b4 +#define DDRC_DFITMG3_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x21b8U) +#define DDRC_DFITMG3_SHADOW_0 0x5c0021b8 +#define DDRC_DFITMG3_SHADOW_1 0x5c1021b8 +#define DDRC_ODTCFG_SHADOW(X) REG32(DDRC_BASE_ADDR(X) + 0x2240U) +#define DDRC_ODTCFG_SHADOW_0 0x5c002240 +#define DDRC_ODTCFG_SHADOW_1 0x5c102240 + +#endif + diff --git a/platform/devices/MX8/MX8_dma3.h b/platform/devices/MX8/MX8_dma3.h new file mode 100755 index 0000000..8a88bb9 --- /dev/null +++ b/platform/devices/MX8/MX8_dma3.h @@ -0,0 +1,180 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_DMA_REGISTERS_H +#define HW_DMA_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- DMA Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DMA_Peripheral_Access_Layer DMA Peripheral Access Layer + * @{ + */ + +/** DMA - Register Layout Typedef */ +typedef struct { + __IO uint32_t MP_CSR; /**< offset: 0x0 */ + __I uint32_t MP_ES; /**< offset: 0x4 */ + uint8_t RESERVED_0[4]; + __I uint32_t MP_HRS; /**< offset: 0xC */ + uint8_t RESERVED_1[240]; + __IO uint32_t CH_GRPRI[32]; /**< offset: 0x100 */ + uint8_t RESERVED_2[65152]; + struct { /**< offset: 0x10000 */ + __IO uint32_t CH_CSR; /**< offset: 0x0 */ + __IO uint32_t CH_ES; /**< offset: 0x4 */ + __IO uint32_t CH_INT; /**< offset: 0x8 */ + __IO uint32_t CH_SBR; /**< offset: 0xC */ + __IO uint32_t CH_PRI; /**< offset: 0x10 */ + uint8_t RESERVED_3[12]; + __IO uint32_t TCD_SADDR; /**< offset: 0x20 */ + __IO uint16_t TCD_SOFF; /**< offset: 0x24 */ + __IO uint16_t TCD_ATTR; /**< offset: 0x26 */ + __IO uint32_t TCD_NBYTES_MLOFFNO; /**< offset: 0x28 */ + __IO uint32_t TCD_SLAST_SDA; /**< offset: 0x2C */ + __IO uint32_t TCD_DADDR; /**< offset: 0x30 */ + __IO uint16_t TCD_DOFF; /**< offset: 0x34 */ + __IO uint16_t TCD_CITER_ELINKNO; /**< offset: 0x36 */ + __IO uint32_t TCD_DLAST_SGA; /**< offset: 0x38 */ + __IO uint16_t TCD_CSR; /**< offset: 0x3C */ + __IO uint16_t TCD_BITER_ELINKNO; /**< offset: 0x3E */ + uint8_t RESERVED_4[65472]; + } CH[32]; +} DMA_Type; + +/* ---------------------------------------------------------------------------- + -- DMA Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DMA_Register_Masks DMA Register Masks + * @{ + */ + +/*! @name MP_CSR - Management Page Control Register */ +#define DMA_MP_CSR_EBW_MASK (0x00000001U) +#define DMA_MP_CSR_EBW_SHIFT (0U) +#define DMA_MP_CSR_EBW(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_EBW_SHIFT)) & DMA_MP_CSR_EBW_MASK) +#define DMA_MP_CSR_EDBG_MASK (0x00000002U) +#define DMA_MP_CSR_EDBG_SHIFT (1U) +#define DMA_MP_CSR_EDBG(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_EDBG_SHIFT)) & DMA_MP_CSR_EDBG_MASK) +#define DMA_MP_CSR_ERCA_MASK (0x00000004U) +#define DMA_MP_CSR_ERCA_SHIFT (2U) +#define DMA_MP_CSR_ERCA(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ERCA_SHIFT)) & DMA_MP_CSR_ERCA_MASK) +#define DMA_MP_CSR_HAE_MASK (0x00000010U) +#define DMA_MP_CSR_HAE_SHIFT (4U) +#define DMA_MP_CSR_HAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_HAE_SHIFT)) & DMA_MP_CSR_HAE_MASK) +#define DMA_MP_CSR_HALT_MASK (0x00000020U) +#define DMA_MP_CSR_HALT_SHIFT (5U) +#define DMA_MP_CSR_HALT(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_HALT_SHIFT)) & DMA_MP_CSR_HALT_MASK) +#define DMA_MP_CSR_ECL_MASK (0x00000040U) +#define DMA_MP_CSR_ECL_SHIFT (6U) +#define DMA_MP_CSR_ECL(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ECL_SHIFT)) & DMA_MP_CSR_ECL_MASK) +#define DMA_MP_CSR_EMI_MASK (0x00000080U) +#define DMA_MP_CSR_EMI_SHIFT (7U) +#define DMA_MP_CSR_EMI(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_EMI_SHIFT)) & DMA_MP_CSR_EMI_MASK) +#define DMA_MP_CSR_ECX_MASK (0x00000100U) +#define DMA_MP_CSR_ECX_SHIFT (8U) +#define DMA_MP_CSR_ECX(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ECX_SHIFT)) & DMA_MP_CSR_ECX_MASK) +#define DMA_MP_CSR_CX_MASK (0x00000200U) +#define DMA_MP_CSR_CX_SHIFT (9U) +#define DMA_MP_CSR_CX(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_CX_SHIFT)) & DMA_MP_CSR_CX_MASK) +#define DMA_MP_CSR_ACTIVE_ID_MASK (0x1F000000U) +#define DMA_MP_CSR_ACTIVE_ID_SHIFT (24U) +#define DMA_MP_CSR_ACTIVE_ID(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ACTIVE_ID_SHIFT)) & DMA_MP_CSR_ACTIVE_ID_MASK) +#define DMA_MP_CSR_ACTIVE_MASK (0x80000000U) +#define DMA_MP_CSR_ACTIVE_SHIFT (31U) +#define DMA_MP_CSR_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ACTIVE_SHIFT)) & DMA_MP_CSR_ACTIVE_MASK) + +/*! @name GRPRI - Channel Arbitration Group */ +#define DMA_CH_GRPRI_GRPRI_MASK (0x0000001FU) +#define DMA_CH_GRPRI_GRPRI_SHIFT (0U) +#define DMA_CH_GRPRI_GRPRI(x) (((uint32_t)(((uint32_t)(x)) << DMA_GRPRI_GRPRI_SHIFT)) & DMA_GRPRI_GRPRI_MASK) + +/*! + * @} + */ /* end of group DMA_Register_Masks */ + + +/* DMA - Peripheral instance base addresses */ +/** Peripheral DMA0 base pointer */ +#define DMA0 ((DMA_Type *)DMA0_BASE) +/** Peripheral DMA1 base pointer */ +#define DMA1 ((DMA_Type *)DMA1_BASE) +/** Peripheral DMA2 base pointer */ +#define DMA2 ((DMA_Type *)DMA2_BASE) +/** Peripheral DMA3 base pointer */ +#define DMA3 ((DMA_Type *)DMA3_BASE) +/** Peripheral DMA4 base pointer */ +#define DMA4 ((DMA_Type *)DMA4_BASE) +/** Peripheral DMA5 base pointer */ +#define DMA5 ((DMA_Type *)DMA5_BASE) +/** Peripheral DMA6 base pointer */ +#define DMA6 ((DMA_Type *)DMA6_BASE) +/** Array initializer of DMA peripheral base addresses */ +#define DMA_BASE_ADDRS { DMA0_BASE, \ + DMA1_BASE, \ + DMA2_BASE, \ + DMA3_BASE, \ + DMA4_BASE, \ + DMA5_BASE, \ + DMA6_BASE} +/** Array initializer of DMA peripheral base pointers */ +#define DMA_BASE_PTRS { DMA0, \ + DMA1, \ + DMA2, \ + DMA3, \ + DMA4, \ + DMA5, \ + DMA6} + +/*! + * @} + */ /* end of group DMA_Peripheral_Access_Layer */ + +#endif /* HW_DMA_REGISTERS_H */ diff --git a/platform/devices/MX8/MX8_drc.h b/platform/devices/MX8/MX8_drc.h new file mode 100755 index 0000000..04d2db6 --- /dev/null +++ b/platform/devices/MX8/MX8_drc.h @@ -0,0 +1,242 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2018 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_DRC_REGISTERS_H +#define HW_DRC_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- DRC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DRC_Peripheral_Access_Layer DRC Peripheral Access Layer + * @{ + */ +typedef struct { + uint32_t mstr; + uint32_t derateen; + uint32_t derateint; + uint32_t rfshctl0; + uint32_t rfshtmg; + uint32_t init0; + uint32_t init1; + uint32_t init3; + uint32_t init4; + uint32_t init5; + uint32_t init6; + uint32_t init7; + uint32_t rankctl; + uint32_t dramtmg0; + uint32_t dramtmg1; + uint32_t dramtmg2; + uint32_t dramtmg3; + uint32_t dramtmg4; + uint32_t dramtmg5; + uint32_t dramtmg6; + uint32_t dramtmg7; + uint32_t dramtmg8; + uint32_t dramtmg9; + uint32_t dramtmg11; + uint32_t dramtmg12; + uint32_t dramtmg13; + uint32_t dramtmg14; + uint32_t zqctl0; + uint32_t zqctl1; + uint32_t dfitmg0; + uint32_t dfitmg1; + uint32_t dfitmg2; + uint32_t dfitmg3; + uint32_t dfimisc; + uint32_t dfiupd0; + uint32_t dfiupd1; + uint32_t dfiupd2; + uint32_t addrmap0; + uint32_t addrmap1; + uint32_t addrmap2; + uint32_t addrmap3; + uint32_t addrmap4; + uint32_t addrmap5; + uint32_t addrmap6; + uint32_t addrmap7; + uint32_t addrmap8; + uint32_t ecccfg0; + uint32_t dbictl; + uint32_t odtcfg; + uint32_t odtmap; + uint32_t sched; + uint32_t pctrl_0; + uint32_t hwlpctl; + uint32_t dfilpcfg0; + uint32_t dfitmg0_shadow; + uint32_t pwrctl; + uint32_t pwrtmg; + uint32_t gpr_qchan; +} ddrc; + +typedef struct{ + uint32_t dx0gcr0; + uint32_t dx1gcr0; + uint32_t dx2gcr0; + uint32_t dx3gcr0; + uint32_t dx4gcr0; + uint32_t dx0gcr1; + uint32_t dx1gcr1; + uint32_t dx2gcr1; + uint32_t dx3gcr1; + uint32_t dx4gcr1; + uint32_t dx2gcr2; + uint32_t dx3gcr2; + uint32_t dx4gcr2; + uint32_t dx2gcr3; + uint32_t dx3gcr3; + uint32_t dx4gcr3; + uint32_t dcr; + uint32_t pgcr8; + uint32_t dx0dqmap0; + uint32_t dx0dqmap1; + uint32_t dx1dqmap0; + uint32_t dx1dqmap1; + uint32_t dx2dqmap0; + uint32_t dx2dqmap1; + uint32_t dx3dqmap0; + uint32_t dx3dqmap1; + uint32_t dx4dqmap0; + uint32_t dx4dqmap1; + uint32_t catr0; + uint32_t catr1; + uint32_t pgcr0; + uint32_t pgcr1; + uint32_t pgcr2; + uint32_t pgcr3; + uint32_t pgcr4; + uint32_t pgcr5; + uint32_t pgcr6; + uint32_t ptr0; + uint32_t ptr1; + uint32_t pllcr0; + uint32_t dxccr; + uint32_t dx8sl0pllcr0; + uint32_t dx8sl1pllcr0; + uint32_t dx8sl2pllcr0; + uint32_t zqcr; + uint32_t zq0pr0; + uint32_t zq1pr0; + uint32_t zq0dr0; + uint32_t zq0dr1; + uint32_t zq1dr0; + uint32_t zq1dr1; + uint32_t mr0; + uint32_t mr1; + uint32_t mr2; + uint32_t mr3; + uint32_t mr4; + uint32_t mr5; + uint32_t mr6; + uint32_t mr11; + uint32_t mr13; + uint32_t mr22; + uint32_t mr12; + uint32_t mr14; + uint32_t dtpr0; + uint32_t dtpr1; + uint32_t dtpr2; + uint32_t dtpr3; + uint32_t dtpr4; + uint32_t dtpr5; + uint32_t ptr2; + uint32_t ptr3; + uint32_t ptr4; + uint32_t ptr5; + uint32_t ptr6; + uint32_t rankidr; + uint32_t odtcr; + uint32_t aciocr0; + uint32_t aciocr1; + uint32_t aciocr2; + uint32_t aciocr3; + uint32_t aciocr5; + uint32_t riocr2; + uint32_t riocr5; + uint32_t iovcr0; + uint32_t vtcr0; + uint32_t vtcr1; + uint32_t dx0gcr5; + uint32_t dx1gcr5; + uint32_t dx2gcr5; + uint32_t dx3gcr5; + uint32_t dx4gcr5; + uint32_t dx0gcr4; + uint32_t dx1gcr4; + uint32_t dx2gcr4; + uint32_t dx3gcr4; + uint32_t dx4gcr4; + uint32_t dqsdr0; + uint32_t dqsdr1; + uint32_t dqsdr2; + uint32_t bistar1; + uint32_t bistar2; + uint32_t bistar4; + uint32_t dtcr0; + uint32_t dtcr1; + uint32_t dx8slbdxctl2; + uint32_t dx8slbiocr; + uint32_t aclcdlr; + uint32_t acbdlr3; + uint32_t acbdlr6; + uint32_t acbdlr7; + uint32_t acbdlr8; + uint32_t acbdlr9; +} ddr_phy; + +#define MR11_ADDR 0xB + +/*! + * @} + */ /* end of group DRC_Peripheral_Access_Layer */ + +#endif /* HW_DRC_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_drc_perf.h b/platform/devices/MX8/MX8_drc_perf.h new file mode 100755 index 0000000..6a3d908 --- /dev/null +++ b/platform/devices/MX8/MX8_drc_perf.h @@ -0,0 +1,65 @@ +/* +** ################################################################### +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of Freescale Semiconductor, Inc. nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** ################################################################### +*/ + +#ifndef HW_DRC_PERF_REGISTERS_H +#define HW_DRC_PERF_REGISTERS_H + +#define DRC_PERF_COUNTER_BASE_ADDR(X) (0x5c000000U + (((X) * 0x100000U) + 0x20000U)) + +#define DRC_PERF_COUNTER_0_CR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x00U) +#define DRC_PERF_COUNTER_1_CR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x04U) +#define DRC_PERF_COUNTER_2_CR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x08U) +#define DRC_PERF_COUNTER_3_CR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x0cU) +#define DRC_PERF_COUNTER_0_DR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x20U) +#define DRC_PERF_COUNTER_1_DR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x24U) +#define DRC_PERF_COUNTER_2_DR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x28U) +#define DRC_PERF_COUNTER_3_DR(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x2cU) +#define DRC_PERF_COUNTER_MRR_0_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x40U) +#define DRC_PERF_COUNTER_MRR_1_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x44U) +#define DRC_PERF_COUNTER_MRR_2_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x48U) +#define DRC_PERF_COUNTER_MRR_3_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x4cU) +#define DRC_PERF_COUNTER_MRR_4_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x50U) +#define DRC_PERF_COUNTER_MRR_5_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x54U) +#define DRC_PERF_COUNTER_MRR_6_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x58U) +#define DRC_PERF_COUNTER_MRR_7_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x5cU) +#define DRC_PERF_COUNTER_MRR_8_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x60U) +#define DRC_PERF_COUNTER_MRR_9_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x64U) +#define DRC_PERF_COUNTER_MRR_10_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x68U) +#define DRC_PERF_COUNTER_MRR_11_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x6cU) +#define DRC_PERF_COUNTER_MRR_12_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x70U) +#define DRC_PERF_COUNTER_MRR_13_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x74U) +#define DRC_PERF_COUNTER_MRR_14_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x78U) +#define DRC_PERF_COUNTER_MRR_15_DATA(X) REG32(DRC_PERF_COUNTER_BASE_ADDR(X) + 0x7cU) + +#endif + diff --git a/platform/devices/MX8/MX8_dsc.h b/platform/devices/MX8/MX8_dsc.h new file mode 100755 index 0000000..3894616 --- /dev/null +++ b/platform/devices/MX8/MX8_dsc.h @@ -0,0 +1,1083 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for the DSC +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_dsc.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for the DSC + * + * CMSIS Peripheral Access Layer for the DSC + */ + +#ifndef HW_DSC_REGISTERS_H +#define HW_DSC_REGISTERS_H /**< Symbol preventing repeated inclusion */ + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +#define DSC_MAX_PD 8 //!< Max number of power domains + +/* ---------------------------------------------------------------------------- + -- DSC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DSC_Peripheral_Access_Layer DSC Peripheral Access Layer + * @{ + */ + +/** DSC - Register Layout Typedef */ +typedef struct { + struct { /* offset: 0x0 */ + __IO uint32_t RW; /**< Reset Control: MSlice and CSlice resetn bits, offset: 0x0 */ + __IO uint32_t SET; /**< Reset Control: MSlice and CSlice resetn bits, offset: 0x4 */ + __IO uint32_t CLR; /**< Reset Control: MSlice and CSlice resetn bits, offset: 0x8 */ + __IO uint32_t TOG; /**< Reset Control: MSlice and CSlice resetn bits, offset: 0xC */ + } RST_CTRL_SLICE_RSTN[3]; + struct { /* offset: 0x30 */ + __IO uint32_t RW; /**< Reset Control: Clock Root reset bits., offset: 0x30 */ + __IO uint32_t SET; /**< Reset Control: Clock Root reset bits., offset: 0x34 */ + __IO uint32_t CLR; /**< Reset Control: Clock Root reset bits., offset: 0x38 */ + __IO uint32_t TOG; /**< Reset Control: Clock Root reset bits., offset: 0x3C */ + } RST_CTRL_CR_RSTN; + struct { /* offset: 0x40 */ + __IO uint32_t RW; /**< Reset Control: Subsystem resets, offset: 0x40 */ + __IO uint32_t SET; /**< Reset Control: Subsystem resets, offset: 0x44 */ + __IO uint32_t CLR; /**< Reset Control: Subsystem resets, offset: 0x48 */ + __IO uint32_t TOG; /**< Reset Control: Subsystem resets, offset: 0x4C */ + } RST_CTRL_SS_RSTN; + uint8_t RESERVED_0[176]; + struct { /* offset: 0x100 */ + __IO uint32_t RW; /**< Reset Control: MSlice and CSlice select functional clock mux bits., offset: 0x100 */ + __IO uint32_t SET; /**< Reset Control: MSlice and CSlice select functional clock mux bits., offset: 0x104 */ + __IO uint32_t CLR; /**< Reset Control: MSlice and CSlice select functional clock mux bits., offset: 0x108 */ + __IO uint32_t TOG; /**< Reset Control: MSlice and CSlice select functional clock mux bits., offset: 0x10C */ + } RST_CTRL_SLICE_SFCM[3]; + struct { /* offset: 0x130 */ + __IO uint32_t RW; /**< Reset Control: Select Functional Clock mux for root clocks., offset: 0x130 */ + __IO uint32_t SET; /**< Reset Control: Select Functional Clock mux for root clocks., offset: 0x134 */ + __IO uint32_t CLR; /**< Reset Control: Select Functional Clock mux for root clocks., offset: 0x138 */ + __IO uint32_t TOG; /**< Reset Control: Select Functional Clock mux for root clocks., offset: 0x13C */ + } RST_CTRL_CR_SFCM; + uint8_t RESERVED_1[192]; + struct { /* offset: 0x200 */ + __IO uint32_t RW; /**< Reset Control: Mslice and Cslice Start Functional Clock bits, offset: 0x200 */ + __IO uint32_t SET; /**< Reset Control: Mslice and Cslice Start Functional Clock bits, offset: 0x204 */ + __IO uint32_t CLR; /**< Reset Control: Mslice and Cslice Start Functional Clock bits, offset: 0x208 */ + __IO uint32_t TOG; /**< Reset Control: Mslice and Cslice Start Functional Clock bits, offset: 0x20C */ + } RST_CTRL_SLICE_SFC[3]; + struct { /* offset: 0x230 */ + __IO uint32_t RW; /**< Reset Control: Start Functional Clock bits for root clocks., offset: 0x230 */ + __IO uint32_t SET; /**< Reset Control: Start Functional Clock bits for root clocks., offset: 0x234 */ + __IO uint32_t CLR; /**< Reset Control: Start Functional Clock bits for root clocks., offset: 0x238 */ + __IO uint32_t TOG; /**< Reset Control: Start Functional Clock bits for root clocks., offset: 0x23C */ + } RST_CTRL_CR_SFC; + uint8_t RESERVED_2[192]; + struct { /* offset: 0x300 */ + __IO uint32_t RW; /**< Reset Control: Enable for the reset clock., offset: 0x300 */ + __IO uint32_t SET; /**< Reset Control: Enable for the reset clock., offset: 0x304 */ + __IO uint32_t CLR; /**< Reset Control: Enable for the reset clock., offset: 0x308 */ + __IO uint32_t TOG; /**< Reset Control: Enable for the reset clock., offset: 0x30C */ + } RST_CTRL_RESET_CLK_EN; + uint8_t RESERVED_3[240]; + struct { /* offset: 0x400, array step: 0x10 */ + __IO uint32_t RW; /**< Power domain controls, array offset: 0x400, array step: 0x10 */ + __IO uint32_t SET; /**< Power domain controls, array offset: 0x404, array step: 0x10 */ + __IO uint32_t CLR; /**< Power domain controls, array offset: 0x408, array step: 0x10 */ + __IO uint32_t TOG; /**< Power domain controls, array offset: 0x40C, array step: 0x10 */ + } POWER_CTRL[6]; + uint8_t RESERVED_4[160]; + struct { /* offset: 0x500, array step: 0x10 */ + __IO uint32_t RW; /**< General purpose control register bits., array offset: 0x500, array step: 0x10 */ + __IO uint32_t SET; /**< General purpose control register bits., array offset: 0x504, array step: 0x10 */ + __IO uint32_t CLR; /**< General purpose control register bits., array offset: 0x508, array step: 0x10 */ + __IO uint32_t TOG; /**< General purpose control register bits., array offset: 0x50C, array step: 0x10 */ + } GPR_CTRL[FSL_FEATURE_DSC_GPR_CTRL_CNT]; + uint32_t RESERVED_5[64 - (4 * FSL_FEATURE_DSC_GPR_CTRL_CNT)]; + struct { /* offset: 0x600, array step: 0x10 */ + __I uint32_t RW; /**< General purpose status bits., array offset: 0x600, array step: 0x10 */ + __I uint32_t SET; /**< General purpose status bits., array offset: 0x604, array step: 0x10 */ + __I uint32_t CLR; /**< General purpose status bits., array offset: 0x608, array step: 0x10 */ + __I uint32_t TOG; /**< General purpose status bits., array offset: 0x60C, array step: 0x10 */ + } GPR_STAT[3]; + uint8_t RESERVED_6[208]; + struct { /* offset: 0x700 */ + __IO uint32_t RW; /**< IRQ mask register for DSC interrupts., offset: 0x700 */ + __IO uint32_t SET; /**< IRQ mask register for DSC interrupts., offset: 0x704 */ + __IO uint32_t CLR; /**< IRQ mask register for DSC interrupts., offset: 0x708 */ + __IO uint32_t TOG; /**< IRQ mask register for DSC interrupts., offset: 0x70C */ + } IRQ_MASK_DSC; + struct { /* offset: 0x710 */ + __IO uint32_t RW; /**< IRQ mask register for Subsystem interrupts., offset: 0x710 */ + __IO uint32_t SET; /**< IRQ mask register for Subsystem interrupts., offset: 0x714 */ + __IO uint32_t CLR; /**< IRQ mask register for Subsystem interrupts., offset: 0x718 */ + __IO uint32_t TOG; /**< IRQ mask register for Subsystem interrupts., offset: 0x71C */ + } IRQ_MASK_SUBSYS; + uint8_t RESERVED_7[224]; + struct { /* offset: 0x800 */ + __I uint32_t RW; /**< IRQ masked status register for DSC interrupts., offset: 0x800 */ + __I uint32_t SET; /**< IRQ masked status register for DSC interrupts., offset: 0x804 */ + __I uint32_t CLR; /**< IRQ masked status register for DSC interrupts., offset: 0x808 */ + __I uint32_t TOG; /**< IRQ masked status register for DSC interrupts., offset: 0x80C */ + } IRQ_MASK_STATUS_DSC; + struct { /* offset: 0x810 */ + __I uint32_t RW; /**< IRQ masked status register for Subsystem interrupts., offset: 0x810 */ + __I uint32_t SET; /**< IRQ masked status register for Subsystem interrupts., offset: 0x814 */ + __I uint32_t CLR; /**< IRQ masked status register for Subsystem interrupts., offset: 0x818 */ + __I uint32_t TOG; /**< IRQ masked status register for Subsystem interrupts., offset: 0x81C */ + } IRQ_MASK_STATUS_SUBSYS; + uint8_t RESERVED_8[224]; + struct { /* offset: 0x900 */ + __IO uint32_t RW; /**< IRQ non-masked status register for DSC interrupts., offset: 0x900 */ + __IO uint32_t SET; /**< IRQ non-masked status register for DSC interrupts., offset: 0x904 */ + __IO uint32_t CLR; /**< IRQ non-masked status register for DSC interrupts., offset: 0x908 */ + __IO uint32_t TOG; /**< IRQ non-masked status register for DSC interrupts., offset: 0x90C */ + } IRQ_NONMASK_STATUS_DSC; + struct { /* offset: 0x910 */ + __I uint32_t RW; /**< IRQ non-masked status register for Subsystem interrupts., offset: 0x910 */ + __I uint32_t SET; /**< IRQ non-masked status register for Subsystem interrupts., offset: 0x914 */ + __I uint32_t CLR; /**< IRQ non-masked status register for Subsystem interrupts., offset: 0x918 */ + __I uint32_t TOG; /**< IRQ non-masked status register for Subsystem interrupts., offset: 0x91C */ + } IRQ_NONMASK_STATUS_SUBSYS; + uint8_t RESERVED_9[224]; + struct { /* offset: 0xA00 */ + __IO uint32_t RW; /**< Analog Interface Control Registers, offset: 0xA00 */ + __IO uint32_t SET; /**< Analog Interface Control Registers, offset: 0xA04 */ + __IO uint32_t CLR; /**< Analog Interface Control Registers, offset: 0xA08 */ + __IO uint32_t TOG; /**< Analog Interface Control Registers, offset: 0xA0C */ + } AI_CTRL; + struct { /* offset: 0xA10 */ + __IO uint32_t RW; /**< Analog Interface Registers, offset: 0xA10 */ + __IO uint32_t SET; /**< Analog Interface Registers, offset: 0xA14 */ + __IO uint32_t CLR; /**< Analog Interface Registers, offset: 0xA18 */ + __IO uint32_t TOG; /**< Analog Interface Registers, offset: 0xA1C */ + } AI_WR_DATA; + struct { /* offset: 0xA20 */ + __IO uint32_t RW; /**< Analog Interface Registers, offset: 0xA20 */ + __IO uint32_t SET; /**< Analog Interface Registers, offset: 0xA24 */ + __IO uint32_t CLR; /**< Analog Interface Registers, offset: 0xA28 */ + __IO uint32_t TOG; /**< Analog Interface Registers, offset: 0xA2C */ + } AI_TOGGLE0; + struct { /* offset: 0xA30 */ + __IO uint32_t RW; /**< Analog Interface Registers, offset: 0xA30 */ + __IO uint32_t SET; /**< Analog Interface Registers, offset: 0xA34 */ + __IO uint32_t CLR; /**< Analog Interface Registers, offset: 0xA38 */ + __IO uint32_t TOG; /**< Analog Interface Registers, offset: 0xA3C */ + } AI_TOGGLE1; + struct { /* offset: 0xA40 - NOT SCT Type*/ + __I uint32_t RW; /**< Analog Interface Registers, offset: 0xA40 */ + __I uint32_t SET; /**< Analog Interface Registers, offset: 0xA44 */ + __I uint32_t CLR; /**< Analog Interface Registers, offset: 0xA48 */ + __I uint32_t TOG; /**< Analog Interface Registers, offset: 0xA4C */ + } AI_DONE_TOGGLE0; + struct { /* offset: 0xA50 - NOT SCT Type*/ + __I uint32_t RW; /**< Analog Interface Registers, offset: 0xA50 */ + __I uint32_t SET; /**< Analog Interface Registers, offset: 0xA54 */ + __I uint32_t CLR; /**< Analog Interface Registers, offset: 0xA58 */ + __I uint32_t TOG; /**< Analog Interface Registers, offset: 0xA5C */ + } AI_DONE_TOGGLE1; + struct { /* offset: 0xA60 - NOT SCT Type*/ + __I uint32_t RW; /**< Analog Interface Registers, offset: 0xA60 */ + __I uint32_t SET; /**< Analog Interface Registers, offset: 0xA64 */ + __I uint32_t CLR; /**< Analog Interface Registers, offset: 0xA68 */ + __I uint32_t TOG; /**< Analog Interface Registers, offset: 0xA6C */ + } AI_RD_DATA; + struct { /* offset: 0xA70 - NOT SCT type*/ + __I uint32_t RW; /**< Analog Interface Registers, offset: 0xA70 */ + __I uint32_t SET; /**< Analog Interface Registers, offset: 0xA74 */ + __I uint32_t CLR; /**< Analog Interface Registers, offset: 0xA78 */ + __I uint32_t TOG; /**< Analog Interface Registers, offset: 0xA7C */ + } AI_BUSY0; + struct { /* offset: 0xA80 - NOT SCT type*/ + __I uint32_t RW; /**< Analog Interface Registers, offset: 0xA80 */ + __I uint32_t SET; /**< Analog Interface Registers, offset: 0xA84 */ + __I uint32_t CLR; /**< Analog Interface Registers, offset: 0xA88 */ + __I uint32_t TOG; /**< Analog Interface Registers, offset: 0xA8C */ + } AI_BUSY1; + + uint8_t RESERVED_10[112]; + struct { /* offset: 0xB00 */ + __IO uint32_t RW; /**< LOCKOUT Register, offset: 0xB00 */ + __IO uint32_t SET; /**< LOCKOUT Register, offset: 0xB04 */ + __IO uint32_t CLR; /**< LOCKOUT Register, offset: 0xB08 */ + __IO uint32_t TOG; /**< LOCKOUT Register, offset: 0xB0C */ + } LOCKOUT; + uint8_t RESERVED_11[8432]; + /**< Single small clock root divider slices (divide by 31)., array offset: 0x2C00, array step: 0x4 */ + __IO uint32_t SSSLICE_CTRL[FSL_FEATURE_DSC_SSSLICE_CNT]; + uint32_t RESERVED_12[256 - FSL_FEATURE_DSC_SSSLICE_CNT]; + /**< Single large clock root divider slices (divide by 255)., array offset: 0x3000, array step: 0x4 */ + __IO uint32_t SLSLICE_CTRL[FSL_FEATURE_DSC_SLSLICE_CNT]; + uint32_t RESERVED_13[256 - FSL_FEATURE_DSC_SLSLICE_CNT]; + struct { /* offset: 0x3400, array step: 0x8 */ + __IO uint32_t MSLICE_CTRL__0; /**< Muliple synchronous clock root divider slices register., array offset: 0x3400, array step: 0x8 */ + __IO uint32_t MSLICE_CTRL__1; /**< Muliple synchronous clock root divider slices register., array offset: 0x3404, array step: 0x8 */ + } MSLICE_CTRL[1]; + uint8_t RESERVED_14[1016]; + /**< CPU clock root divider slices., array offset: 0x3800, array step: 0x4 */ + __IO uint32_t CSLICE_CTRL[FSL_FEATURE_DSC_CSLICE_CNT]; + uint32_t RESERVED_15[256 - FSL_FEATURE_DSC_CSLICE_CNT]; + __IO uint32_t XTAL_CTRL; /**< Xtal control register., offset: 0x3C00 */ + uint8_t RESERVED_16[1020]; + __IO uint32_t ROSC_CTRL; /**< Ring oscillator control register., offset: 0x4000 */ + uint8_t RESERVED_17[14332]; + __I uint32_t STATUS_0; /**< STATUS_0, offset: 0x7800 */ + uint8_t RESERVED_18[1020]; + __IO uint32_t DFT_CTRL; /**< DFT Control, offset: 0x7C00 */ +} DSC_Type; + +/* ---------------------------------------------------------------------------- + -- DSC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DSC_Register_Masks DSC Register Masks + * @{ + */ + +/*! @name RST_CTRL_SLICE_RSTN - Reset Control: MSlice and CSlice resetn bits */ +#define DSC_RST_CTRL_SLICE_RSTN_CSLICE_RSTN_MASK (0x1U) +#define DSC_RST_CTRL_SLICE_RSTN_CSLICE_RSTN_SHIFT (0U) +#define DSC_RST_CTRL_SLICE_RSTN_CSLICE_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_RSTN_CSLICE_RSTN_SHIFT)) & DSC_RST_CTRL_SLICE_RSTN_CSLICE_RSTN_MASK) +#define DSC_RST_CTRL_SLICE_RSTN_MSLICE_RSTN_MASK (0x10000U) +#define DSC_RST_CTRL_SLICE_RSTN_MSLICE_RSTN_SHIFT (16U) +#define DSC_RST_CTRL_SLICE_RSTN_MSLICE_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_RSTN_MSLICE_RSTN_SHIFT)) & DSC_RST_CTRL_SLICE_RSTN_MSLICE_RSTN_MASK) + +/*! @name RST_CTRL_SLSLICE_RSTN - Reset Control: SLSlice resetn bits */ +#define DSC_RST_CTRL_SLSLICE_RSTN_SLSLICE_RSTN_MASK (0x1FFFFU) +#define DSC_RST_CTRL_SLSLICE_RSTN_SLSLICE_RSTN_SHIFT (0U) +#define DSC_RST_CTRL_SLSLICE_RSTN_SLSLICE_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLSLICE_RSTN_SLSLICE_RSTN_SHIFT)) & DSC_RST_CTRL_SLSLICE_RSTN_SLSLICE_RSTN_MASK) + +/*! @name RST_CTRL_SSSLICE_RSTN - Reset Control: SSSlice resetn bits */ +#define DSC_RST_CTRL_SSSLICE_RSTN_SSSLICE_RSTN_MASK (0xFFU) +#define DSC_RST_CTRL_SSSLICE_RSTN_SSSLICE_RSTN_SHIFT (0U) +#define DSC_RST_CTRL_SSSLICE_RSTN_SSSLICE_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SSSLICE_RSTN_SSSLICE_RSTN_SHIFT)) & DSC_RST_CTRL_SSSLICE_RSTN_SSSLICE_RSTN_MASK) + +/*! @name RST_CTRL_CR_RSTN - Reset Control: Clock Root reset bits. */ +#define DSC_RST_CTRL_CR_RSTN_XTAL32K_SS_RSTN_MASK (0x1U) +#define DSC_RST_CTRL_CR_RSTN_XTAL32K_SS_RSTN_SHIFT (0U) +#define DSC_RST_CTRL_CR_RSTN_XTAL32K_SS_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_RSTN_XTAL32K_SS_RSTN_SHIFT)) & DSC_RST_CTRL_CR_RSTN_XTAL32K_SS_RSTN_MASK) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_SS_RSTN_MASK (0x4U) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_SS_RSTN_SHIFT (2U) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_SS_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_RSTN_XTAL24M_SS_RSTN_SHIFT)) & DSC_RST_CTRL_CR_RSTN_XTAL24M_SS_RSTN_MASK) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_ANA_RSTN_MASK (0x8U) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_ANA_RSTN_SHIFT (3U) +#define DSC_RST_CTRL_CR_RSTN_XTAL24M_ANA_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_RSTN_XTAL24M_ANA_RSTN_SHIFT)) & DSC_RST_CTRL_CR_RSTN_XTAL24M_ANA_RSTN_MASK) +#define DSC_RST_CTRL_CR_RSTN_AI_RSTN_MASK (0xFF0U) +#define DSC_RST_CTRL_CR_RSTN_AI_RSTN_SHIFT (4U) +#define DSC_RST_CTRL_CR_RSTN_AI_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_RSTN_AI_RSTN_SHIFT)) & DSC_RST_CTRL_CR_RSTN_AI_RSTN_MASK) + +/*! @name RST_CTRL_SS_RSTN - Reset Control: Subsystem resets */ +#define DSC_RST_CTRL_SS_RSTN_SUBSYS_RSTN_MASK (0x3FFU) +#define DSC_RST_CTRL_SS_RSTN_SUBSYS_RSTN_SHIFT (0U) +#define DSC_RST_CTRL_SS_RSTN_SUBSYS_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SS_RSTN_SUBSYS_RSTN_SHIFT)) & DSC_RST_CTRL_SS_RSTN_SUBSYS_RSTN_MASK) + +/*! @name RST_CTRL_SLICE_SFCM - Reset Control: MSlice and CSlice select functional clock mux bits. */ +#define DSC_RST_CTRL_SLICE_SFCM_CSLICE_SFCM_MASK (0x1U) +#define DSC_RST_CTRL_SLICE_SFCM_CSLICE_SFCM_SHIFT (0U) +#define DSC_RST_CTRL_SLICE_SFCM_CSLICE_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_SFCM_CSLICE_SFCM_SHIFT)) & DSC_RST_CTRL_SLICE_SFCM_CSLICE_SFCM_MASK) +#define DSC_RST_CTRL_SLICE_SFCM_MSLICE_SFCM_MASK (0x10000U) +#define DSC_RST_CTRL_SLICE_SFCM_MSLICE_SFCM_SHIFT (16U) +#define DSC_RST_CTRL_SLICE_SFCM_MSLICE_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_SFCM_MSLICE_SFCM_SHIFT)) & DSC_RST_CTRL_SLICE_SFCM_MSLICE_SFCM_MASK) + +/*! @name RST_CTRL_SLSLICE_SFCM - Reset Control: SLSlice select functional clock mux bits. */ +#define DSC_RST_CTRL_SLSLICE_SFCM_SLSLICE_SFCM_MASK (0x1FFFFU) +#define DSC_RST_CTRL_SLSLICE_SFCM_SLSLICE_SFCM_SHIFT (0U) +#define DSC_RST_CTRL_SLSLICE_SFCM_SLSLICE_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLSLICE_SFCM_SLSLICE_SFCM_SHIFT)) & DSC_RST_CTRL_SLSLICE_SFCM_SLSLICE_SFCM_MASK) + +/*! @name RST_CTRL_SSSLICE_SFCM - Reset Control: SSSlice select functional clock mux bits. */ +#define DSC_RST_CTRL_SSSLICE_SFCM_SSSLICE_SFCM_MASK (0xFFU) +#define DSC_RST_CTRL_SSSLICE_SFCM_SSSLICE_SFCM_SHIFT (0U) +#define DSC_RST_CTRL_SSSLICE_SFCM_SSSLICE_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SSSLICE_SFCM_SSSLICE_SFCM_SHIFT)) & DSC_RST_CTRL_SSSLICE_SFCM_SSSLICE_SFCM_MASK) + +/*! @name RST_CTRL_CR_SFCM - Reset Control: Select Functional Clock mux for root clocks. */ +#define DSC_RST_CTRL_CR_SFCM_XTAL32K_SS_SFCM_MASK (0x1U) +#define DSC_RST_CTRL_CR_SFCM_XTAL32K_SS_SFCM_SHIFT (0U) +#define DSC_RST_CTRL_CR_SFCM_XTAL32K_SS_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFCM_XTAL32K_SS_SFCM_SHIFT)) & DSC_RST_CTRL_CR_SFCM_XTAL32K_SS_SFCM_MASK) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_SS_SFCM_MASK (0x4U) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_SS_SFCM_SHIFT (2U) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_SS_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFCM_XTAL24M_SS_SFCM_SHIFT)) & DSC_RST_CTRL_CR_SFCM_XTAL24M_SS_SFCM_MASK) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_ANA_SFCM_MASK (0x8U) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_ANA_SFCM_SHIFT (3U) +#define DSC_RST_CTRL_CR_SFCM_XTAL24M_ANA_SFCM(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFCM_XTAL24M_ANA_SFCM_SHIFT)) & DSC_RST_CTRL_CR_SFCM_XTAL24M_ANA_SFCM_MASK) + +/*! @name RST_CTRL_SLICE_SFC - Reset Control: Mslice and Cslice Start Functional Clock bits */ +#define DSC_RST_CTRL_SLICE_SFC_CSLICE_SFC_MASK (0x1U) +#define DSC_RST_CTRL_SLICE_SFC_CSLICE_SFC_SHIFT (0U) +#define DSC_RST_CTRL_SLICE_SFC_CSLICE_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_SFC_CSLICE_SFC_SHIFT)) & DSC_RST_CTRL_SLICE_SFC_CSLICE_SFC_MASK) +#define DSC_RST_CTRL_SLICE_SFC_MSLICE_SFC_MASK (0x10000U) +#define DSC_RST_CTRL_SLICE_SFC_MSLICE_SFC_SHIFT (16U) +#define DSC_RST_CTRL_SLICE_SFC_MSLICE_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLICE_SFC_MSLICE_SFC_SHIFT)) & DSC_RST_CTRL_SLICE_SFC_MSLICE_SFC_MASK) + +/*! @name RST_CTRL_SLSLICE_SFC - Reset Control: SSSlice Start Functional Clocks */ +#define DSC_RST_CTRL_SLSLICE_SFC_SLSLICE_SFC_MASK (0x1FFFFU) +#define DSC_RST_CTRL_SLSLICE_SFC_SLSLICE_SFC_SHIFT (0U) +#define DSC_RST_CTRL_SLSLICE_SFC_SLSLICE_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SLSLICE_SFC_SLSLICE_SFC_SHIFT)) & DSC_RST_CTRL_SLSLICE_SFC_SLSLICE_SFC_MASK) + +/*! @name RST_CTRL_SSSLICE_SFC - Reset Control: SSSlice start functional clocks */ +#define DSC_RST_CTRL_SSSLICE_SFC_SSSLICE_SFC_MASK (0xFFU) +#define DSC_RST_CTRL_SSSLICE_SFC_SSSLICE_SFC_SHIFT (0U) +#define DSC_RST_CTRL_SSSLICE_SFC_SSSLICE_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_SSSLICE_SFC_SSSLICE_SFC_SHIFT)) & DSC_RST_CTRL_SSSLICE_SFC_SSSLICE_SFC_MASK) + +/*! @name RST_CTRL_CR_SFC - Reset Control: Start Functional Clock bits for root clocks. */ +#define DSC_RST_CTRL_CR_SFC_XTAL32K_SS_SFC_MASK (0x1U) +#define DSC_RST_CTRL_CR_SFC_XTAL32K_SS_SFC_SHIFT (0U) +#define DSC_RST_CTRL_CR_SFC_XTAL32K_SS_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFC_XTAL32K_SS_SFC_SHIFT)) & DSC_RST_CTRL_CR_SFC_XTAL32K_SS_SFC_MASK) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_SS_SFC_MASK (0x4U) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_SS_SFC_SHIFT (2U) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_SS_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFC_XTAL24M_SS_SFC_SHIFT)) & DSC_RST_CTRL_CR_SFC_XTAL24M_SS_SFC_MASK) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_ANA_SFC_MASK (0x8U) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_ANA_SFC_SHIFT (3U) +#define DSC_RST_CTRL_CR_SFC_XTAL24M_ANA_SFC(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_CR_SFC_XTAL24M_ANA_SFC_SHIFT)) & DSC_RST_CTRL_CR_SFC_XTAL24M_ANA_SFC_MASK) + +/*! @name RST_CTRL_RESET_CLK_EN - Reset Control: Enable for the reset clock. */ +#define DSC_RST_CTRL_RESET_CLK_EN_RESET_CLK_EN_MASK (0x1U) +#define DSC_RST_CTRL_RESET_CLK_EN_RESET_CLK_EN_SHIFT (0U) +#define DSC_RST_CTRL_RESET_CLK_EN_RESET_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_RST_CTRL_RESET_CLK_EN_RESET_CLK_EN_SHIFT)) & DSC_RST_CTRL_RESET_CLK_EN_RESET_CLK_EN_MASK) + +/*! @name POWER_CTRL - Power domain controls */ +#define DSC_POWER_CTRL_PFET_LF_EN_MASK (0x1U) +#define DSC_POWER_CTRL_PFET_LF_EN_SHIFT (0U) +#define DSC_POWER_CTRL_PFET_LF_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_PFET_LF_EN_SHIFT)) & DSC_POWER_CTRL_PFET_LF_EN_MASK) +#define DSC_POWER_CTRL_PFET_HF_EN_MASK (0x2U) +#define DSC_POWER_CTRL_PFET_HF_EN_SHIFT (1U) +#define DSC_POWER_CTRL_PFET_HF_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_PFET_HF_EN_SHIFT)) & DSC_POWER_CTRL_PFET_HF_EN_MASK) +#define DSC_POWER_CTRL_INPUT_ISO_EN_MASK (0x4U) +#define DSC_POWER_CTRL_INPUT_ISO_EN_SHIFT (2U) +#define DSC_POWER_CTRL_INPUT_ISO_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_INPUT_ISO_EN_SHIFT)) & DSC_POWER_CTRL_INPUT_ISO_EN_MASK) +#define DSC_POWER_CTRL_OUTPUT_ISO_EN_MASK (0x8U) +#define DSC_POWER_CTRL_OUTPUT_ISO_EN_SHIFT (3U) +#define DSC_POWER_CTRL_OUTPUT_ISO_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_OUTPUT_ISO_EN_SHIFT)) & DSC_POWER_CTRL_OUTPUT_ISO_EN_MASK) +#define DSC_POWER_CTRL_MISC_MASK (0xFFFF00U) +#define DSC_POWER_CTRL_MISC_SHIFT (8U) +#define DSC_POWER_CTRL_MISC(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_MISC_SHIFT)) & DSC_POWER_CTRL_MISC_MASK) +#define DSC_POWER_CTRL_PFET_LF_ACK_MASK (0x40000000U) +#define DSC_POWER_CTRL_PFET_LF_ACK_SHIFT (30U) +#define DSC_POWER_CTRL_PFET_LF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_PFET_LF_ACK_SHIFT)) & DSC_POWER_CTRL_PFET_LF_ACK_MASK) +#define DSC_POWER_CTRL_PFET_HF_ACK_MASK (0x80000000U) +#define DSC_POWER_CTRL_PFET_HF_ACK_SHIFT (31U) +#define DSC_POWER_CTRL_PFET_HF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_POWER_CTRL_PFET_HF_ACK_SHIFT)) & DSC_POWER_CTRL_PFET_HF_ACK_MASK) + +#define DSC_PWRCTRL_MEM_HS_MASK 0x00000800U +#define DSC_PWRCTRL_MEM_LS_MASK 0x00000400U + +#define DSC_PWRCTRL_MAIN_RFF_MASK 0x00001000U +#define DSC_PWRCTRL_MAIN_SLEEP_MASK 0x00002000U +#define DSC_PWRCTRL_MAIN_STDBY_MASK 0x00004000U +#define DSC_PWRCTRL_MAIN_INPUT_GATE_MASK 0x00008000U + +#define DSC_PWRCTRL_PSW_SMALL_MA_MASK 0x00010000U +#define DSC_PWRCTRL_PSW_LARGE_MA_MASK 0x00020000U +#define DSC_PWRCTRL_PSW_SMALL_MP_MASK 0x00040000U +#define DSC_PWRCTRL_PSW_LARGE_MP_MASK 0x00080000U +#define DSC_PWRCTRL_PSW_SMALL_MA_2_MASK 0x00040000U +#define DSC_PWRCTRL_PSW_LARGE_MA_2_MASK 0x00080000U +#define DSC_PWRCTRL_PSW_SMALL_MASK 0x00100000U +#define DSC_PWRCTRL_PSW_LARGE_MASK 0x00200000U + +#define DSC_PWRCTRL_PSW_SMALL_MA_3_MASK 0x00400000U +#define DSC_PWRCTRL_PSW_LARGE_MA_3_MASK 0x00800000U + +#define DSC_PWRCTRL_MEM_DEEP_SLEEP 0x00400000U +#define DSC_PWRCTRL_MEM_STANDBY 0x00800000U + + +/* The count of DSC_POWER_CTRL */ +#define DSC_POWER_CTRL_COUNT (6U) + +/* The count of DSC_POWER_CTRL_SET */ +#define DSC_POWER_CTRL_SET_COUNT (6U) + +/* The count of DSC_POWER_CTRL_CLR */ +#define DSC_POWER_CTRL_CLR_COUNT (6U) + +/* The count of DSC_POWER_CTRL_TOG */ +#define DSC_POWER_CTRL_TOG_COUNT (6U) + +/*! @name GPR_CTRL - General purpose control register bits. */ +#define DSC_GPR_CTRL_CTRL_MASK (0xFFFFFFFFU) +#define DSC_GPR_CTRL_CTRL_SHIFT (0U) +#define DSC_GPR_CTRL_CTRL(x) (((uint32_t)(((uint32_t)(x)) << DSC_GPR_CTRL_CTRL_SHIFT)) & DSC_GPR_CTRL_CTRL_MASK) + +/* The count of DSC_GPR_CTRL_SET */ +#define DSC_GPR_CTRL_SET_COUNT (3U) + +/* The count of DSC_GPR_CTRL_CLR */ +#define DSC_GPR_CTRL_CLR_COUNT (3U) + +/* The count of DSC_GPR_CTRL_TOG */ +#define DSC_GPR_CTRL_TOG_COUNT (3U) + +/*! @name GPR_STAT - General purpose status bits. */ +#define DSC_GPR_STAT_STATUS_MASK (0xFFFFFFFFU) +#define DSC_GPR_STAT_STATUS_SHIFT (0U) +#define DSC_GPR_STAT_STATUS(x) (((uint32_t)(((uint32_t)(x)) << DSC_GPR_STAT_STATUS_SHIFT)) & DSC_GPR_STAT_STATUS_MASK) + +/* The count of DSC_GPR_STAT */ +#define DSC_GPR_STAT_COUNT (3U) + +/* The count of DSC_GPR_STAT_SET */ +#define DSC_GPR_STAT_SET_COUNT (3U) + +/* The count of DSC_GPR_STAT_CLR */ +#define DSC_GPR_STAT_CLR_COUNT (3U) + +/* The count of DSC_GPR_STAT_TOG */ +#define DSC_GPR_STAT_TOG_COUNT (3U) + +/*! @name IRQ_MASK_DSC - IRQ mask register for DSC interrupts. */ +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_PANIC_MASK (0x1U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_PANIC_SHIFT (0U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_PANIC(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_TEMPSENSOR_PANIC_SHIFT)) & DSC_IRQ_MASK_DSC_TEMPSENSOR_PANIC_MASK) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_LOW_MASK (0x2U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_LOW_SHIFT (1U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_LOW(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_TEMPSENSOR_LOW_SHIFT)) & DSC_IRQ_MASK_DSC_TEMPSENSOR_LOW_MASK) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_HIGH_MASK (0x4U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_HIGH_SHIFT (2U) +#define DSC_IRQ_MASK_DSC_TEMPSENSOR_HIGH(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_TEMPSENSOR_HIGH_SHIFT)) & DSC_IRQ_MASK_DSC_TEMPSENSOR_HIGH_MASK) +#define DSC_IRQ_MASK_DSC_MSI_SLV_ERROR_IRQ_MASK (0x8U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_ERROR_IRQ_SHIFT (3U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_MSI_SLV_ERROR_IRQ_SHIFT)) & DSC_IRQ_MASK_DSC_MSI_SLV_ERROR_IRQ_MASK) +#define DSC_IRQ_MASK_DSC_MSI_SLV_WR_OVFL_IRQ_MASK (0x10U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT (4U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_MASK_DSC_MSI_SLV_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_MASK_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK (0x20U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT (5U) +#define DSC_IRQ_MASK_DSC_MSI_SLV_AHB_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_MASK_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_MASK_DSC_BIST_IRQ_MASK (0x40U) +#define DSC_IRQ_MASK_DSC_BIST_IRQ_SHIFT (6U) +#define DSC_IRQ_MASK_DSC_BIST_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_BIST_IRQ_SHIFT)) & DSC_IRQ_MASK_DSC_BIST_IRQ_MASK) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_LF_ACK_MASK (0x3F0000U) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_LF_ACK_SHIFT (16U) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_LF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_PWRCTRL_PFET_LF_ACK_SHIFT)) & DSC_IRQ_MASK_DSC_PWRCTRL_PFET_LF_ACK_MASK) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_HF_ACK_MASK (0x3F000000U) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_HF_ACK_SHIFT (24U) +#define DSC_IRQ_MASK_DSC_PWRCTRL_PFET_HF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_DSC_PWRCTRL_PFET_HF_ACK_SHIFT)) & DSC_IRQ_MASK_DSC_PWRCTRL_PFET_HF_ACK_MASK) + +/*! @name IRQ_MASK_SUBSYS - IRQ mask register for Subsystem interrupts. */ +#define DSC_IRQ_MASK_SUBSYS_SUBSYS_MASK (0xFFFFFFFU) +#define DSC_IRQ_MASK_SUBSYS_SUBSYS_SHIFT (0U) +#define DSC_IRQ_MASK_SUBSYS_SUBSYS(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_SUBSYS_SUBSYS_SHIFT)) & DSC_IRQ_MASK_SUBSYS_SUBSYS_MASK) + +/*! @name IRQ_MASK_STATUS_DSC - IRQ masked status register for DSC interrupts. */ +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_PANIC_MASK (0x1U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_PANIC_SHIFT (0U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_PANIC(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_PANIC_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_PANIC_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_LOW_MASK (0x2U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_LOW_SHIFT (1U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_LOW(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_LOW_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_LOW_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_HIGH_MASK (0x4U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_HIGH_SHIFT (2U) +#define DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_HIGH(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_HIGH_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_TEMPSENSOR_HIGH_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_MASK (0x8U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_SHIFT (3U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_MASK (0x10U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT (4U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK (0x20U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT (5U) +#define DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_BIST_IRQ_MASK (0x40U) +#define DSC_IRQ_MASK_STATUS_DSC_BIST_IRQ_SHIFT (6U) +#define DSC_IRQ_MASK_STATUS_DSC_BIST_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_BIST_IRQ_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_BIST_IRQ_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_MASK (0x3F0000U) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_SHIFT (16U) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_MASK) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_MASK (0x3F000000U) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_SHIFT (24U) +#define DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_SHIFT)) & DSC_IRQ_MASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_MASK) + +/*! @name IRQ_MASK_STATUS_SUBSYS - IRQ masked status register for Subsystem interrupts. */ +#define DSC_IRQ_MASK_STATUS_SUBSYS_SUBSYS_MASK (0xFFFFFFFU) +#define DSC_IRQ_MASK_STATUS_SUBSYS_SUBSYS_SHIFT (0U) +#define DSC_IRQ_MASK_STATUS_SUBSYS_SUBSYS(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_MASK_STATUS_SUBSYS_SUBSYS_SHIFT)) & DSC_IRQ_MASK_STATUS_SUBSYS_SUBSYS_MASK) + +/*! @name IRQ_NONMASK_STATUS_DSC - IRQ non-masked status register for DSC interrupts. */ +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_PANIC_MASK (0x1U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_PANIC_SHIFT (0U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_PANIC(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_PANIC_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_PANIC_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_LOW_MASK (0x2U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_LOW_SHIFT (1U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_LOW(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_LOW_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_LOW_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_HIGH_MASK (0x4U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_HIGH_SHIFT (2U) +#define DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_HIGH(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_HIGH_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_TEMPSENSOR_HIGH_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_MASK (0x8U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_SHIFT (3U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_ERROR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_ERROR_IRQ_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_MASK (0x10U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT (4U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK (0x20U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT (5U) +#define DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_MSI_SLV_AHB_WR_OVFL_IRQ_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_BIST_IRQ_MASK (0x40U) +#define DSC_IRQ_NONMASK_STATUS_DSC_BIST_IRQ_SHIFT (6U) +#define DSC_IRQ_NONMASK_STATUS_DSC_BIST_IRQ(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_BIST_IRQ_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_BIST_IRQ_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_MASK (0x3F0000U) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_SHIFT (16U) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_LF_ACK_MASK) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_MASK (0x3F000000U) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_SHIFT (24U) +#define DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_SHIFT)) & DSC_IRQ_NONMASK_STATUS_DSC_PWRCTRL_PFET_HF_ACK_MASK) + +/*! @name IRQ_NONMASK_STATUS_SUBSYS - IRQ non-masked status register for Subsystem interrupts. */ +#define DSC_IRQ_NONMASK_STATUS_SUBSYS_SUBSYS_MASK (0xFFFFFFFU) +#define DSC_IRQ_NONMASK_STATUS_SUBSYS_SUBSYS_SHIFT (0U) +#define DSC_IRQ_NONMASK_STATUS_SUBSYS_SUBSYS(x) (((uint32_t)(((uint32_t)(x)) << DSC_IRQ_NONMASK_STATUS_SUBSYS_SUBSYS_SHIFT)) & DSC_IRQ_NONMASK_STATUS_SUBSYS_SUBSYS_MASK) + +/*! @name AI_CTRL - Analog Interface Control Registers */ +#define DSC_AI_CTRL_ADDR_MASK (0xFFFFU) +#define DSC_AI_CTRL_ADDR_SHIFT (0U) +#define DSC_AI_CTRL_ADDR(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_CTRL_ADDR_SHIFT)) & DSC_AI_CTRL_ADDR_MASK) +#define DSC_AI_CTRL_SRC_SEL_MASK (0x1F0000U) +#define DSC_AI_CTRL_SRC_SEL_SHIFT (16U) +#define DSC_AI_CTRL_SRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_CTRL_SRC_SEL_SHIFT)) & DSC_AI_CTRL_SRC_SEL_MASK) +#define DSC_AI_CTRL_RWB_MASK (0x80000000U) +#define DSC_AI_CTRL_RWB_SHIFT (31U) +#define DSC_AI_CTRL_RWB(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_CTRL_RWB_SHIFT)) & DSC_AI_CTRL_RWB_MASK) + +/*! @name AI_WR_DATA - Analog Interface Registers */ +#define DSC_AI_WR_DATA_WR_DATA_MASK (0xFFFFFFFFU) +#define DSC_AI_WR_DATA_WR_DATA_SHIFT (0U) +#define DSC_AI_WR_DATA_WR_DATA(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_WR_DATA_WR_DATA_SHIFT)) & DSC_AI_WR_DATA_WR_DATA_MASK) + +/*! @name AI_TOGGLE - Analog Interface Registers */ +#define DSC_AI_TOGGLE_TOGGLE_MASK (0xFFFFFFFFU) +#define DSC_AI_TOGGLE_TOGGLE_SHIFT (0U) +#define DSC_AI_TOGGLE_TOGGLE(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_TOGGLE_TOGGLE_SHIFT)) & DSC_AI_TOGGLE_TOGGLE_MASK) + +/*! @name AI_DONE_TOGGLE - Analog Interface Registers */ +#define DSC_AI_DONE_TOGGLE_DONE_TOGGLE_MASK (0xFFFFFFFFU) +#define DSC_AI_DONE_TOGGLE_DONE_TOGGLE_SHIFT (0U) +#define DSC_AI_DONE_TOGGLE_DONE_TOGGLE(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_DONE_TOGGLE_DONE_TOGGLE_SHIFT)) & DSC_AI_DONE_TOGGLE_DONE_TOGGLE_MASK) + +/*! @name AI_RD_DATA - Analog Interface Registers */ +#define DSC_AI_RD_DATA_RD_DATA_MASK (0xFFFFFFFFU) +#define DSC_AI_RD_DATA_RD_DATA_SHIFT (0U) +#define DSC_AI_RD_DATA_RD_DATA(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_RD_DATA_RD_DATA_SHIFT)) & DSC_AI_RD_DATA_RD_DATA_MASK) + +/*! @name AI_BUSY - Analog Interface Registers */ +#define DSC_AI_BUSY_BUSY_MASK (0xFFFFFFFFU) +#define DSC_AI_BUSY_BUSY_SHIFT (0U) +#define DSC_AI_BUSY_BUSY(x) (((uint32_t)(((uint32_t)(x)) << DSC_AI_BUSY_BUSY_SHIFT)) & DSC_AI_BUSY_BUSY_MASK) + +/*! @name LOCKOUT - LOCKOUT Register */ +#define DSC_LOCKOUT_LOCKOUT_MASK (0xFFU) +#define DSC_LOCKOUT_LOCKOUT_SHIFT (0U) +#define DSC_LOCKOUT_LOCKOUT(x) (((uint32_t)(((uint32_t)(x)) << DSC_LOCKOUT_LOCKOUT_SHIFT)) & DSC_LOCKOUT_LOCKOUT_MASK) +#define DSC_LOCKOUT_LOCKOUT_EN_MASK (0x80000000U) +#define DSC_LOCKOUT_LOCKOUT_EN_SHIFT (31U) +#define DSC_LOCKOUT_LOCKOUT_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_LOCKOUT_LOCKOUT_EN_SHIFT)) & DSC_LOCKOUT_LOCKOUT_EN_MASK) + +/*! @name SSSLICE_CTRL - Single small clock root divider slices (divide by 31). */ +#define DSC_SSSLICE_CTRL_SSDIV_MASK (0x1FU) +#define DSC_SSSLICE_CTRL_SSDIV_SHIFT (0U) +#define DSC_SSSLICE_CTRL_SSDIV(x) (((uint32_t)(((uint32_t)(x)) << DSC_SSSLICE_CTRL_SSDIV_SHIFT)) & DSC_SSSLICE_CTRL_SSDIV_MASK) +#define DSC_SSSLICE_CTRL_SRC_SEL_MASK (0x1C000000U) +#define DSC_SSSLICE_CTRL_SRC_SEL_SHIFT (26U) +#define DSC_SSSLICE_CTRL_SRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SSSLICE_CTRL_SRC_SEL_SHIFT)) & DSC_SSSLICE_CTRL_SRC_SEL_MASK) +#define DSC_SSSLICE_CTRL_HW_SEL_MASK (0x20000000U) +#define DSC_SSSLICE_CTRL_HW_SEL_SHIFT (29U) +#define DSC_SSSLICE_CTRL_HW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SSSLICE_CTRL_HW_SEL_SHIFT)) & DSC_SSSLICE_CTRL_HW_SEL_MASK) +#define DSC_SSSLICE_CTRL_FW_SEL_MASK (0xC0000000U) +#define DSC_SSSLICE_CTRL_FW_SEL_SHIFT (30U) +#define DSC_SSSLICE_CTRL_FW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SSSLICE_CTRL_FW_SEL_SHIFT)) & DSC_SSSLICE_CTRL_FW_SEL_MASK) + +/* The count of DSC_SSSLICE_CTRL */ +#define DSC_SSSLICE_CTRL_COUNT (8U) + +/*! @name SLSLICE_CTRL - Single large clock root divider slices (divide by 255). */ +#define DSC_SLSLICE_CTRL_SLDIV_MASK (0xFFU) +#define DSC_SLSLICE_CTRL_SLDIV_SHIFT (0U) +#define DSC_SLSLICE_CTRL_SLDIV(x) (((uint32_t)(((uint32_t)(x)) << DSC_SLSLICE_CTRL_SLDIV_SHIFT)) & DSC_SLSLICE_CTRL_SLDIV_MASK) +#define DSC_SLSLICE_CTRL_SRC_SEL_MASK (0x1C000000U) +#define DSC_SLSLICE_CTRL_SRC_SEL_SHIFT (26U) +#define DSC_SLSLICE_CTRL_SRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SLSLICE_CTRL_SRC_SEL_SHIFT)) & DSC_SLSLICE_CTRL_SRC_SEL_MASK) +#define DSC_SLSLICE_CTRL_HW_SEL_MASK (0x20000000U) +#define DSC_SLSLICE_CTRL_HW_SEL_SHIFT (29U) +#define DSC_SLSLICE_CTRL_HW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SLSLICE_CTRL_HW_SEL_SHIFT)) & DSC_SLSLICE_CTRL_HW_SEL_MASK) +#define DSC_SLSLICE_CTRL_FW_SEL_MASK (0xC0000000U) +#define DSC_SLSLICE_CTRL_FW_SEL_SHIFT (30U) +#define DSC_SLSLICE_CTRL_FW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_SLSLICE_CTRL_FW_SEL_SHIFT)) & DSC_SLSLICE_CTRL_FW_SEL_MASK) + +/* The count of DSC_SLSLICE_CTRL */ +#define DSC_SLSLICE_CTRL_COUNT (17U) + +/*! @name MSLICE_CTRL__0 - Muliple synchronous clock root divider slices register. */ +#define DSC_MSLICE_CTRL__0_DIV_ROOT0_MASK (0x1FU) +#define DSC_MSLICE_CTRL__0_DIV_ROOT0_SHIFT (0U) +#define DSC_MSLICE_CTRL__0_DIV_ROOT0(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__0_DIV_ROOT0_SHIFT)) & DSC_MSLICE_CTRL__0_DIV_ROOT0_MASK) +#define DSC_MSLICE_CTRL__0_DIV_ROOT1_MASK (0x3E0U) +#define DSC_MSLICE_CTRL__0_DIV_ROOT1_SHIFT (5U) +#define DSC_MSLICE_CTRL__0_DIV_ROOT1(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__0_DIV_ROOT1_SHIFT)) & DSC_MSLICE_CTRL__0_DIV_ROOT1_MASK) + +/* The count of DSC_MSLICE_CTRL__0 */ +#define DSC_MSLICE_CTRL__0_COUNT (1U) + +/*! @name MSLICE_CTRL__1 - Muliple synchronous clock root divider slices register. */ +#define DSC_MSLICE_CTRL__1_DIV_ROOT2_MASK (0x1FU) +#define DSC_MSLICE_CTRL__1_DIV_ROOT2_SHIFT (0U) +#define DSC_MSLICE_CTRL__1_DIV_ROOT2(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_DIV_ROOT2_SHIFT)) & DSC_MSLICE_CTRL__1_DIV_ROOT2_MASK) +#define DSC_MSLICE_CTRL__1_DIV_ROOT3_MASK (0x3E0U) +#define DSC_MSLICE_CTRL__1_DIV_ROOT3_SHIFT (5U) +#define DSC_MSLICE_CTRL__1_DIV_ROOT3(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_DIV_ROOT3_SHIFT)) & DSC_MSLICE_CTRL__1_DIV_ROOT3_MASK) +#define DSC_MSLICE_CTRL__1_SYS_CTR_CLK_SEL_MASK (0x2000000U) +#define DSC_MSLICE_CTRL__1_SYS_CTR_CLK_SEL_SHIFT (25U) +#define DSC_MSLICE_CTRL__1_SYS_CTR_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_SYS_CTR_CLK_SEL_SHIFT)) & DSC_MSLICE_CTRL__1_SYS_CTR_CLK_SEL_MASK) +#define DSC_MSLICE_CTRL__1_SRC_SEL_MASK (0x1C000000U) +#define DSC_MSLICE_CTRL__1_SRC_SEL_SHIFT (26U) +#define DSC_MSLICE_CTRL__1_SRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_SRC_SEL_SHIFT)) & DSC_MSLICE_CTRL__1_SRC_SEL_MASK) +#define DSC_MSLICE_CTRL__1_HW_SEL_MASK (0x20000000U) +#define DSC_MSLICE_CTRL__1_HW_SEL_SHIFT (29U) +#define DSC_MSLICE_CTRL__1_HW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_HW_SEL_SHIFT)) & DSC_MSLICE_CTRL__1_HW_SEL_MASK) +#define DSC_MSLICE_CTRL__1_FW_SEL_MASK (0xC0000000U) +#define DSC_MSLICE_CTRL__1_FW_SEL_SHIFT (30U) +#define DSC_MSLICE_CTRL__1_FW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_MSLICE_CTRL__1_FW_SEL_SHIFT)) & DSC_MSLICE_CTRL__1_FW_SEL_MASK) + +/* The count of DSC_MSLICE_CTRL__1 */ +#define DSC_MSLICE_CTRL__1_COUNT (1U) + +/*! @name CSLICE_CTRL - CPU clock root divider slices. */ +#define DSC_CSLICE_CTRL_SRC_SEL_MASK (0x1C000000U) +#define DSC_CSLICE_CTRL_SRC_SEL_SHIFT (26U) +#define DSC_CSLICE_CTRL_SRC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_CSLICE_CTRL_SRC_SEL_SHIFT)) & DSC_CSLICE_CTRL_SRC_SEL_MASK) +#define DSC_CSLICE_CTRL_HW_SEL_MASK (0x20000000U) +#define DSC_CSLICE_CTRL_HW_SEL_SHIFT (29U) +#define DSC_CSLICE_CTRL_HW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_CSLICE_CTRL_HW_SEL_SHIFT)) & DSC_CSLICE_CTRL_HW_SEL_MASK) +#define DSC_CSLICE_CTRL_FW_SEL_MASK (0xC0000000U) +#define DSC_CSLICE_CTRL_FW_SEL_SHIFT (30U) +#define DSC_CSLICE_CTRL_FW_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_CSLICE_CTRL_FW_SEL_SHIFT)) & DSC_CSLICE_CTRL_FW_SEL_MASK) + +/* The count of DSC_CSLICE_CTRL */ +#define DSC_CSLICE_CTRL_COUNT (1U) + +/*! @name XTAL_CTRL - Xtal control register. */ +#define DSC_XTAL_CTRL_GLBL_ANA_XTAL24M_EN_MASK (0x1U) +#define DSC_XTAL_CTRL_GLBL_ANA_XTAL24M_EN_SHIFT (0U) +#define DSC_XTAL_CTRL_GLBL_ANA_XTAL24M_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_GLBL_ANA_XTAL24M_EN_SHIFT)) & DSC_XTAL_CTRL_GLBL_ANA_XTAL24M_EN_MASK) +#define DSC_XTAL_CTRL_DSC_AON_XTAL24M_EN_MASK (0x2U) +#define DSC_XTAL_CTRL_DSC_AON_XTAL24M_EN_SHIFT (1U) +#define DSC_XTAL_CTRL_DSC_AON_XTAL24M_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_DSC_AON_XTAL24M_EN_SHIFT)) & DSC_XTAL_CTRL_DSC_AON_XTAL24M_EN_MASK) +#define DSC_XTAL_CTRL_DSC_PG_XTAL24M_EN_MASK (0x4U) +#define DSC_XTAL_CTRL_DSC_PG_XTAL24M_EN_SHIFT (2U) +#define DSC_XTAL_CTRL_DSC_PG_XTAL24M_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_DSC_PG_XTAL24M_EN_SHIFT)) & DSC_XTAL_CTRL_DSC_PG_XTAL24M_EN_MASK) +#define DSC_XTAL_CTRL_ANALOG_XTAL24M_EN_MASK (0x8U) +#define DSC_XTAL_CTRL_ANALOG_XTAL24M_EN_SHIFT (3U) +#define DSC_XTAL_CTRL_ANALOG_XTAL24M_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_ANALOG_XTAL24M_EN_SHIFT)) & DSC_XTAL_CTRL_ANALOG_XTAL24M_EN_MASK) +#define DSC_XTAL_CTRL_OSC_XTAL24M_EN_MASK (0x100U) +#define DSC_XTAL_CTRL_OSC_XTAL24M_EN_SHIFT (8U) +#define DSC_XTAL_CTRL_OSC_XTAL24M_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_OSC_XTAL24M_EN_SHIFT)) & DSC_XTAL_CTRL_OSC_XTAL24M_EN_MASK) +#define DSC_XTAL_CTRL_OSC_XTAL32K_SFC_SEL_MASK (0x10000U) +#define DSC_XTAL_CTRL_OSC_XTAL32K_SFC_SEL_SHIFT (16U) +#define DSC_XTAL_CTRL_OSC_XTAL32K_SFC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_OSC_XTAL32K_SFC_SEL_SHIFT)) & DSC_XTAL_CTRL_OSC_XTAL32K_SFC_SEL_MASK) +#define DSC_XTAL_CTRL_XTAL32K_SYNC_SEL_MASK (0x80000000U) +#define DSC_XTAL_CTRL_XTAL32K_SYNC_SEL_SHIFT (31U) +#define DSC_XTAL_CTRL_XTAL32K_SYNC_SEL(x) (((uint32_t)(((uint32_t)(x)) << DSC_XTAL_CTRL_XTAL32K_SYNC_SEL_SHIFT)) & DSC_XTAL_CTRL_XTAL32K_SYNC_SEL_MASK) + +/*! @name ROSC_CTRL - Ring oscillator control register. */ +#define DSC_ROSC_CTRL_ROSC_START_EN_MASK (0x1U) +#define DSC_ROSC_CTRL_ROSC_START_EN_SHIFT (0U) +#define DSC_ROSC_CTRL_ROSC_START_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_ROSC_CTRL_ROSC_START_EN_SHIFT)) & DSC_ROSC_CTRL_ROSC_START_EN_MASK) +#define DSC_ROSC_CTRL_ROSC_STOP_EN_MASK (0x2U) +#define DSC_ROSC_CTRL_ROSC_STOP_EN_SHIFT (1U) +#define DSC_ROSC_CTRL_ROSC_STOP_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_ROSC_CTRL_ROSC_STOP_EN_SHIFT)) & DSC_ROSC_CTRL_ROSC_STOP_EN_MASK) + +/*! @name STATUS_0 - STATUS_0 */ +#define DSC_STATUS_0_DSC_HM_TYPE_MASK (0xFU) +#define DSC_STATUS_0_DSC_HM_TYPE_SHIFT (0U) +#define DSC_STATUS_0_DSC_HM_TYPE(x) (((uint32_t)(((uint32_t)(x)) << DSC_STATUS_0_DSC_HM_TYPE_SHIFT)) & DSC_STATUS_0_DSC_HM_TYPE_MASK) + +/*! @name DFT_CTRL - DFT Control */ +#define DSC_DFT_CTRL_TCU_RSTN_MASK (0x1U) +#define DSC_DFT_CTRL_TCU_RSTN_SHIFT (0U) +#define DSC_DFT_CTRL_TCU_RSTN(x) (((uint32_t)(((uint32_t)(x)) << DSC_DFT_CTRL_TCU_RSTN_SHIFT)) & DSC_DFT_CTRL_TCU_RSTN_MASK) +#define DSC_DFT_CTRL_BI_BIST_MODE_MASK (0x2U) +#define DSC_DFT_CTRL_BI_BIST_MODE_SHIFT (1U) +#define DSC_DFT_CTRL_BI_BIST_MODE(x) (((uint32_t)(((uint32_t)(x)) << DSC_DFT_CTRL_BI_BIST_MODE_SHIFT)) & DSC_DFT_CTRL_BI_BIST_MODE_MASK) +#define DSC_DFT_CTRL_BI_DC_SCAN_MODE_MASK (0x4U) +#define DSC_DFT_CTRL_BI_DC_SCAN_MODE_SHIFT (2U) +#define DSC_DFT_CTRL_BI_DC_SCAN_MODE(x) (((uint32_t)(((uint32_t)(x)) << DSC_DFT_CTRL_BI_DC_SCAN_MODE_SHIFT)) & DSC_DFT_CTRL_BI_DC_SCAN_MODE_MASK) +#define DSC_DFT_CTRL_BI_IO_EN_MASK (0x8U) +#define DSC_DFT_CTRL_BI_IO_EN_SHIFT (3U) +#define DSC_DFT_CTRL_BI_IO_EN(x) (((uint32_t)(((uint32_t)(x)) << DSC_DFT_CTRL_BI_IO_EN_SHIFT)) & DSC_DFT_CTRL_BI_IO_EN_MASK) + +/*! + * @} + */ /* end of group DSC_Register_Masks */ + +/* DSC - Peripheral instance base addresses */ +/** Peripheral dsc base pointer */ +#define DSC1 ((DSC_Type *)DSC1_BASE) +/** Peripheral dsc base pointer */ +#define DSC2 ((DSC_Type *)DSC2_BASE) +/** Peripheral dsc base pointer */ +#define DSC3 ((DSC_Type *)DSC3_BASE) +/** Peripheral dsc base pointer */ +#define DSC4 ((DSC_Type *)DSC4_BASE) +/** Peripheral dsc base pointer */ +#define DSC5 ((DSC_Type *)DSC5_BASE) +/** Peripheral dsc base pointer */ +#define DSC6 ((DSC_Type *)DSC6_BASE) +/** Peripheral dsc base pointer */ +#define DSC7 ((DSC_Type *)DSC7_BASE) +/** Peripheral dsc base pointer */ +#define DSC8 ((DSC_Type *)DSC8_BASE) +/** Peripheral dsc base pointer */ +#define DSC9 ((DSC_Type *)DSC9_BASE) +/** Peripheral dsc base pointer */ +#define DSC10 ((DSC_Type *)DSC10_BASE) +/** Peripheral dsc base pointer */ +#define DSC11 ((DSC_Type *)DSC11_BASE) +/** Peripheral dsc base pointer */ +#define DSC12 ((DSC_Type *)DSC12_BASE) +/** Peripheral dsc base pointer */ +#define DSC13 ((DSC_Type *)DSC13_BASE) +/** Peripheral dsc base pointer */ +#define DSC14 ((DSC_Type *)DSC14_BASE) +/** Peripheral dsc base pointer */ +#define DSC15 ((DSC_Type *)DSC15_BASE) +/** Peripheral dsc base pointer */ +#define DSC17 ((DSC_Type *)DSC17_BASE) +/** Peripheral dsc base pointer */ +#define DSC18 ((DSC_Type *)DSC18_BASE) +/** Peripheral dsc base pointer */ +#define DSC19 ((DSC_Type *)DSC19_BASE) +/** Peripheral dsc base pointer */ +#define DSC20 ((DSC_Type *)DSC20_BASE) +/** Peripheral dsc base pointer */ +#define DSC21 ((DSC_Type *)DSC21_BASE) +/** Peripheral dsc base pointer */ +#define DSC22 ((DSC_Type *)DSC22_BASE) +/** Peripheral dsc base pointer */ +#define DSC23 ((DSC_Type *)DSC23_BASE) +/** Peripheral dsc base pointer */ +#define DSC24 ((DSC_Type *)DSC24_BASE) +/** Peripheral dsc base pointer */ +#define DSC25 ((DSC_Type *)DSC25_BASE) +/** Peripheral dsc base pointer */ +#define DSC26 ((DSC_Type *)DSC26_BASE) +/** Peripheral dsc base pointer */ +#define DSC27 ((DSC_Type *)DSC27_BASE) +/** Peripheral dsc base pointer */ +#define DSC28 ((DSC_Type *)DSC28_BASE) +/** Peripheral dsc base pointer */ +#define DSC29 ((DSC_Type *)DSC29_BASE) +/** Peripheral dsc base pointer */ +#define DSC30 ((DSC_Type *)DSC30_BASE) +/** Peripheral dsc base pointer */ +#define DSC31 ((DSC_Type *)DSC31_BASE) +/** Peripheral dsc base pointer */ +#define DSC33 ((DSC_Type *)DSC33_BASE) +/** Peripheral dsc base pointer */ +#define DSC34 ((DSC_Type *)DSC34_BASE) +/** Peripheral dsc base pointer */ +#define DSC35 ((DSC_Type *)DSC35_BASE) +/** Peripheral dsc base pointer */ +#define DSC36 ((DSC_Type *)DSC36_BASE) +/** Peripheral dsc base pointer */ +#define DSC37 ((DSC_Type *)DSC37_BASE) +/** Peripheral dsc base pointer */ +#define DSC38 ((DSC_Type *)DSC38_BASE) +/** Peripheral dsc base pointer */ +#define DSC39 ((DSC_Type *)DSC39_BASE) +/** Peripheral dsc base pointer */ +#define DSC40 ((DSC_Type *)DSC40_BASE) +/** Peripheral dsc base pointer */ +#define DSC41 ((DSC_Type *)DSC41_BASE) +/** Peripheral dsc base pointer */ +#define DSC42 ((DSC_Type *)DSC42_BASE) +/** Peripheral dsc base pointer */ +#define DSC43 ((DSC_Type *)DSC43_BASE) +/** Peripheral dsc base pointer */ +#define DSC44 ((DSC_Type *)DSC44_BASE) +/** Peripheral dsc base pointer */ +#define DSC45 ((DSC_Type *)DSC45_BASE) +/** Peripheral dsc base pointer */ +#define DSC46 ((DSC_Type *)DSC46_BASE) +/** Peripheral dsc base pointer */ +#define DSC47 ((DSC_Type *)DSC47_BASE) +/** Peripheral dsc base pointer */ +#define DSC49 ((DSC_Type *)DSC49_BASE) +/** Peripheral dsc base pointer */ +#define DSC50 ((DSC_Type *)DSC50_BASE) +/** Peripheral dsc base pointer */ +#define DSC51 ((DSC_Type *)DSC51_BASE) +/** Peripheral dsc base pointer */ +#define DSC52 ((DSC_Type *)DSC52_BASE) +/** Peripheral dsc base pointer */ +#define DSC53 ((DSC_Type *)DSC53_BASE) +/** Peripheral dsc base pointer */ +#define DSC54 ((DSC_Type *)DSC54_BASE) +/** Peripheral dsc base pointer */ +#define DSC55 ((DSC_Type *)DSC55_BASE) +/** Peripheral dsc base pointer */ +#define DSC56 ((DSC_Type *)DSC56_BASE) +/** Peripheral dsc base pointer */ +#define DSC57 ((DSC_Type *)DSC57_BASE) +/** Peripheral dsc base pointer */ +#define DSC58 ((DSC_Type *)DSC58_BASE) +/** Peripheral dsc base pointer */ +#define DSC59 ((DSC_Type *)DSC59_BASE) +/** Peripheral dsc base pointer */ +#define DSC60 ((DSC_Type *)DSC60_BASE) +/** Peripheral dsc base pointer */ +#define DSC61 ((DSC_Type *)DSC61_BASE) +/** Peripheral dsc base pointer */ +#define DSC62 ((DSC_Type *)DSC62_BASE) +/** Peripheral dsc base pointer */ +#define DSC63 ((DSC_Type *)DSC63_BASE) +/** Array initializer of DSC peripheral base addresses */ +#define DSC_BASE_ADDRS { DSC1_BASE, DSC2_BASE, DSC3_BASE, DSC4_BASE, DSC5_BASE, DSC6_BASE, DSC7_BASE, DSC8_BASE, DSC9_BASE, DSC10_BASE, DSC11_BASE, DSC12_BASE, DSC13_BASE, DSC14_BASE, DSC15_BASE, DSC17_BASE, DSC18_BASE, DSC19_BASE, DSC20_BASE, DSC21_BASE, DSC22_BASE, DSC23_BASE, DSC24_BASE, DSC25_BASE, DSC26_BASE, DSC27_BASE, DSC28_BASE, DSC29_BASE, DSC30_BASE, DSC31_BASE, DSC33_BASE, DSC34_BASE, DSC35_BASE, DSC36_BASE, DSC37_BASE, DSC38_BASE, DSC39_BASE, DSC40_BASE, DSC41_BASE, DSC42_BASE, DSC43_BASE, DSC44_BASE, DSC45_BASE, DSC46_BASE, DSC47_BASE, DSC49_BASE, DSC50_BASE, DSC51_BASE, DSC52_BASE, DSC53_BASE, DSC54_BASE, DSC55_BASE, DSC56_BASE, DSC57_BASE, DSC58_BASE, DSC59_BASE, DSC60_BASE, DSC61_BASE, DSC62_BASE, DSC63_BASE } +/** Array initializer of DSC peripheral base pointers */ +#define DSC_BASE_PTRS { DSC1, DSC2, DSC3, DSC4, DSC5, DSC6, DSC7, DSC8, DSC9, DSC10, DSC11, DSC12, DSC13, DSC14, DSC15, DSC17, DSC18, DSC19, DSC20, DSC21, DSC22, DSC23, DSC24, DSC25, DSC26, DSC27, DSC28, DSC29, DSC30, DSC31, DSC33, DSC34, DSC35, DSC36, DSC37, DSC38, DSC39, DSC40, DSC41, DSC42, DSC43, DSC44, DSC45, DSC46, DSC47, DSC49, DSC50, DSC51, DSC52, DSC53, DSC54, DSC55, DSC56, DSC57, DSC58, DSC59, DSC60, DSC61, DSC62, DSC63 } + +/*! + * @} + */ /* end of group DSC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- MSI_MSTR Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MSI_MSTR_Peripheral_Access_Layer MSI_MSTR Peripheral Access Layer + * @{ + */ + +/** MSI_MSTR - Register Layout Typedef */ +typedef struct { + __IO uint32_t DEBUG0; /**< AHB address of last transaction from AHB error response, offset: 0x0 */ + __IO uint32_t DEBUG1; /**< AHB command of last transaction from AHB error response, offset: 0x4 */ + __IO uint32_t CTRL0; /**< MSI Master Control, offset: 0x8 */ + __IO uint32_t CTRL1; /**< MSI Master Control, offset: 0xC */ + struct { /* offset: 0x10 */ + __IO uint32_t RW; /**< MSI IRQ Mask, offset: 0x10 */ + __IO uint32_t SET; /**< MSI IRQ Mask, offset: 0x14 */ + __IO uint32_t CLR; /**< MSI IRQ Mask, offset: 0x18 */ + __IO uint32_t TOG; /**< MSI IRQ Mask, offset: 0x1C */ + } IRQ_MASK; + struct { /* offset: 0x20 */ + __IO uint32_t RW; /**< MSI IRQ, offset: 0x20 */ + __IO uint32_t SET; /**< MSI IRQ, offset: 0x24 */ + __IO uint32_t CLR; /**< MSI IRQ, offset: 0x28 */ + __IO uint32_t TOG; /**< MSI IRQ, offset: 0x2C */ + } IRQ; + struct { /* offset: 0x30 */ + __I uint32_t RW; /**< MSI IRQ Masked Status, offset: 0x30 */ + __I uint32_t SET; /**< MSI IRQ Masked Status, offset: 0x34 */ + __I uint32_t CLR; /**< MSI IRQ Masked Status, offset: 0x38 */ + __I uint32_t TOG; /**< MSI IRQ Masked Status, offset: 0x3C */ + } IRQ_MASK_STATUS; + __I uint32_t STATUS; /**< MSI Master Control STATUS, offset: 0x40 */ +} MSI_MSTR_Type; + +/* ---------------------------------------------------------------------------- + -- MSI_MSTR Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MSI_MSTR_Register_Masks MSI_MSTR Register Masks + * @{ + */ + +/*! @name DEBUG0 - AHB address of last transaction from AHB error response */ +#define MSI_MSTR_DEBUG0_HADDR_MASK (0xFFFFFFFFU) +#define MSI_MSTR_DEBUG0_HADDR_SHIFT (0U) +#define MSI_MSTR_DEBUG0_HADDR(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_DEBUG0_HADDR_SHIFT)) & MSI_MSTR_DEBUG0_HADDR_MASK) + +/*! @name DEBUG1 - AHB command of last transaction from AHB error response */ +#define MSI_MSTR_DEBUG1_HBURST_MASK (0x7U) +#define MSI_MSTR_DEBUG1_HBURST_SHIFT (0U) +#define MSI_MSTR_DEBUG1_HBURST(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_DEBUG1_HBURST_SHIFT)) & MSI_MSTR_DEBUG1_HBURST_MASK) +#define MSI_MSTR_DEBUG1_HSIZE_MASK (0x38U) +#define MSI_MSTR_DEBUG1_HSIZE_SHIFT (3U) +#define MSI_MSTR_DEBUG1_HSIZE(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_DEBUG1_HSIZE_SHIFT)) & MSI_MSTR_DEBUG1_HSIZE_MASK) +#define MSI_MSTR_DEBUG1_HWRITE_MASK (0x40U) +#define MSI_MSTR_DEBUG1_HWRITE_SHIFT (6U) +#define MSI_MSTR_DEBUG1_HWRITE(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_DEBUG1_HWRITE_SHIFT)) & MSI_MSTR_DEBUG1_HWRITE_MASK) + +/*! @name CTRL0 - MSI Master Control */ +#define MSI_MSTR_CTRL0_RESET_KICK_MASK (0x1U) +#define MSI_MSTR_CTRL0_RESET_KICK_SHIFT (0U) +#define MSI_MSTR_CTRL0_RESET_KICK(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_CTRL0_RESET_KICK_SHIFT)) & MSI_MSTR_CTRL0_RESET_KICK_MASK) +#define MSI_MSTR_CTRL0_WR_BURST_CONVERT_MASK (0x2U) +#define MSI_MSTR_CTRL0_WR_BURST_CONVERT_SHIFT (1U) +#define MSI_MSTR_CTRL0_WR_BURST_CONVERT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_CTRL0_WR_BURST_CONVERT_SHIFT)) & MSI_MSTR_CTRL0_WR_BURST_CONVERT_MASK) +#define MSI_MSTR_CTRL0_RD_BURST_CONVERT_MASK (0x4U) +#define MSI_MSTR_CTRL0_RD_BURST_CONVERT_SHIFT (2U) +#define MSI_MSTR_CTRL0_RD_BURST_CONVERT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_CTRL0_RD_BURST_CONVERT_SHIFT)) & MSI_MSTR_CTRL0_RD_BURST_CONVERT_MASK) +#define MSI_MSTR_CTRL0_POST_WR_LIMIT_MASK (0x1FF8U) +#define MSI_MSTR_CTRL0_POST_WR_LIMIT_SHIFT (3U) +#define MSI_MSTR_CTRL0_POST_WR_LIMIT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_CTRL0_POST_WR_LIMIT_SHIFT)) & MSI_MSTR_CTRL0_POST_WR_LIMIT_MASK) + +/*! @name CTRL1 - MSI Master Control */ +#define MSI_MSTR_CTRL1_TIMEOUT_COUNT_MASK (0xFFFFFU) +#define MSI_MSTR_CTRL1_TIMEOUT_COUNT_SHIFT (0U) +#define MSI_MSTR_CTRL1_TIMEOUT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_CTRL1_TIMEOUT_COUNT_SHIFT)) & MSI_MSTR_CTRL1_TIMEOUT_COUNT_MASK) + +/*! @name IRQ_MASK - MSI IRQ Mask */ +#define MSI_MSTR_IRQ_MASK_MSI_MSTR_ERROR_MASK (0x1U) +#define MSI_MSTR_IRQ_MASK_MSI_MSTR_ERROR_SHIFT (0U) +#define MSI_MSTR_IRQ_MASK_MSI_MSTR_ERROR(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_MASK_MSI_MSTR_ERROR_SHIFT)) & MSI_MSTR_IRQ_MASK_MSI_MSTR_ERROR_MASK) +#define MSI_MSTR_IRQ_MASK_AHB_TIMEOUT_MASK (0x2U) +#define MSI_MSTR_IRQ_MASK_AHB_TIMEOUT_SHIFT (1U) +#define MSI_MSTR_IRQ_MASK_AHB_TIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_MASK_AHB_TIMEOUT_SHIFT)) & MSI_MSTR_IRQ_MASK_AHB_TIMEOUT_MASK) + +/*! @name IRQ - MSI IRQ */ +#define MSI_MSTR_IRQ_MSI_MSTR_ERROR_MASK (0x1U) +#define MSI_MSTR_IRQ_MSI_MSTR_ERROR_SHIFT (0U) +#define MSI_MSTR_IRQ_MSI_MSTR_ERROR(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_MSI_MSTR_ERROR_SHIFT)) & MSI_MSTR_IRQ_MSI_MSTR_ERROR_MASK) +#define MSI_MSTR_IRQ_AHB_TIMEOUT_MASK (0x2U) +#define MSI_MSTR_IRQ_AHB_TIMEOUT_SHIFT (1U) +#define MSI_MSTR_IRQ_AHB_TIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_AHB_TIMEOUT_SHIFT)) & MSI_MSTR_IRQ_AHB_TIMEOUT_MASK) + +/*! @name IRQ_MASK_STATUS - MSI IRQ Masked Status */ +#define MSI_MSTR_IRQ_MASK_STATUS_MSI_MSTR_ERROR_MASK (0x1U) +#define MSI_MSTR_IRQ_MASK_STATUS_MSI_MSTR_ERROR_SHIFT (0U) +#define MSI_MSTR_IRQ_MASK_STATUS_MSI_MSTR_ERROR(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_MASK_STATUS_MSI_MSTR_ERROR_SHIFT)) & MSI_MSTR_IRQ_MASK_STATUS_MSI_MSTR_ERROR_MASK) +#define MSI_MSTR_IRQ_MASK_STATUS_AHB_TIMEOUT_MASK (0x2U) +#define MSI_MSTR_IRQ_MASK_STATUS_AHB_TIMEOUT_SHIFT (1U) +#define MSI_MSTR_IRQ_MASK_STATUS_AHB_TIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_IRQ_MASK_STATUS_AHB_TIMEOUT_SHIFT)) & MSI_MSTR_IRQ_MASK_STATUS_AHB_TIMEOUT_MASK) + +/*! @name STATUS - MSI Master Control STATUS */ +#define MSI_MSTR_STATUS_OTC_CNT_GT0_MASK (0x1U) +#define MSI_MSTR_STATUS_OTC_CNT_GT0_SHIFT (0U) +#define MSI_MSTR_STATUS_OTC_CNT_GT0(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_STATUS_OTC_CNT_GT0_SHIFT)) & MSI_MSTR_STATUS_OTC_CNT_GT0_MASK) +#define MSI_MSTR_STATUS_AHB_WR_OTC_CNT_MASK (0xFFEU) +#define MSI_MSTR_STATUS_AHB_WR_OTC_CNT_SHIFT (1U) +#define MSI_MSTR_STATUS_AHB_WR_OTC_CNT(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_STATUS_AHB_WR_OTC_CNT_SHIFT)) & MSI_MSTR_STATUS_AHB_WR_OTC_CNT_MASK) +#define MSI_MSTR_STATUS_POST_WR_TIMEOUT_ERROR_MASK (0x1000U) +#define MSI_MSTR_STATUS_POST_WR_TIMEOUT_ERROR_SHIFT (12U) +#define MSI_MSTR_STATUS_POST_WR_TIMEOUT_ERROR(x) (((uint32_t)(((uint32_t)(x)) << MSI_MSTR_STATUS_POST_WR_TIMEOUT_ERROR_SHIFT)) & MSI_MSTR_STATUS_POST_WR_TIMEOUT_ERROR_MASK) + + +/*! + * @} + */ /* end of group MSI_MSTR_Register_Masks */ + + +/* MSI_MSTR - Peripheral instance base addresses */ +/** Peripheral msi_mstr base pointer */ +#define MSI0 ((MSI_MSTR_Type *)MSI0_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI1 ((MSI_MSTR_Type *)MSI1_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI2 ((MSI_MSTR_Type *)MSI2_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI3 ((MSI_MSTR_Type *)MSI3_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI4 ((MSI_MSTR_Type *)MSI4_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI5 ((MSI_MSTR_Type *)MSI5_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI6 ((MSI_MSTR_Type *)MSI6_BASE) +/** Peripheral msi_mstr base pointer */ +#define MSI7 ((MSI_MSTR_Type *)MSI7_BASE) +/** Array initializer of MSI_MSTR peripheral base addresses */ +#define MSI_MSTR_BASE_ADDRS { MSI0_BASE, MSI1_BASE, MSI2_BASE, MSI3_BASE, MSI4_BASE, MSI5_BASE, MSI6_BASE, MSI7_BASE } +/** Array initializer of MSI_MSTR peripheral base pointers */ +#define MSI_MSTR_BASE_PTRS { MSI0, MSI1, MSI2, MSI3, MSI4, MSI5, MSI6, MSI7 } + +/*! + * @} + */ /* end of group MSI_MSTR_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* HW_DSC_REGISTERS_H */ + diff --git a/platform/devices/MX8/MX8_dsc_ai.h b/platform/devices/MX8/MX8_dsc_ai.h new file mode 100755 index 0000000..ae9fe5a --- /dev/null +++ b/platform/devices/MX8/MX8_dsc_ai.h @@ -0,0 +1,1211 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_dsc_ai.h.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for teh DSC AI + * + * CMSIS Peripheral Access Layer for the DSC AI + */ + +#ifndef HW_DSC_AI_REGISTERS_H +#define HW_DSC_AI_REGISTERS_H /**< Symbol preventing repeated inclusion */ + +// AI - Fractional PLL Local Control Register Memory Map +#define AI_FRAC_PLL_LOCAL_CTRL 0x00U +#define AI_FRAC_PLL_LOCAL_SPECTRUM 0x10U +#define AI_FRAC_PLL_LOCAL_NUMERATOR 0x20U +#define AI_FRAC_PLL_LOCAL_DENOMINATOR 0x30U + + +// AI Toggle Map + +#define AI_PLL0_TOGGLE (0U) +#define AI_PLL1_TOGGLE (1U) +#define AI_PLL2_TOGGLE (2U) +#define AI_OSC24M_TOGGLE (3U) +#define AI_RC200OSC_TOGGLE (4U) +#define AI_VDROP_PROCMON_TOGGLE (5U) +#define AI_TEMP_SENSE_TOGGLE (6U) +#define AI_LVDS_TRANS_TOGGLE (7U) +#define AI_NEG_CHARGE_PUMP_TOGGLE (8U) +#define AI_WELL_LEVEL_SOURCE_TOGGLE (9U) +#define AI_BANDGAP_REF_TOGGLE (10U) +#define AI_VA_REFGEN_TOGGLE (11U) +#define AI_DIFFCLK_RPTR_TOGGLE (12U) +#define AI_DIFFCLK_ROOT_TOGGLE (13U) +#define AI_DIFFCLK_TERM_TOGGLE (14U) +#define AI_DIFFCLK_RPTR1_TOGGLE (15U) +#define AI_PHY_PLL0_TOGGLE (16U) +#define AI_PHY_PLL1_TOGGLE (17U) +#define AI_PHY_LDO0_TOGGLE (18U) +#define AI_PHY_LDO1_TOGGLE (19U) +#define AI_PHY_LVDS_TRANS_TOGGLE (20U) +#define AI_PHY_BANDGAP_REF_TOGGLE (21U) +#define AI_PHY_VA_REFGEN_TOGGLE (22U) +#define AI_PHY_DIFFCLK_RPTR_TOGGLE (23U) +#define AI_PHY_DIFFCLK_ROOT0_TOGGLE (24U) +#define AI_PHY_DIFFCLK_ROOT1_TOGGLE (25U) +#define AI_PHY_DIFFCLK_ROOT2_TOGGLE (26U) +#define AI_PHY_DIFFCLK_TERM0_TOGGLE (27U) +#define AI_PHY_DIFFCLK_TERM1_TOGGLE (28U) +#define AI_PHY_DIFFCLK_TERM2_TOGGLE (29U) +#define AI_PHY_DIFFCLK_TERM3_TOGGLE (30U) +#define AI_PHY_LDO2_TOGGLE (31U) + + +// Generic AI + +#define AI_GENERIC_CTRL0_ADDR (0x0000U) +#define AI_GENERIC_CTRL0_SET_ADDR (0x0004U) +#define AI_GENERIC_CTRL0_CLEAR_ADDR (0x0008U) +#define AI_GENERIC_CTRL0_TOGGLE_ADDR (0x000cU) +#define AI_GENERIC_CTRL1_ADDR (0x0010U) +#define AI_GENERIC_CTRL1_SET_ADDR (0x0014U) +#define AI_GENERIC_CTRL1_CLEAR_ADDR (0x0018U) +#define AI_GENERIC_CTRL1_TOGGLE_ADDR (0x001cU) +#define AI_GENERIC_CTRL2_ADDR (0x0020U) +#define AI_GENERIC_CTRL2_SET_ADDR (0x0024U) +#define AI_GENERIC_CTRL2_CLEAR_ADDR (0x0028U) +#define AI_GENERIC_CTRL2_TOGGLE_ADDR (0x002cU) +#define AI_GENERIC_CTRL3_ADDR (0x0030U) +#define AI_GENERIC_CTRL3_SET_ADDR (0x0034U) +#define AI_GENERIC_CTRL3_CLEAR_ADDR (0x0038U) +#define AI_GENERIC_CTRL3_TOGGLE_ADDR (0x003cU) +#define AI_GENERIC_CTRL4_ADDR (0x0040U) +#define AI_GENERIC_CTRL4_SET_ADDR (0x0044U) +#define AI_GENERIC_CTRL4_CLEAR_ADDR (0x0048U) +#define AI_GENERIC_CTRL4_TOGGLE_ADDR (0x004cU) +#define AI_GENERIC_STAT0_ADDR (0x0050U) +#define AI_GENERIC_STAT1_ADDR (0x0060U) +#define AI_GENERIC_STAT2_ADDR (0x0070U) + +#define AI_HP_PLL_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_HP_PLL_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_HP_PLL_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_HP_PLL_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_HP_PLL_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_OSC24M_CTRLOSC_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_OSC24M_CTRLOSC_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_OSC24M_CTRLOSC_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_OSC24M_CTRLOSC_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_OSC24M_STATOSC_ADDR (AI_GENERIC_STAT0_ADDR) +#define AI_OSC24M_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_RC200OSC_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_RC200OSC_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_RC200OSC_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_RC200OSC_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_RC200OSC_CTRL1_ADDR (AI_GENERIC_CTRL1_ADDR) +#define AI_RC200OSC_CTRL1_SET_ADDR (AI_GENERIC_CTRL1_SET_ADDR) +#define AI_RC200OSC_CTRL1_CLEAR_ADDR (AI_GENERIC_CTRL1_CLEAR_ADDR) +#define AI_RC200OSC_CTRL1_TOGGLE_ADDR (AI_GENERIC_CTRL1_TOGGLE_ADDR) +#define AI_RC200OSC_CTRL2_ADDR (AI_GENERIC_CTRL2_ADDR) +#define AI_RC200OSC_CTRL2_SET_ADDR (AI_GENERIC_CTRL2_SET_ADDR) +#define AI_RC200OSC_CTRL2_CLEAR_ADDR (AI_GENERIC_CTRL2_CLEAR_ADDR) +#define AI_RC200OSC_CTRL2_TOGGLE_ADDR (AI_GENERIC_CTRL2_TOGGLE_ADDR) +#define AI_RC200OSC_CTRL3_ADDR (AI_GENERIC_CTRL3_ADDR) +#define AI_RC200OSC_CTRL3_SET_ADDR (AI_GENERIC_CTRL3_SET_ADDR) +#define AI_RC200OSC_CTRL3_CLEAR_ADDR (AI_GENERIC_CTRL3_CLEAR_ADDR) +#define AI_RC200OSC_CTRL3_TOGGLE_ADDR (AI_GENERIC_CTRL3_TOGGLE_ADDR) +#define AI_RC200OSC_CTRL4_ADDR (AI_GENERIC_CTRL4_ADDR) +#define AI_RC200OSC_CTRL4_SET_ADDR (AI_GENERIC_CTRL4_SET_ADDR) +#define AI_RC200OSC_CTRL4_CLEAR_ADDR (AI_GENERIC_CTRL4_CLEAR_ADDR) +#define AI_RC200OSC_CTRL4_TOGGLE_ADDR (AI_GENERIC_CTRL4_TOGGLE_ADDR) +#define AI_RC200OSC_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) +#define AI_RC200OSC_STAT1_ADDR (AI_GENERIC_STAT1_ADDR) +#define AI_RC200OSC_STAT2_ADDR (AI_GENERIC_STAT2_ADDR) + +#define AI_LVDS_TRANS_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_LVDS_TRANS_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_LVDS_TRANS_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_LVDS_TRANS_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_LVDS_TRANS_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_NEG_CHARGE_PUMP_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_NEG_CHARGE_PUMP_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_NEG_CHARGE_PUMP_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_NEG_CHARGE_PUMP_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_NEG_CHARGE_PUMP_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_WELL_LEVEL_SOURCE_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_WELL_LEVEL_SOURCE_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_WELL_LEVEL_SOURCE_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_WELL_LEVEL_SOURCE_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_BANDGAP_REF_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_BANDGAP_REF_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_BANDGAP_REF_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_BANDGAP_REF_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_BANDGAP_REF_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_VA_REFGEN_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_VA_REFGEN_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_VA_REFGEN_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_VA_REFGEN_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_VA_REFGEN_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_DIFFCLK_RPTR_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_DIFFCLK_RPTR_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_DIFFCLK_RPTR_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_DIFFCLK_RPTR_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_DIFFCLK_RPTR_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_DIFFCLK_ROOT_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_DIFFCLK_ROOT_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_DIFFCLK_ROOT_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_DIFFCLK_ROOT_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_DIFFCLK_ROOT_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_DIFFCLK_TERM_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_DIFFCLK_TERM_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_DIFFCLK_TERM_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_DIFFCLK_TERM_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_DIFFCLK_TERM_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_AV_PLL_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_AV_PLL_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_AV_PLL_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_AV_PLL_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_AV_PLL_SPREAD_SPECTRUM_ADDR (AI_GENERIC_CTRL1_ADDR) +#define AI_AV_PLL_SPREAD_SPECTRUM_SET_ADDR (AI_GENERIC_CTRL1_SET_ADDR) +#define AI_AV_PLL_SPREAD_SPECTRUM_CLEAR_ADDR (AI_GENERIC_CTRL1_CLEAR_ADDR) +#define AI_AV_PLL_SPREAD_SPECTRUM_TOGGLE_ADDR (AI_GENERIC_CTRL1_TOGGLE_ADDR) +#define AI_AV_PLL_NUMERATOR_ADDR (AI_GENERIC_CTRL2_ADDR) +#define AI_AV_PLL_NUMERATOR_SET_ADDR (AI_GENERIC_CTRL2_SET_ADDR) +#define AI_AV_PLL_NUMERATOR_CLEAR_ADDR (AI_GENERIC_CTRL2_CLEAR_ADDR) +#define AI_AV_PLL_NUMERATOR_TOGGLE_ADDR (AI_GENERIC_CTRL2_TOGGLE_ADDR) +#define AI_AV_PLL_DENOMINATOR_ADDR (AI_GENERIC_CTRL3_ADDR) +#define AI_AV_PLL_DENOMINATOR_SET_ADDR (AI_GENERIC_CTRL3_SET_ADDR) +#define AI_AV_PLL_DENOMINATOR_CLEAR_ADDR (AI_GENERIC_CTRL3_CLEAR_ADDR) +#define AI_AV_PLL_DENOMINATOR_TOGGLE_ADDR (AI_GENERIC_CTRL3_TOGGLE_ADDR) +#define AI_AV_PLL_CTRL4_ADDR (AI_GENERIC_CTRL4_ADDR) +#define AI_AV_PLL_CTRL4_SET_ADDR (AI_GENERIC_CTRL4_SET_ADDR) +#define AI_AV_PLL_CTRL4_CLEAR_ADDR (AI_GENERIC_CTRL4_CLEAR_ADDR) +#define AI_AV_PLL_CTRL4_TOGGLE_ADDR (AI_GENERIC_CTRL4_TOGGLE_ADDR) +#define AI_AV_PLL_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) +#define AI_AV_PLL_STAT1_ADDR (AI_GENERIC_STAT1_ADDR) +#define AI_AV_PLL_STAT2_ADDR (AI_GENERIC_STAT2_ADDR) + +#define AI_MLB_PLL_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_MLB_PLL_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_MLB_PLL_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_MLB_PLL_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_MLB_PLL_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + +#define AI_PHY_LDO_CTRL0_ADDR (AI_GENERIC_CTRL0_ADDR) +#define AI_PHY_LDO_CTRL0_SET_ADDR (AI_GENERIC_CTRL0_SET_ADDR) +#define AI_PHY_LDO_CTRL0_CLEAR_ADDR (AI_GENERIC_CTRL0_CLEAR_ADDR) +#define AI_PHY_LDO_CTRL0_TOGGLE_ADDR (AI_GENERIC_CTRL0_TOGGLE_ADDR) +#define AI_PHY_LDO_STAT0_ADDR (AI_GENERIC_STAT0_ADDR) + + +// Custom AI + +#define AI_DIG_PLL_DIV_CTRL_ADDR (0x0000U) +#define AI_DIG_PLL_MFN_ADDR (0x0004U) +#define AI_DIG_PLL_MFD_ADDR (0x0008U) +#define AI_DIG_PLL_SSC_ADDR (0x000cU) +#define AI_DIG_PLL_LPF_CTRL_ADDR (0x0010U) +#define AI_DIG_PLL_LPF_CTRL_SET_ADDR (0x0014U) +#define AI_DIG_PLL_LPF_CTRL_CLR_ADDR (0x0018U) +#define AI_DIG_PLL_LPF_CTRL_TOG_ADDR (0x001cU) +#define AI_DIG_PLL_DCO_CTRL_ADDR (0x0020U) +#define AI_DIG_PLL_DCO_CTRL_SET_ADDR (0x0024U) +#define AI_DIG_PLL_DCO_CTRL_CLR_ADDR (0x0028U) +#define AI_DIG_PLL_DCO_CTRL_TOG_ADDR (0x002cU) +#define AI_DIG_PLL_CTRL_ADDR (0x0030U) +#define AI_DIG_PLL_CTRL_SET_ADDR (0x0034U) +#define AI_DIG_PLL_CTRL_CLR_ADDR (0x0038U) +#define AI_DIG_PLL_CTRL_TOG_ADDR (0x003cU) +#define AI_DIG_PLL_CTRL2_ADDR (0x0040U) +#define AI_DIG_PLL_CTRL2_SET_ADDR (0x0044U) +#define AI_DIG_PLL_CTRL2_CLR_ADDR (0x0048U) +#define AI_DIG_PLL_CTRL2_TOG_ADDR (0x004cU) +#define AI_DIG_PLL_CTRL3_ADDR (0x0050U) +#define AI_DIG_PLL_CTRL3_SET_ADDR (0x0054U) +#define AI_DIG_PLL_CTRL3_CLR_ADDR (0x0058U) +#define AI_DIG_PLL_CTRL3_TOG_ADDR (0x005cU) +#define AI_DIG_PLL_STATUS_ADDR (0x0060U) +#define AI_DIG_PLL_SPARE_ADDR (0x0070U) + +#define AI_DIG_PLL_DIV_CTRL_RESET (0x00000028U) +#define AI_DIG_PLL_MFN_RESET (0x00000000U) +#define AI_DIG_PLL_MFD_RESET (0x0000ffffU) +#define AI_DIG_PLL_SSC_RESET (0x00000000U) +#define AI_DIG_PLL_LPF_CTRL_RESET (0x10005026U) +#define AI_DIG_PLL_DCO_CTRL_RESET (0x0400c040U) +#define AI_DIG_PLL_CTRL_RESET (0x0f040000U) +#define AI_DIG_PLL_CTRL2_RESET (0x00030400U) +#define AI_DIG_PLL_CTRL3_RESET (0x01000100U) +#define AI_DIG_PLL_STATUS_RESET (0x00000000U) + +#define AI_DIG_PLL_DIV_CTRL_MASK (0x0000007fU) +#define AI_DIG_PLL_MFN_MASK (0x3fffffffU) +#define AI_DIG_PLL_MFD_MASK (0x3fffffffU) +#define AI_DIG_PLL_SSC_MASK (0x00ffffffU) +#define AI_DIG_PLL_LPF_CTRL_MASK (0xfffff777U) +#define AI_DIG_PLL_DCO_CTRL_MASK (0xff01ff7fU) +#define AI_DIG_PLL_CTRL_MASK (0xffffffffU) +#define AI_DIG_PLL_CTRL2_MASK (0x7ff7ffffU) +#define AI_DIG_PLL_CTRL3_MASK (0xf9c0ffffU) +#define AI_DIG_PLL_STATUS_MASK (0x01ff7f0fU) + +#define AI_VDROP_PROCMON_CTRL0_ADDR (0x0000U) +#define AI_VDROP_PROCMON_CTRL0_SET_ADDR (0x0004U) +#define AI_VDROP_PROCMON_CTRL0_CLEAR_ADDR (0x0008U) +#define AI_VDROP_PROCMON_CTRL0_TOGGLE_ADDR (0x000cU) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_ADDR (0x0010U) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_SET_ADDR (0x0014U) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_CLEAR_ADDR (0x0018U) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_TOGGLE_ADDR (0x001cU) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADDR (0x0020U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_SET_ADDR (0x0024U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_CLEAR_ADDR (0x0028U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_TOGGLE_ADDR (0x002cU) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_ADDR (0x0030U) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_SET_ADDR (0x0034U) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_CLEAR_ADDR (0x0038U) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_TOGGLE_ADDR (0x003cU) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_ADDR (0x0040U) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_SET_ADDR (0x0044U) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_CLEAR_ADDR (0x0048U) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_TOGGLE_ADDR (0x004cU) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_ADDR (0x0050U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_SET_ADDR (0x0054U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_CLEAR_ADDR (0x0058U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_TOGGLE_ADDR (0x005cU) +#define AI_VDROP_PROCMON_DEBUG_STATUS_ADDR (0x0060U) + +#define AI_TEMP_SENSE_CTRL0_ADDR (0x0000U) +#define AI_TEMP_SENSE_CTRL0_SET_ADDR (0x0004U) +#define AI_TEMP_SENSE_CTRL0_CLEAR_ADDR (0x0008U) +#define AI_TEMP_SENSE_CTRL0_TOGGLE_ADDR (0x000cU) +#define AI_TEMP_SENSE_CTRL1_ADDR (0x0010U) +#define AI_TEMP_SENSE_CTRL1_SET_ADDR (0x0014U) +#define AI_TEMP_SENSE_CTRL1_CLEAR_ADDR (0x0018U) +#define AI_TEMP_SENSE_CTRL1_TOGGLE_ADDR (0x001cU) +#define AI_TEMP_SENSE_RANGE0_ADDR (0x0020U) +#define AI_TEMP_SENSE_RANGE0_SET_ADDR (0x0024U) +#define AI_TEMP_SENSE_RANGE0_CLEAR_ADDR (0x0028U) +#define AI_TEMP_SENSE_RANGE0_TOGGLE_ADDR (0x002cU) +#define AI_TEMP_SENSE_RANGE1_ADDR (0x0030U) +#define AI_TEMP_SENSE_RANGE1_SET_ADDR (0x0034U) +#define AI_TEMP_SENSE_RANGE1_CLEAR_ADDR (0x0038U) +#define AI_TEMP_SENSE_RANGE1_TOGGLE_ADDR (0x003cU) +#define AI_TEMP_SENSE_OFFSET_COMP_ADDR (0x0040U) +#define AI_TEMP_SENSE_OFFSET_COMP_SET_ADDR (0x0044U) +#define AI_TEMP_SENSE_OFFSET_COMP_CLEAR_ADDR (0x0048U) +#define AI_TEMP_SENSE_OFFSET_COMP_TOGGLE_ADDR (0x004cU) +#define AI_TEMP_SENSE_STATUS0_ADDR (0x0050U) +#define AI_TEMP_SENSE_STATUS0_SET_ADDR (0x0054U) +#define AI_TEMP_SENSE_STATUS0_CLEAR_ADDR (0x0058U) +#define AI_TEMP_SENSE_STATUS0_TOGGLE_ADDR (0x005cU) + +// AI Registers + +#define AI_DIG_PLL_DIV_CTRL_MFI_MASK (0x7FU) +#define AI_DIG_PLL_DIV_CTRL_MFI_SHIFT (0U) +#define AI_DIG_PLL_DIV_CTRL_MFI(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_DIV_CTRL_MFI_SHIFT)) & AI_DIG_PLL_DIV_CTRL_MFI_MASK) +#define AI_DIG_PLL_MFN_VALUE_MASK (0x3FFFFFFFU) +#define AI_DIG_PLL_MFN_VALUE_SHIFT (0U) +#define AI_DIG_PLL_MFN_VALUE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_MFN_VALUE_SHIFT)) & AI_DIG_PLL_MFN_VALUE_MASK) +#define AI_DIG_PLL_MFD_VALUE_MASK (0x3FFFFFFFU) +#define AI_DIG_PLL_MFD_VALUE_SHIFT (0U) +#define AI_DIG_PLL_MFD_VALUE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_MFD_VALUE_SHIFT)) & AI_DIG_PLL_MFD_VALUE_MASK) +#define AI_DIG_PLL_SSC_STEP_MASK (0xFFFU) +#define AI_DIG_PLL_SSC_STEP_SHIFT (0U) +#define AI_DIG_PLL_SSC_STEP(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_SSC_STEP_SHIFT)) & AI_DIG_PLL_SSC_STEP_MASK) +#define AI_DIG_PLL_SSC_STOP_MASK (0xFFF000U) +#define AI_DIG_PLL_SSC_STOP_SHIFT (12U) +#define AI_DIG_PLL_SSC_STOP(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_SSC_STOP_SHIFT)) & AI_DIG_PLL_SSC_STOP_MASK) +#define AI_DIG_PLL_LPF_CTRL_KP_MASK (0x7U) +#define AI_DIG_PLL_LPF_CTRL_KP_SHIFT (0U) +#define AI_DIG_PLL_LPF_CTRL_KP(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KP_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KP_MASK) +#define AI_DIG_PLL_LPF_CTRL_KI_MASK (0x70U) +#define AI_DIG_PLL_LPF_CTRL_KI_SHIFT (4U) +#define AI_DIG_PLL_LPF_CTRL_KI(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KI_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KI_MASK) +#define AI_DIG_PLL_LPF_CTRL_KD_MASK (0x700U) +#define AI_DIG_PLL_LPF_CTRL_KD_SHIFT (8U) +#define AI_DIG_PLL_LPF_CTRL_KD(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KD_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KD_MASK) +#define AI_DIG_PLL_LPF_CTRL_KN_MASK (0xf000U) +#define AI_DIG_PLL_LPF_CTRL_KN_SHIFT (12U) +#define AI_DIG_PLL_LPF_CTRL_KN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KN_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KN_MASK) +#define AI_DIG_PLL_LPF_CTRL_FLOCK_BYP_MASK (0x10000U) +#define AI_DIG_PLL_LPF_CTRL_FLOCK_BYP_SHIFT (16U) +#define AI_DIG_PLL_LPF_CTRL_FLOCK_BYP(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_FLOCK_BYP_SHIFT)) & AI_DIG_PLL_LPF_CTRL_FLOCK_BYP_MASK) +#define AI_DIG_PLL_LPF_CTRL_KE_MASK (0x60000U) +#define AI_DIG_PLL_LPF_CTRL_KE_SHIFT (17U) +#define AI_DIG_PLL_LPF_CTRL_KE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KE_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KE_MASK) +#define AI_DIG_PLL_LPF_CTRL_KC_MASK (0x7FF80000U) +#define AI_DIG_PLL_LPF_CTRL_KC_SHIFT (19U) +#define AI_DIG_PLL_LPF_CTRL_KC(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_KC_SHIFT)) & AI_DIG_PLL_LPF_CTRL_KC_MASK) +#define AI_DIG_PLL_LPF_CTRL_FINE_PLOCK_MASK (0x80000000U) +#define AI_DIG_PLL_LPF_CTRL_FINE_PLOCK_SHIFT (31U) +#define AI_DIG_PLL_LPF_CTRL_FINE_PLOCK(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_LPF_CTRL_FINE_PLOCK_SHIFT)) & AI_DIG_PLL_LPF_CTRL_FINE_PLOCK_MASK) +#define AI_DIG_PLL_DCO_CTRL_FC_DS_MASK (0x7FU) +#define AI_DIG_PLL_DCO_CTRL_FC_DS_SHIFT (0U) +#define AI_DIG_PLL_DCO_CTRL_FC_DS(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_DCO_CTRL_FC_DS_SHIFT)) & AI_DIG_PLL_DCO_CTRL_FC_DS_MASK) +#define AI_DIG_PLL_DCO_CTRL_FC_UFINE_MASK (0x1FF00U) +#define AI_DIG_PLL_DCO_CTRL_FC_UFINE_SHIFT (8U) +#define AI_DIG_PLL_DCO_CTRL_FC_UFINE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_DCO_CTRL_FC_UFINE_SHIFT)) & AI_DIG_PLL_DCO_CTRL_FC_UFINE_MASK) +#define AI_DIG_PLL_DCO_CTRL_DCO_PC_MASK (0x7F000000U) +#define AI_DIG_PLL_DCO_CTRL_DCO_PC_SHIFT (24U) +#define AI_DIG_PLL_DCO_CTRL_DCO_PC(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_DCO_CTRL_DCO_PC_SHIFT)) & AI_DIG_PLL_DCO_CTRL_DCO_PC_MASK) +#define AI_DIG_PLL_DCO_CTRL_OVERRIDE_MASK (0x80000000U) +#define AI_DIG_PLL_DCO_CTRL_OVERRIDE_SHIFT (31U) +#define AI_DIG_PLL_DCO_CTRL_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_DCO_CTRL_OVERRIDE_SHIFT)) & AI_DIG_PLL_DCO_CTRL_OVERRIDE_MASK) +#define AI_DIG_PLL_CTRL_DPLL_CLK_EN_MASK (0x1U) +#define AI_DIG_PLL_CTRL_DPLL_CLK_EN_SHIFT (0U) +#define AI_DIG_PLL_CTRL_DPLL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_DPLL_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_DPLL_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_DPLL_DIV_2_CLK_EN_MASK (0x2U) +#define AI_DIG_PLL_CTRL_DPLL_DIV_2_CLK_EN_SHIFT (1U) +#define AI_DIG_PLL_CTRL_DPLL_DIV_2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_DPLL_DIV_2_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_DPLL_DIV_2_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_DPLL_DIV_4_CLK_EN_MASK (0x4U) +#define AI_DIG_PLL_CTRL_DPLL_DIV_4_CLK_EN_SHIFT (2U) +#define AI_DIG_PLL_CTRL_DPLL_DIV_4_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_DPLL_DIV_4_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_DPLL_DIV_4_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_DCO_CLK_EN_MASK (0x8U) +#define AI_DIG_PLL_CTRL_DCO_CLK_EN_SHIFT (3U) +#define AI_DIG_PLL_CTRL_DCO_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_DCO_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_DCO_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_PLL_TEST_MASK (0xFF0U) +#define AI_DIG_PLL_CTRL_PLL_TEST_SHIFT (4U) +#define AI_DIG_PLL_CTRL_PLL_TEST(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_PLL_TEST_SHIFT)) & AI_DIG_PLL_CTRL_PLL_TEST_MASK) +#define AI_DIG_PLL_CTRL_DCO_VCHP_DLY_MASK (0xF000U) +#define AI_DIG_PLL_CTRL_DCO_VCHP_DLY_SHIFT (12U) +#define AI_DIG_PLL_CTRL_DCO_VCHP_DLY(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_DCO_VCHP_DLY_SHIFT)) & AI_DIG_PLL_CTRL_DCO_VCHP_DLY_MASK) +#define AI_DIG_PLL_CTRL_REF_CLK_CNTR_MASK (0xF0000U) +#define AI_DIG_PLL_CTRL_REF_CLK_CNTR_SHIFT (16U) +#define AI_DIG_PLL_CTRL_REF_CLK_CNTR(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_REF_CLK_CNTR_SHIFT)) & AI_DIG_PLL_CTRL_REF_CLK_CNTR_MASK) +#define AI_DIG_PLL_CTRL_COARSE_BIT_DLY_MASK (0x3FF00000U) +#define AI_DIG_PLL_CTRL_COARSE_BIT_DLY_SHIFT (20U) +#define AI_DIG_PLL_CTRL_COARSE_BIT_DLY(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_COARSE_BIT_DLY_SHIFT)) & AI_DIG_PLL_CTRL_COARSE_BIT_DLY_MASK) +#define AI_DIG_PLL_CTRL_ENABLE_MASK (0x40000000U) +#define AI_DIG_PLL_CTRL_ENABLE_SHIFT (30U) +#define AI_DIG_PLL_CTRL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_ENABLE_SHIFT)) & AI_DIG_PLL_CTRL_ENABLE_MASK) +#define AI_DIG_PLL_CTRL_START_MASK (0x80000000U) +#define AI_DIG_PLL_CTRL_START_SHIFT (31U) +#define AI_DIG_PLL_CTRL_START(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_START_SHIFT)) & AI_DIG_PLL_CTRL_START_MASK) + +#define AI_DIG_PLL_CTRL_SET_DPLL_CLK_EN_MASK (0x1U) +#define AI_DIG_PLL_CTRL_SET_DPLL_CLK_EN_SHIFT (0U) +#define AI_DIG_PLL_CTRL_SET_DPLL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_DPLL_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_SET_DPLL_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_2_CLK_EN_MASK (0x2U) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_2_CLK_EN_SHIFT (1U) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_DPLL_DIV_2_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_SET_DPLL_DIV_2_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_4_CLK_EN_MASK (0x4U) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_4_CLK_EN_SHIFT (2U) +#define AI_DIG_PLL_CTRL_SET_DPLL_DIV_4_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_DPLL_DIV_4_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_SET_DPLL_DIV_4_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_SET_DCO_CLK_EN_MASK (0x8U) +#define AI_DIG_PLL_CTRL_SET_DCO_CLK_EN_SHIFT (3U) +#define AI_DIG_PLL_CTRL_SET_DCO_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_DCO_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_SET_DCO_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_SET_ENABLE_MASK (0x40000000U) +#define AI_DIG_PLL_CTRL_SET_ENABLE_SHIFT (30U) +#define AI_DIG_PLL_CTRL_SET_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_ENABLE_SHIFT)) & AI_DIG_PLL_CTRL_SET_ENABLE_MASK) +#define AI_DIG_PLL_CTRL_SET_START_MASK (0x80000000U) +#define AI_DIG_PLL_CTRL_SET_START_SHIFT (31U) +#define AI_DIG_PLL_CTRL_SET_START(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_SET_START_SHIFT)) & AI_DIG_PLL_CTRL_SET_START_MASK) + +#define AI_DIG_PLL_CTRL_CLR_DPLL_CLK_EN_MASK (0x1U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_CLK_EN_SHIFT (0U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_DPLL_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_CLR_DPLL_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_2_CLK_EN_MASK (0x2U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_2_CLK_EN_SHIFT (1U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_DPLL_DIV_2_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_CLR_DPLL_DIV_2_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_4_CLK_EN_MASK (0x4U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_4_CLK_EN_SHIFT (2U) +#define AI_DIG_PLL_CTRL_CLR_DPLL_DIV_4_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_DPLL_DIV_4_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_CLR_DPLL_DIV_4_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_CLR_DCO_CLK_EN_MASK (0x8U) +#define AI_DIG_PLL_CTRL_CLR_DCO_CLK_EN_SHIFT (3U) +#define AI_DIG_PLL_CTRL_CLR_DCO_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_DCO_CLK_EN_SHIFT)) & AI_DIG_PLL_CTRL_CLR_DCO_CLK_EN_MASK) +#define AI_DIG_PLL_CTRL_CLR_ENABLE_MASK (0x40000000U) +#define AI_DIG_PLL_CTRL_CLR_ENABLE_SHIFT (30U) +#define AI_DIG_PLL_CTRL_CLR_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_ENABLE_SHIFT)) & AI_DIG_PLL_CTRL_CLR_ENABLE_MASK) +#define AI_DIG_PLL_CTRL_CLR_START_MASK (0x80000000U) +#define AI_DIG_PLL_CTRL_CLR_START_SHIFT (31U) +#define AI_DIG_PLL_CTRL_CLR_START(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL_CLR_START_SHIFT)) & AI_DIG_PLL_CTRL_CLR_START_MASK) + + + +#define AI_DIG_PLL_CTRL2_EN_TRACKING_MASK (0x1U) +#define AI_DIG_PLL_CTRL2_EN_TRACKING_SHIFT (0U) +#define AI_DIG_PLL_CTRL2_EN_TRACKING(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_EN_TRACKING_SHIFT)) & AI_DIG_PLL_CTRL2_EN_TRACKING_MASK) +#define AI_DIG_PLL_CTRL2_FC_CNT_MASK (0x7FEU) +#define AI_DIG_PLL_CTRL2_FC_CNT_SHIFT (1U) +#define AI_DIG_PLL_CTRL2_FC_CNT(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_FC_CNT_SHIFT)) & AI_DIG_PLL_CTRL2_FC_CNT_MASK) +#define AI_DIG_PLL_CTRL2_FC_THRESH_MASK (0x7F800U) +#define AI_DIG_PLL_CTRL2_FC_THRESH_SHIFT (11U) +#define AI_DIG_PLL_CTRL2_FC_THRESH(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_FC_THRESH_SHIFT)) & AI_DIG_PLL_CTRL2_FC_THRESH_MASK) +#define AI_DIG_PLL_CTRL2_KE1_MASK (0x700000U) +#define AI_DIG_PLL_CTRL2_KE1_SHIFT (20U) +#define AI_DIG_PLL_CTRL2_KE1(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_KE1_SHIFT)) & AI_DIG_PLL_CTRL2_KE1_MASK) +#define AI_DIG_PLL_CTRL2_KE2_MASK (0x3800000U) +#define AI_DIG_PLL_CTRL2_KE2_SHIFT (23U) +#define AI_DIG_PLL_CTRL2_KE2(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_KE2_SHIFT)) & AI_DIG_PLL_CTRL2_KE2_MASK) +#define AI_DIG_PLL_CTRL2_KE3_MASK (0x1C000000U) +#define AI_DIG_PLL_CTRL2_KE3_SHIFT (26U) +#define AI_DIG_PLL_CTRL2_KE3(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_KE3_SHIFT)) & AI_DIG_PLL_CTRL2_KE3_MASK) +#define AI_DIG_PLL_CTRL2_DITHER_EN_MASK (0x20000000U) +#define AI_DIG_PLL_CTRL2_DITHER_EN_SHIFT (29U) +#define AI_DIG_PLL_CTRL2_DITHER_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_DITHER_EN_SHIFT)) & AI_DIG_PLL_CTRL2_DITHER_EN_MASK) +#define AI_DIG_PLL_CTRL2_SSC_EN_MASK (0x40000000U) +#define AI_DIG_PLL_CTRL2_SSC_EN_SHIFT (30U) +#define AI_DIG_PLL_CTRL2_SSC_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL2_SSC_EN_SHIFT)) & AI_DIG_PLL_CTRL2_SSC_EN_MASK) + +#define AI_DIG_PLL_CTRL3_COARSE_CNT_MASK (0xFFFFU) +#define AI_DIG_PLL_CTRL3_COARSE_CNT_SHIFT (0U) +#define AI_DIG_PLL_CTRL3_COARSE_CNT(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_COARSE_CNT_SHIFT)) & AI_DIG_PLL_CTRL3_COARSE_CNT_MASK) +#define AI_DIG_PLL_CTRL3_COARSE_ADJ_STEP_MASK (0x1C00000U) +#define AI_DIG_PLL_CTRL3_COARSE_ADJ_STEP_SHIFT (22U) +#define AI_DIG_PLL_CTRL3_COARSE_ADJ_STEP(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_COARSE_ADJ_STEP_SHIFT)) & AI_DIG_PLL_CTRL3_COARSE_ADJ_STEP_MASK) +#define AI_DIG_PLL_CTRL3_TEST_MASK (0xF8000000U) +#define AI_DIG_PLL_CTRL3_TEST_SHIFT (27U) +#define AI_DIG_PLL_CTRL3_TEST(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_TEST_SHIFT)) & AI_DIG_PLL_CTRL3_TEST_MASK) + +#define AI_DIG_PLL_CTRL3_TEST_BIT0_MASK (0x08000000U) +#define AI_DIG_PLL_CTRL3_TEST_BIT0_SHIFT (27U) +#define AI_DIG_PLL_CTRL3_TEST_BIT0(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_TEST_BIT0_SHIFT)) & AI_DIG_PLL_CTRL3_TEST_BIT0_MASK) +#define AI_DIG_PLL_CTRL3_TEST_BIT1_MASK (0x10000000U) +#define AI_DIG_PLL_CTRL3_TEST_BIT1_SHIFT (28U) +#define AI_DIG_PLL_CTRL3_TEST_BIT1(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_TEST_BIT1_SHIFT)) & AI_DIG_PLL_CTRL3_TEST_BIT1_MASK) +#define AI_DIG_PLL_CTRL3_TEST_BIT2_MASK (0x20000000U) +#define AI_DIG_PLL_CTRL3_TEST_BIT2_SHIFT (29U) +#define AI_DIG_PLL_CTRL3_TEST_BIT2(x) (((uint32_t)(((uint32_t)(x)) << AI_DIG_PLL_CTRL3_TEST_BIT2_SHIFT)) & AI_DIG_PLL_CTRL3_TEST_BIT2_MASK) + +#define AI_DIG_PLL_STATUS_FLOCK_MASK (0x1U) +#define AI_DIG_PLL_STATUS_FLOCK_SHIFT (0U) +#define AI_DIG_PLL_STATUS_FLOCK(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_FLOCK_MASK) >> AI_DIG_PLL_STATUS_FLOCK_SHIFT)) +#define AI_DIG_PLL_STATUS_PLOCK_MASK (0x2U) +#define AI_DIG_PLL_STATUS_PLOCK_SHIFT (1U) +#define AI_DIG_PLL_STATUS_PLOCK(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_PLOCK_MASK) >> AI_DIG_PLL_STATUS_PLOCK_SHIFT)) +#define AI_DIG_PLL_STATUS_S1_OVERFLOW_FLAG_MASK (0x4U) +#define AI_DIG_PLL_STATUS_S1_OVERFLOW_FLAG_SHIFT (2U) +#define AI_DIG_PLL_STATUS_S1_OVERFLOW_FLAG_FLAG(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_S1_OVERFLOW_FLAG_MASK) >> AI_DIG_PLL_STATUS_S1_OVERFLOW_FLAG_SHIFT)) +#define AI_DIG_PLL_STATUS_S1_UNDERFLOW_FLAG_MASK (0x8U) +#define AI_DIG_PLL_STATUS_S1_UNDERFLOW_FLAG_SHIFT (3U) +#define AI_DIG_PLL_STATUS_S1_UNDERFLOW_FLAG(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_S1_UNDERFLOW_FLAG_MASK) >> AI_DIG_PLL_STATUS_S1_UNDERFLOW_FLAG_SHIFT)) + +#define AI_DIG_PLL_STATUS_COUNT_SUM_LSB_MASK (0x70U) +#define AI_DIG_PLL_STATUS_COUNT_SUM_LSB_SHIFT (4U) +#define AI_DIG_PLL_STATUS_COUNT_SUM_LSB(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_COUNT_SUM_LSB_MASK) >> AI_DIG_PLL_STATUS_COUNT_SUM_LSB_SHIFT)) +#define AI_DIG_PLL_STATUS_FC_DS_MASK (0x7F00U) +#define AI_DIG_PLL_STATUS_FC_DS_SHIFT (8U) +#define AI_DIG_PLL_STATUS_FC_DS(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_FC_DS_MASK) >> AI_DIG_PLL_STATUS_FC_DS_SHIFT)) +#define AI_DIG_PLL_STATUS_FC_UFINE_MASK (0x1FF0000U) +#define AI_DIG_PLL_STATUS_FC_UFINE_SHIFT (16U) +#define AI_DIG_PLL_STATUS_FC_UFINE(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_FC_UFINE_MASK) >> AI_DIG_PLL_STATUS_FC_UFINE_SHIFT)) +#define AI_DIG_PLL_STATUS_COUNT_SUM_MSB_MASK (0xFE000000U) +#define AI_DIG_PLL_STATUS_COUNT_SUM_MSB_SHIFT (25U) +#define AI_DIG_PLL_STATUS_COUNT_SUM_MSB(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_STATUS_COUNT_SUM_MSB_MASK) >> AI_DIG_PLL_STATUS_COUNT_SUM_MSB_SHIFT)) +#define AI_DIG_PLL_SPARE_SPARE_FIELD_MASK (0xFFFFFFFFU) +#define AI_DIG_PLL_SPARE_SPARE_FIELD_SHIFT (0U) +#define AI_DIG_PLL_SPARE_SPARE_FIELD(x) ((uint32_t)((((uint32_t)(x)) & AI_DIG_PLL_SPARE_SPARE_FIELD_MASK) >> AI_DIG_PLL_SPARE_SPARE_FIELD_SHIFT)) + +#define AI_HP_PLL_CTRL0_DIV_SELECT_MASK (0xFFU) +#define AI_HP_PLL_CTRL0_DIV_SELECT_SHIFT (0U) +#define AI_HP_PLL_CTRL0_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_DIV_SELECT_SHIFT)) & AI_HP_PLL_CTRL0_DIV_SELECT_MASK) +#define AI_HP_PLL_CTRL0_HALF_LF_R_MASK (0x100U) +#define AI_HP_PLL_CTRL0_HALF_LF_R_SHIFT (8U) +#define AI_HP_PLL_CTRL0_HALF_LF_R(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_HALF_LF_R_SHIFT)) & AI_HP_PLL_CTRL0_HALF_LF_R_MASK) +#define AI_HP_PLL_CTRL0_DOUBLE_LF_R_MASK (0x200U) +#define AI_HP_PLL_CTRL0_DOUBLE_LF_R_SHIFT (9U) +#define AI_HP_PLL_CTRL0_DOUBLE_LF_R(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_DOUBLE_LF_R_SHIFT)) & AI_HP_PLL_CTRL0_DOUBLE_LF_R_MASK) +#define AI_HP_PLL_CTRL0_HALF_CP_MASK (0x400U) +#define AI_HP_PLL_CTRL0_HALF_CP_SHIFT (10U) +#define AI_HP_PLL_CTRL0_HALF_CP(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_HALF_CP_SHIFT)) & AI_HP_PLL_CTRL0_HALF_CP_MASK) +#define AI_HP_PLL_CTRL0_DOUBLE_CP_MASK (0x800U) +#define AI_HP_PLL_CTRL0_DOUBLE_CP_SHIFT (11U) +#define AI_HP_PLL_CTRL0_DOUBLE_CP(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_DOUBLE_CP_SHIFT)) & AI_HP_PLL_CTRL0_DOUBLE_CP_MASK) +#define AI_HP_PLL_CTRL0_HOLD_RING_OFF_MASK (0x1000U) +#define AI_HP_PLL_CTRL0_HOLD_RING_OFF_SHIFT (12U) +#define AI_HP_PLL_CTRL0_HOLD_RING_OFF(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_HOLD_RING_OFF_SHIFT)) & AI_HP_PLL_CTRL0_HOLD_RING_OFF_MASK) +#define AI_HP_PLL_CTRL0_PLL_POWERUP_MASK (0x2000U) +#define AI_HP_PLL_CTRL0_PLL_POWERUP_SHIFT (13U) +#define AI_HP_PLL_CTRL0_PLL_POWERUP(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_PLL_POWERUP_SHIFT)) & AI_HP_PLL_CTRL0_PLL_POWERUP_MASK) +#define AI_HP_PLL_CTRL0_REF_PCIE_CLK_EN_MASK (0x4000U) +#define AI_HP_PLL_CTRL0_REF_PCIE_CLK_EN_SHIFT (14U) +#define AI_HP_PLL_CTRL0_REF_PCIE_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_REF_PCIE_CLK_EN_SHIFT)) & AI_HP_PLL_CTRL0_REF_PCIE_CLK_EN_MASK) +#define AI_HP_PLL_CTRL0_CLK_BYPASS_MASK (0x8000U) +#define AI_HP_PLL_CTRL0_CLK_BYPASS_SHIFT (15U) +#define AI_HP_PLL_CTRL0_CLK_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_BYPASS_SHIFT)) & AI_HP_PLL_CTRL0_CLK_BYPASS_MASK) +#define AI_HP_PLL_CTRL0_BIAS_PWRUP_MASK (0x10000U) +#define AI_HP_PLL_CTRL0_BIAS_PWRUP_SHIFT (16U) +#define AI_HP_PLL_CTRL0_BIAS_PWRUP(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_BIAS_PWRUP_SHIFT)) & AI_HP_PLL_CTRL0_BIAS_PWRUP_MASK) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV4_EN_MASK (0x20000U) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV4_EN_SHIFT (17U) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV4_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_DCK_DIV4_EN_SHIFT)) & AI_HP_PLL_CTRL0_CLK_DCK_DIV4_EN_MASK) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV2_EN_MASK (0x40000U) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV2_EN_SHIFT (18U) +#define AI_HP_PLL_CTRL0_CLK_DCK_DIV2_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_DCK_DIV2_EN_SHIFT)) & AI_HP_PLL_CTRL0_CLK_DCK_DIV2_EN_MASK) +#define AI_HP_PLL_CTRL0_CLK_DCK_EN_MASK (0x80000U) +#define AI_HP_PLL_CTRL0_CLK_DCK_EN_SHIFT (19U) +#define AI_HP_PLL_CTRL0_CLK_DCK_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_DCK_EN_SHIFT)) & AI_HP_PLL_CTRL0_CLK_DCK_EN_MASK) +#define AI_HP_PLL_CTRL0_REGULATOR_LP_EN_MASK (0x100000U) +#define AI_HP_PLL_CTRL0_REGULATOR_LP_EN_SHIFT (20U) +#define AI_HP_PLL_CTRL0_REGULATOR_LP_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_REGULATOR_LP_EN_SHIFT)) & AI_HP_PLL_CTRL0_REGULATOR_LP_EN_MASK) +#define AI_HP_PLL_CTRL0_REGULATOR_EN_MASK (0x200000U) +#define AI_HP_PLL_CTRL0_REGULATOR_EN_SHIFT (21U) +#define AI_HP_PLL_CTRL0_REGULATOR_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_REGULATOR_EN_SHIFT)) & AI_HP_PLL_CTRL0_REGULATOR_EN_MASK) +#define AI_HP_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK (0xC00000U) +#define AI_HP_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT (22U) +#define AI_HP_PLL_CTRL0_REGULATOR_VOLT_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT)) & AI_HP_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK) +#define AI_HP_PLL_CTRL0_REGULATOR_TST_EN_MASK (0x1000000U) +#define AI_HP_PLL_CTRL0_REGULATOR_TST_EN_SHIFT (24U) +#define AI_HP_PLL_CTRL0_REGULATOR_TST_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_REGULATOR_TST_EN_SHIFT)) & AI_HP_PLL_CTRL0_REGULATOR_TST_EN_MASK) +#define AI_HP_PLL_CTRL0_SEL_LVDS_DIV_MASK (0x2000000U) +#define AI_HP_PLL_CTRL0_SEL_LVDS_DIV_SHIFT (25U) +#define AI_HP_PLL_CTRL0_SEL_LVDS_DIV(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_SEL_LVDS_DIV_SHIFT)) & AI_HP_PLL_CTRL0_SEL_LVDS_DIV_MASK) +#define AI_HP_PLL_CTRL0_TESTMODE_MASK (0x4000000U) +#define AI_HP_PLL_CTRL0_TESTMODE_SHIFT (26U) +#define AI_HP_PLL_CTRL0_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_TESTMODE_SHIFT)) & AI_HP_PLL_CTRL0_TESTMODE_MASK) +#define AI_HP_PLL_CTRL0_SEL_CLK_DIV_1P5_MASK (0x8000000U) +#define AI_HP_PLL_CTRL0_SEL_CLK_DIV_1P5_SHIFT (27U) +#define AI_HP_PLL_CTRL0_SEL_CLK_DIV_1P5(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_SEL_CLK_DIV_1P5_SHIFT)) & AI_HP_PLL_CTRL0_SEL_CLK_DIV_1P5_MASK) +#define AI_HP_PLL_CTRL0_CLK_DIV_1P5_EN_MASK (0x10000000U) +#define AI_HP_PLL_CTRL0_CLK_DIV_1P5_EN_SHIFT (28U) +#define AI_HP_PLL_CTRL0_CLK_DIV_1P5_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_DIV_1P5_EN_SHIFT)) & AI_HP_PLL_CTRL0_CLK_DIV_1P5_EN_MASK) +#define AI_HP_PLL_CTRL0_CLK_LVDS_EN_MASK (0x20000000U) +#define AI_HP_PLL_CTRL0_CLK_LVDS_EN_SHIFT (29U) +#define AI_HP_PLL_CTRL0_CLK_LVDS_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_LVDS_EN_SHIFT)) & AI_HP_PLL_CTRL0_CLK_LVDS_EN_MASK) +#define AI_HP_PLL_CTRL0_CLK_ISOLATION_B_MASK (0x40000000U) +#define AI_HP_PLL_CTRL0_CLK_ISOLATION_B_SHIFT (30U) +#define AI_HP_PLL_CTRL0_CLK_ISOLATION_B(x) (((uint32_t)(((uint32_t)(x)) << AI_HP_PLL_CTRL0_CLK_ISOLATION_B_SHIFT)) & AI_HP_PLL_CTRL0_CLK_ISOLATION_B_MASK) + +#define AI_OSC24M_CTRLOSC_EN_OSC_LV_MASK (0x1U) +#define AI_OSC24M_CTRLOSC_EN_OSC_LV_SHIFT (0U) +#define AI_OSC24M_CTRLOSC_EN_OSC_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_EN_OSC_LV_SHIFT)) & AI_OSC24M_CTRLOSC_EN_OSC_LV_MASK) +#define AI_OSC24M_CTRLOSC_BYPASS_REGH_LV_MASK (0x2U) +#define AI_OSC24M_CTRLOSC_BYPASS_REGH_LV_SHIFT (1U) +#define AI_OSC24M_CTRLOSC_BYPASS_REGH_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_BYPASS_REGH_LV_SHIFT)) & AI_OSC24M_CTRLOSC_BYPASS_REGH_LV_MASK) +#define AI_OSC24M_CTRLOSC_BYPASS_REGL_LV_MASK (0x4U) +#define AI_OSC24M_CTRLOSC_BYPASS_REGL_LV_SHIFT (2U) +#define AI_OSC24M_CTRLOSC_BYPASS_REGL_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_BYPASS_REGL_LV_SHIFT)) & AI_OSC24M_CTRLOSC_BYPASS_REGL_LV_MASK) +#define AI_OSC24M_CTRLOSC_EN_CLK_EXT_LV_MASK (0x8U) +#define AI_OSC24M_CTRLOSC_EN_CLK_EXT_LV_SHIFT (3U) +#define AI_OSC24M_CTRLOSC_EN_CLK_EXT_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_EN_CLK_EXT_LV_SHIFT)) & AI_OSC24M_CTRLOSC_EN_CLK_EXT_LV_MASK) +#define AI_OSC24M_CTRLOSC_TUNE_REGH_LV_MASK (0x70U) +#define AI_OSC24M_CTRLOSC_TUNE_REGH_LV_SHIFT (4U) +#define AI_OSC24M_CTRLOSC_TUNE_REGH_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_TUNE_REGH_LV_SHIFT)) & AI_OSC24M_CTRLOSC_TUNE_REGH_LV_MASK) +#define AI_OSC24M_CTRLOSC_TUNE_REGL_LV_MASK (0x380U) +#define AI_OSC24M_CTRLOSC_TUNE_REGL_LV_SHIFT (7U) +#define AI_OSC24M_CTRLOSC_TUNE_REGL_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_TUNE_REGL_LV_SHIFT)) & AI_OSC24M_CTRLOSC_TUNE_REGL_LV_MASK) +#define AI_OSC24M_CTRLOSC_IREF_TUNE_LV_MASK (0xC00U) +#define AI_OSC24M_CTRLOSC_IREF_TUNE_LV_SHIFT (10U) +#define AI_OSC24M_CTRLOSC_IREF_TUNE_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_IREF_TUNE_LV_SHIFT)) & AI_OSC24M_CTRLOSC_IREF_TUNE_LV_MASK) +#define AI_OSC24M_CTRLOSC_CL_TUNE_LV_MASK (0xF000U) +#define AI_OSC24M_CTRLOSC_CL_TUNE_LV_SHIFT (12U) +#define AI_OSC24M_CTRLOSC_CL_TUNE_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_CL_TUNE_LV_SHIFT)) & AI_OSC24M_CTRLOSC_CL_TUNE_LV_MASK) +#define AI_OSC24M_CTRLOSC_ITAIL_PKDET_LV_MASK (0x30000U) +#define AI_OSC24M_CTRLOSC_ITAIL_PKDET_LV_SHIFT (16U) +#define AI_OSC24M_CTRLOSC_ITAIL_PKDET_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_ITAIL_PKDET_LV_SHIFT)) & AI_OSC24M_CTRLOSC_ITAIL_PKDET_LV_MASK) +#define AI_OSC24M_CTRLOSC_VTEST_SEL_LV_MASK (0x1C0000U) +#define AI_OSC24M_CTRLOSC_VTEST_SEL_LV_SHIFT (18U) +#define AI_OSC24M_CTRLOSC_VTEST_SEL_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_VTEST_SEL_LV_SHIFT)) & AI_OSC24M_CTRLOSC_VTEST_SEL_LV_MASK) +#define AI_OSC24M_CTRLOSC_TEST_ENABLE_LV_MASK (0x200000U) +#define AI_OSC24M_CTRLOSC_TEST_ENABLE_LV_SHIFT (21U) +#define AI_OSC24M_CTRLOSC_TEST_ENABLE_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_TEST_ENABLE_LV_SHIFT)) & AI_OSC24M_CTRLOSC_TEST_ENABLE_LV_MASK) +#define AI_OSC24M_CTRLOSC_REGL_STANDALONE_LV_MASK (0x400000U) +#define AI_OSC24M_CTRLOSC_REGL_STANDALONE_LV_SHIFT (22U) +#define AI_OSC24M_CTRLOSC_REGL_STANDALONE_LV(x) (((uint32_t)(((uint32_t)(x)) << AI_OSC24M_CTRLOSC_REGL_STANDALONE_LV_SHIFT)) & AI_OSC24M_CTRLOSC_REGL_STANDALONE_LV_MASK) +#define AI_OSC24M_STATOSC_CLK_OKAY_LV_MASK (0x1U) +#define AI_OSC24M_STATOSC_CLK_OKAY_LV_SHIFT (0U) +#define AI_OSC24M_STATOSC_CLK_OKAY_LV(x) ((uint32_t)((((uint32_t)(x)) & AI_OSC24M_STATOSC_CLK_OKAY_LV_MASK) >> AI_OSC24M_STATOSC_CLK_OKAY_LV_SHIFT)) +#define AI_RC200OSC_CTRL0_REF_CLK_DIV_MASK (0x3F000000U) +#define AI_RC200OSC_CTRL0_REF_CLK_DIV_SHIFT (24U) +#define AI_RC200OSC_CTRL0_REF_CLK_DIV(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL0_REF_CLK_DIV_SHIFT)) & AI_RC200OSC_CTRL0_REF_CLK_DIV_MASK) +#define AI_RC200OSC_CTRL1_HYST_MINUS_MASK (0xFU) +#define AI_RC200OSC_CTRL1_HYST_MINUS_SHIFT (0U) +#define AI_RC200OSC_CTRL1_HYST_MINUS(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL1_HYST_MINUS_SHIFT)) & AI_RC200OSC_CTRL1_HYST_MINUS_MASK) +#define AI_RC200OSC_CTRL1_HYST_PLUS_MASK (0xF00U) +#define AI_RC200OSC_CTRL1_HYST_PLUS_SHIFT (8U) +#define AI_RC200OSC_CTRL1_HYST_PLUS(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL1_HYST_PLUS_SHIFT)) & AI_RC200OSC_CTRL1_HYST_PLUS_MASK) +#define AI_RC200OSC_CTRL1_TARGET_COUNT_MASK (0xFFFF0000U) +#define AI_RC200OSC_CTRL1_TARGET_COUNT_SHIFT (16U) +#define AI_RC200OSC_CTRL1_TARGET_COUNT(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL1_TARGET_COUNT_SHIFT)) & AI_RC200OSC_CTRL1_TARGET_COUNT_MASK) +#define AI_RC200OSC_CTRL2_TUNE_INV_MASK (0x100U) +#define AI_RC200OSC_CTRL2_TUNE_INV_SHIFT (8U) +#define AI_RC200OSC_CTRL2_TUNE_INV(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL2_TUNE_INV_SHIFT)) & AI_RC200OSC_CTRL2_TUNE_INV_MASK) +#define AI_RC200OSC_CTRL2_TUNE_BYP_MASK (0x400U) +#define AI_RC200OSC_CTRL2_TUNE_BYP_SHIFT (10U) +#define AI_RC200OSC_CTRL2_TUNE_BYP(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL2_TUNE_BYP_SHIFT)) & AI_RC200OSC_CTRL2_TUNE_BYP_MASK) +#define AI_RC200OSC_CTRL2_TUNE_EN_MASK (0x1000U) +#define AI_RC200OSC_CTRL2_TUNE_EN_SHIFT (12U) +#define AI_RC200OSC_CTRL2_TUNE_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL2_TUNE_EN_SHIFT)) & AI_RC200OSC_CTRL2_TUNE_EN_MASK) +#define AI_RC200OSC_CTRL2_TUNE_START_MASK (0x4000U) +#define AI_RC200OSC_CTRL2_TUNE_START_SHIFT (14U) +#define AI_RC200OSC_CTRL2_TUNE_START(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL2_TUNE_START_SHIFT)) & AI_RC200OSC_CTRL2_TUNE_START_MASK) +#define AI_RC200OSC_CTRL2_OSC_TUNE_VAL_MASK (0xFF000000U) +#define AI_RC200OSC_CTRL2_OSC_TUNE_VAL_SHIFT (24U) +#define AI_RC200OSC_CTRL2_OSC_TUNE_VAL(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL2_OSC_TUNE_VAL_SHIFT)) & AI_RC200OSC_CTRL2_OSC_TUNE_VAL_MASK) +#define AI_RC200OSC_CTRL3_CLR_ERR_MASK (0x1U) +#define AI_RC200OSC_CTRL3_CLR_ERR_SHIFT (0U) +#define AI_RC200OSC_CTRL3_CLR_ERR(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL3_CLR_ERR_SHIFT)) & AI_RC200OSC_CTRL3_CLR_ERR_MASK) +#define AI_RC200OSC_CTRL3_EN_1M_CLK_MASK (0x100U) +#define AI_RC200OSC_CTRL3_EN_1M_CLK_SHIFT (8U) +#define AI_RC200OSC_CTRL3_EN_1M_CLK(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL3_EN_1M_CLK_SHIFT)) & AI_RC200OSC_CTRL3_EN_1M_CLK_MASK) +#define AI_RC200OSC_CTRL3_MUX_1M_CLK_MASK (0x400U) +#define AI_RC200OSC_CTRL3_MUX_1M_CLK_SHIFT (10U) +#define AI_RC200OSC_CTRL3_MUX_1M_CLK(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL3_MUX_1M_CLK_SHIFT)) & AI_RC200OSC_CTRL3_MUX_1M_CLK_MASK) +#define AI_RC200OSC_CTRL3_COUNT_1M_CLK_MASK (0xFFFF0000U) +#define AI_RC200OSC_CTRL3_COUNT_1M_CLK_SHIFT (16U) +#define AI_RC200OSC_CTRL3_COUNT_1M_CLK(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL3_COUNT_1M_CLK_SHIFT)) & AI_RC200OSC_CTRL3_COUNT_1M_CLK_MASK) +#define AI_RC200OSC_CTRL4_REF_MUX_CTRL_MASK (0x30000U) +#define AI_RC200OSC_CTRL4_REF_MUX_CTRL_SHIFT (16U) +#define AI_RC200OSC_CTRL4_REF_MUX_CTRL(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL4_REF_MUX_CTRL_SHIFT)) & AI_RC200OSC_CTRL4_REF_MUX_CTRL_MASK) +#define AI_RC200OSC_CTRL4_LVDS_MUX_CTRL_MASK (0x300000U) +#define AI_RC200OSC_CTRL4_LVDS_MUX_CTRL_SHIFT (20U) +#define AI_RC200OSC_CTRL4_LVDS_MUX_CTRL(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL4_LVDS_MUX_CTRL_SHIFT)) & AI_RC200OSC_CTRL4_LVDS_MUX_CTRL_MASK) +#define AI_RC200OSC_CTRL4_LVDS_OUT_EN_MASK (0x1000000U) +#define AI_RC200OSC_CTRL4_LVDS_OUT_EN_SHIFT (24U) +#define AI_RC200OSC_CTRL4_LVDS_OUT_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL4_LVDS_OUT_EN_SHIFT)) & AI_RC200OSC_CTRL4_LVDS_OUT_EN_MASK) +#define AI_RC200OSC_CTRL4_PWD_MASK (0x20000000U) +#define AI_RC200OSC_CTRL4_PWD_SHIFT (29U) +#define AI_RC200OSC_CTRL4_PWD(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL4_PWD_SHIFT)) & AI_RC200OSC_CTRL4_PWD_MASK) +#define AI_RC200OSC_CTRL4_OSC_EN_MASK (0x80000000U) +#define AI_RC200OSC_CTRL4_OSC_EN_SHIFT (31U) +#define AI_RC200OSC_CTRL4_OSC_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_RC200OSC_CTRL4_OSC_EN_SHIFT)) & AI_RC200OSC_CTRL4_OSC_EN_MASK) +#define AI_RC200OSC_STAT0_CLK1M_ERR_MASK (0x1U) +#define AI_RC200OSC_STAT0_CLK1M_ERR_SHIFT (0U) +#define AI_RC200OSC_STAT0_CLK1M_ERR(x) ((uint32_t)((((uint32_t)(x)) & AI_RC200OSC_STAT0_CLK1M_ERR_MASK) >> AI_RC200OSC_STAT0_CLK1M_ERR_SHIFT)) +#define AI_RC200OSC_STAT1_CURR_COUNT_VAL_MASK (0xFFFF0000U) +#define AI_RC200OSC_STAT1_CURR_COUNT_VAL_SHIFT (16U) +#define AI_RC200OSC_STAT1_CURR_COUNT_VAL(x) ((uint32_t)((((uint32_t)(x)) & AI_RC200OSC_STAT1_CURR_COUNT_VAL_MASK) >> AI_RC200OSC_STAT1_CURR_COUNT_VAL_SHIFT)) +#define AI_RC200OSC_STAT2_CURR_OSC_TUNE_VAL_MASK (0xFF000000U) +#define AI_RC200OSC_STAT2_CURR_OSC_TUNE_VAL_SHIFT (24U) +#define AI_RC200OSC_STAT2_CURR_OSC_TUNE_VAL(x) ((uint32_t)((((uint32_t)(x)) & AI_RC200OSC_STAT2_CURR_OSC_TUNE_VAL_MASK) >> AI_RC200OSC_STAT2_CURR_OSC_TUNE_VAL_SHIFT)) + +#define AI_VDROP_PROCMON_CTRL0_DLY_RUN_MASK (0x1U) +#define AI_VDROP_PROCMON_CTRL0_DLY_RUN_SHIFT (0U) +#define AI_VDROP_PROCMON_CTRL0_DLY_RUN(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_DLY_RUN_SHIFT)) & AI_VDROP_PROCMON_CTRL0_DLY_RUN_MASK) +#define AI_VDROP_PROCMON_CTRL0_DLY_RELOCK_MASK (0x2U) +#define AI_VDROP_PROCMON_CTRL0_DLY_RELOCK_SHIFT (1U) +#define AI_VDROP_PROCMON_CTRL0_DLY_RELOCK(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_DLY_RELOCK_SHIFT)) & AI_VDROP_PROCMON_CTRL0_DLY_RELOCK_MASK) +#define AI_VDROP_PROCMON_CTRL0_DLY_1P_EN_MASK (0x4U) +#define AI_VDROP_PROCMON_CTRL0_DLY_1P_EN_SHIFT (2U) +#define AI_VDROP_PROCMON_CTRL0_DLY_1P_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_DLY_1P_EN_SHIFT)) & AI_VDROP_PROCMON_CTRL0_DLY_1P_EN_MASK) +#define AI_VDROP_PROCMON_CTRL0_PLL_CNT_EN_MASK (0x8U) +#define AI_VDROP_PROCMON_CTRL0_PLL_CNT_EN_SHIFT (3U) +#define AI_VDROP_PROCMON_CTRL0_PLL_CNT_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_PLL_CNT_EN_SHIFT)) & AI_VDROP_PROCMON_CTRL0_PLL_CNT_EN_MASK) +#define AI_VDROP_PROCMON_CTRL0_CLKGATE_CTRL_MASK (0x30U) +#define AI_VDROP_PROCMON_CTRL0_CLKGATE_CTRL_SHIFT (4U) +#define AI_VDROP_PROCMON_CTRL0_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_CLKGATE_CTRL_SHIFT)) & AI_VDROP_PROCMON_CTRL0_CLKGATE_CTRL_MASK) +#define AI_VDROP_PROCMON_CTRL0_ADLY_SETTLE_CNT_MASK (0x3C0U) +#define AI_VDROP_PROCMON_CTRL0_ADLY_SETTLE_CNT_SHIFT (6U) +#define AI_VDROP_PROCMON_CTRL0_ADLY_SETTLE_CNT(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_ADLY_SETTLE_CNT_SHIFT)) & AI_VDROP_PROCMON_CTRL0_ADLY_SETTLE_CNT_MASK) +#define AI_VDROP_PROCMON_CTRL0_TST_CLKGATE_CTRL_MASK (0x400U) +#define AI_VDROP_PROCMON_CTRL0_TST_CLKGATE_CTRL_SHIFT (10U) +#define AI_VDROP_PROCMON_CTRL0_TST_CLKGATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_TST_CLKGATE_CTRL_SHIFT)) & AI_VDROP_PROCMON_CTRL0_TST_CLKGATE_CTRL_MASK) +#define AI_VDROP_PROCMON_CTRL0_STATUS_SEL_MASK (0xF0000U) +#define AI_VDROP_PROCMON_CTRL0_STATUS_SEL_SHIFT (16U) +#define AI_VDROP_PROCMON_CTRL0_STATUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_CTRL0_STATUS_SEL_SHIFT)) & AI_VDROP_PROCMON_CTRL0_STATUS_SEL_MASK) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_XCK_NXT_UPD_SVAL_MASK (0xFFU) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_XCK_NXT_UPD_SVAL_SHIFT (0U) +#define AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_XCK_NXT_UPD_SVAL(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_XCK_NXT_UPD_SVAL_SHIFT)) & AI_VDROP_PROCMON_XTAL24M_TIMER_CTRL_XCK_NXT_UPD_SVAL_MASK) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_TAP_MASK (0x3FU) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_TAP_SHIFT (0U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_TAP(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_TAP_SHIFT)) & AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_TAP_MASK) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_OVRD_EN_MASK (0x80000000U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_OVRD_EN_SHIFT (31U) +#define AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_OVRD_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_OVRD_EN_SHIFT)) & AI_VDROP_PROCMON_ADLY_CHAIN_CTRL_ADLY_ENC_OVRD_EN_MASK) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_FDLY_UPDC_ADLY_INC_WTMK_MASK (0x7FFFU) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_FDLY_UPDC_ADLY_INC_WTMK_SHIFT (0U) +#define AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_FDLY_UPDC_ADLY_INC_WTMK(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_FDLY_UPDC_ADLY_INC_WTMK_SHIFT)) & AI_VDROP_PROCMON_UPDATE_INC_WATERMARK_FDLY_UPDC_ADLY_INC_WTMK_MASK) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_FDLY_UPDC_ADLY_DEC_WTMK_MASK (0x7FFFU) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_FDLY_UPDC_ADLY_DEC_WTMK_SHIFT (0U) +#define AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_FDLY_UPDC_ADLY_DEC_WTMK(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_FDLY_UPDC_ADLY_DEC_WTMK_SHIFT)) & AI_VDROP_PROCMON_UPDATE_DEC_WATERMARK_FDLY_UPDC_ADLY_DEC_WTMK_MASK) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_WTMK_MASK (0x1FU) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_WTMK_SHIFT (0U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_WTMK(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_WTMK_SHIFT)) & AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_WTMK_MASK) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_LOCK_BIT_MASK (0x1F0000U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_LOCK_BIT_SHIFT (16U) +#define AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_LOCK_BIT(x) (((uint32_t)(((uint32_t)(x)) << AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_LOCK_BIT_SHIFT)) & AI_VDROP_PROCMON_FDLY_TAP_CTRL_FDLY_TAP_LOCK_BIT_MASK) +#define AI_VDROP_PROCMON_DEBUG_STATUS_DEBUG_STATUS_MASK (0xFFFFFFFFU) +#define AI_VDROP_PROCMON_DEBUG_STATUS_DEBUG_STATUS_SHIFT (0U) +#define AI_VDROP_PROCMON_DEBUG_STATUS_DEBUG_STATUS(x) ((uint32_t)((((uint32_t)(x)) & AI_VDROP_PROCMON_DEBUG_STATUS_DEBUG_STATUS_MASK) >> AI_VDROP_PROCMON_DEBUG_STATUS_DEBUG_STATUS_SHIFT)) + +#define AI_TEMP_SENSE_CTRL0_SLOPE_CAL_MASK (0x3FU) +#define AI_TEMP_SENSE_CTRL0_SLOPE_CAL_SHIFT (0U) +#define AI_TEMP_SENSE_CTRL0_SLOPE_CAL(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL0_SLOPE_CAL_SHIFT)) & AI_TEMP_SENSE_CTRL0_SLOPE_CAL_MASK) +#define AI_TEMP_SENSE_CTRL0_V_SEL_MASK (0x300U) +#define AI_TEMP_SENSE_CTRL0_V_SEL_SHIFT (8U) +#define AI_TEMP_SENSE_CTRL0_V_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL0_V_SEL_SHIFT)) & AI_TEMP_SENSE_CTRL0_V_SEL_MASK) +#define AI_TEMP_SENSE_CTRL0_IBIAS_TRIM_MASK (0xF000U) +#define AI_TEMP_SENSE_CTRL0_IBIAS_TRIM_SHIFT (12U) +#define AI_TEMP_SENSE_CTRL0_IBIAS_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL0_IBIAS_TRIM_SHIFT)) & AI_TEMP_SENSE_CTRL0_IBIAS_TRIM_MASK) +#define AI_TEMP_SENSE_CTRL1_FREQ_MASK (0xFFFFU) +#define AI_TEMP_SENSE_CTRL1_FREQ_SHIFT (0U) +#define AI_TEMP_SENSE_CTRL1_FREQ(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_FREQ_SHIFT)) & AI_TEMP_SENSE_CTRL1_FREQ_MASK) +#define AI_TEMP_SENSE_CTRL1_FINISH_IE_MASK (0x10000U) +#define AI_TEMP_SENSE_CTRL1_FINISH_IE_SHIFT (16U) +#define AI_TEMP_SENSE_CTRL1_FINISH_IE(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_FINISH_IE_SHIFT)) & AI_TEMP_SENSE_CTRL1_FINISH_IE_MASK) +#define AI_TEMP_SENSE_CTRL1_LOW_TEMP_IE_MASK (0x20000U) +#define AI_TEMP_SENSE_CTRL1_LOW_TEMP_IE_SHIFT (17U) +#define AI_TEMP_SENSE_CTRL1_LOW_TEMP_IE(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_LOW_TEMP_IE_SHIFT)) & AI_TEMP_SENSE_CTRL1_LOW_TEMP_IE_MASK) +#define AI_TEMP_SENSE_CTRL1_HIGH_TEMP_IE_MASK (0x40000U) +#define AI_TEMP_SENSE_CTRL1_HIGH_TEMP_IE_SHIFT (18U) +#define AI_TEMP_SENSE_CTRL1_HIGH_TEMP_IE(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_HIGH_TEMP_IE_SHIFT)) & AI_TEMP_SENSE_CTRL1_HIGH_TEMP_IE_MASK) +#define AI_TEMP_SENSE_CTRL1_PANIC_TEMP_IE_MASK (0x80000U) +#define AI_TEMP_SENSE_CTRL1_PANIC_TEMP_IE_SHIFT (19U) +#define AI_TEMP_SENSE_CTRL1_PANIC_TEMP_IE(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_PANIC_TEMP_IE_SHIFT)) & AI_TEMP_SENSE_CTRL1_PANIC_TEMP_IE_MASK) +#define AI_TEMP_SENSE_CTRL1_START_MASK (0x400000U) +#define AI_TEMP_SENSE_CTRL1_START_SHIFT (22U) +#define AI_TEMP_SENSE_CTRL1_START(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_START_SHIFT)) & AI_TEMP_SENSE_CTRL1_START_MASK) +#define AI_TEMP_SENSE_CTRL1_PWD_MASK (0x800000U) +#define AI_TEMP_SENSE_CTRL1_PWD_SHIFT (23U) +#define AI_TEMP_SENSE_CTRL1_PWD(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_PWD_SHIFT)) & AI_TEMP_SENSE_CTRL1_PWD_MASK) +#define AI_TEMP_SENSE_CTRL1_FULL_PWD_MASK (0x80000000U) +#define AI_TEMP_SENSE_CTRL1_FULL_PWD_SHIFT (31U) +#define AI_TEMP_SENSE_CTRL1_FULL_PWD(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_CTRL1_FULL_PWD_SHIFT)) & AI_TEMP_SENSE_CTRL1_FULL_PWD_MASK) +#define AI_TEMP_SENSE_RANGE0_LOW_TEMP_VAL_MASK (0xFFFU) +#define AI_TEMP_SENSE_RANGE0_LOW_TEMP_VAL_SHIFT (0U) +#define AI_TEMP_SENSE_RANGE0_LOW_TEMP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_RANGE0_LOW_TEMP_VAL_SHIFT)) & AI_TEMP_SENSE_RANGE0_LOW_TEMP_VAL_MASK) +#define AI_TEMP_SENSE_RANGE0_HIGH_TEMP_VAL_MASK (0xFFF0000U) +#define AI_TEMP_SENSE_RANGE0_HIGH_TEMP_VAL_SHIFT (16U) +#define AI_TEMP_SENSE_RANGE0_HIGH_TEMP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_RANGE0_HIGH_TEMP_VAL_SHIFT)) & AI_TEMP_SENSE_RANGE0_HIGH_TEMP_VAL_MASK) +#define AI_TEMP_SENSE_RANGE1_PANIC_TEMP_VAL_MASK (0xFFFU) +#define AI_TEMP_SENSE_RANGE1_PANIC_TEMP_VAL_SHIFT (0U) +#define AI_TEMP_SENSE_RANGE1_PANIC_TEMP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_RANGE1_PANIC_TEMP_VAL_SHIFT)) & AI_TEMP_SENSE_RANGE1_PANIC_TEMP_VAL_MASK) +#define AI_TEMP_SENSE_STATUS0_TEMP_VAL_MASK (0xFFFU) +#define AI_TEMP_SENSE_STATUS0_TEMP_VAL_SHIFT (0U) +#define AI_TEMP_SENSE_STATUS0_TEMP_VAL(x) ((uint32_t)((((uint32_t)(x)) & AI_TEMP_SENSE_STATUS0_TEMP_VAL_MASK) >> AI_TEMP_SENSE_STATUS0_TEMP_VAL_SHIFT)) +#define AI_TEMP_SENSE_STATUS0_TEMP_VAL_W1C(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_STATUS0_TEMP_VAL_SHIFT)) & AI_TEMP_SENSE_STATUS0_TEMP_VAL_MASK) +#define AI_TEMP_SENSE_STATUS0_FINISH_MASK (0x10000U) +#define AI_TEMP_SENSE_STATUS0_FINISH_SHIFT (16U) +#define AI_TEMP_SENSE_STATUS0_FINISH(x) ((uint32_t)((((uint32_t)(x)) & AI_TEMP_SENSE_STATUS0_FINISH_MASK) >> AI_TEMP_SENSE_STATUS0_FINISH_SHIFT)) +#define AI_TEMP_SENSE_STATUS0_FINISH_W1C(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_STATUS0_FINISH_SHIFT)) & AI_TEMP_SENSE_STATUS0_FINISH_MASK) +#define AI_TEMP_SENSE_STATUS0_LOW_TEMP_MASK (0x20000U) +#define AI_TEMP_SENSE_STATUS0_LOW_TEMP_SHIFT (17U) +#define AI_TEMP_SENSE_STATUS0_LOW_TEMP(x) ((uint32_t)((((uint32_t)(x)) & AI_TEMP_SENSE_STATUS0_LOW_TEMP_MASK) >> AI_TEMP_SENSE_STATUS0_LOW_TEMP_SHIFT)) +#define AI_TEMP_SENSE_STATUS0_LOW_TEMP_W1C(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_STATUS0_LOW_TEMP_SHIFT)) & AI_TEMP_SENSE_STATUS0_LOW_TEMP_MASK) +#define AI_TEMP_SENSE_STATUS0_HIGH_TEMP_MASK (0x40000U) +#define AI_TEMP_SENSE_STATUS0_HIGH_TEMP_SHIFT (18U) +#define AI_TEMP_SENSE_STATUS0_HIGH_TEMP(x) ((uint32_t)((((uint32_t)(x)) & AI_TEMP_SENSE_STATUS0_HIGH_TEMP_MASK) >> AI_TEMP_SENSE_STATUS0_HIGH_TEMP_SHIFT)) +#define AI_TEMP_SENSE_STATUS0_HIGH_TEMP_W1C(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_STATUS0_HIGH_TEMP_SHIFT)) & AI_TEMP_SENSE_STATUS0_HIGH_TEMP_MASK) +#define AI_TEMP_SENSE_STATUS0_PANIC_TEMP_MASK (0x80000U) +#define AI_TEMP_SENSE_STATUS0_PANIC_TEMP_SHIFT (19U) +#define AI_TEMP_SENSE_STATUS0_PANIC_TEMP(x) ((uint32_t)((((uint32_t)(x)) & AI_TEMP_SENSE_STATUS0_PANIC_TEMP_MASK) >> AI_TEMP_SENSE_STATUS0_PANIC_TEMP_SHIFT)) +#define AI_TEMP_SENSE_STATUS0_PANIC_TEMP_W1C(x) (((uint32_t)(((uint32_t)(x)) << AI_TEMP_SENSE_STATUS0_PANIC_TEMP_SHIFT)) & AI_TEMP_SENSE_STATUS0_PANIC_TEMP_MASK) + +#define AI_LVDS_TRANS_CTRL0_IPP_OBE_MASK (0x1U) +#define AI_LVDS_TRANS_CTRL0_IPP_OBE_SHIFT (0U) +#define AI_LVDS_TRANS_CTRL0_IPP_OBE(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_IPP_OBE_SHIFT)) & AI_LVDS_TRANS_CTRL0_IPP_OBE_MASK) +#define AI_LVDS_TRANS_CTRL0_IPP_IBE_MASK (0x2U) +#define AI_LVDS_TRANS_CTRL0_IPP_IBE_SHIFT (1U) +#define AI_LVDS_TRANS_CTRL0_IPP_IBE(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_IPP_IBE_SHIFT)) & AI_LVDS_TRANS_CTRL0_IPP_IBE_MASK) +#define AI_LVDS_TRANS_CTRL0_I_TRIM_MASK (0xCU) +#define AI_LVDS_TRANS_CTRL0_I_TRIM_SHIFT (2U) +#define AI_LVDS_TRANS_CTRL0_I_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_I_TRIM_SHIFT)) & AI_LVDS_TRANS_CTRL0_I_TRIM_MASK) +#define AI_LVDS_TRANS_CTRL0_INPUT_SOURCE_MASK (0x30U) +#define AI_LVDS_TRANS_CTRL0_INPUT_SOURCE_SHIFT (4U) +#define AI_LVDS_TRANS_CTRL0_INPUT_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_INPUT_SOURCE_SHIFT)) & AI_LVDS_TRANS_CTRL0_INPUT_SOURCE_MASK) +#define AI_LVDS_TRANS_CTRL0_ANA_TEST_EN_MASK (0x40U) +#define AI_LVDS_TRANS_CTRL0_ANA_TEST_EN_SHIFT (6U) +#define AI_LVDS_TRANS_CTRL0_ANA_TEST_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_ANA_TEST_EN_SHIFT)) & AI_LVDS_TRANS_CTRL0_ANA_TEST_EN_MASK) +#define AI_LVDS_TRANS_CTRL0_DIV4_EN_MASK (0x80U) +#define AI_LVDS_TRANS_CTRL0_DIV4_EN_SHIFT (7U) +#define AI_LVDS_TRANS_CTRL0_DIV4_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_LVDS_TRANS_CTRL0_DIV4_EN_SHIFT)) & AI_LVDS_TRANS_CTRL0_DIV4_EN_MASK) + +#define AI_NEG_CHARGE_PUMP_CTRL0_EN_NCP_MASK (0x1U) +#define AI_NEG_CHARGE_PUMP_CTRL0_EN_NCP_SHIFT (0U) +#define AI_NEG_CHARGE_PUMP_CTRL0_EN_NCP(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_EN_NCP_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_EN_NCP_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_TRIM_VNEG_MASK (0x3EU) +#define AI_NEG_CHARGE_PUMP_CTRL0_TRIM_VNEG_SHIFT (1U) +#define AI_NEG_CHARGE_PUMP_CTRL0_TRIM_VNEG(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_TRIM_VNEG_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_TRIM_VNEG_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_CLK_DIV_MASK (0x40U) +#define AI_NEG_CHARGE_PUMP_CTRL0_CLK_DIV_SHIFT (6U) +#define AI_NEG_CHARGE_PUMP_CTRL0_CLK_DIV(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_CLK_DIV_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_CLK_DIV_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_DIS_CP_MASK (0x380U) +#define AI_NEG_CHARGE_PUMP_CTRL0_DIS_CP_SHIFT (7U) +#define AI_NEG_CHARGE_PUMP_CTRL0_DIS_CP(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_DIS_CP_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_DIS_CP_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_MASK (0x400U) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SHIFT (10U) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SEL_MASK (0x800U) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SEL_SHIFT (11U) +#define AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SEL_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_OPEN_SW_SEL_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_B_MASK (0x1000U) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_B_SHIFT (12U) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_B(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_B_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_B_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_SEL_MASK (0x2000U) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_SEL_SHIFT (13U) +#define AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_SEL_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_RST_VNEG_OK_SEL_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_SKIP_MODE_MASK (0x4000U) +#define AI_NEG_CHARGE_PUMP_CTRL0_SKIP_MODE_SHIFT (14U) +#define AI_NEG_CHARGE_PUMP_CTRL0_SKIP_MODE(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_SKIP_MODE_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_SKIP_MODE_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_TEST_MODE_MASK (0x38000U) +#define AI_NEG_CHARGE_PUMP_CTRL0_TEST_MODE_SHIFT (15U) +#define AI_NEG_CHARGE_PUMP_CTRL0_TEST_MODE(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_TEST_MODE_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_TEST_MODE_MASK) +#define AI_NEG_CHARGE_PUMP_CTRL0_EXTRA_MASK (0x1C0000U) +#define AI_NEG_CHARGE_PUMP_CTRL0_EXTRA_SHIFT (18U) +#define AI_NEG_CHARGE_PUMP_CTRL0_EXTRA(x) (((uint32_t)(((uint32_t)(x)) << AI_NEG_CHARGE_PUMP_CTRL0_EXTRA_SHIFT)) & AI_NEG_CHARGE_PUMP_CTRL0_EXTRA_MASK) +#define AI_NEG_CHARGE_PUMP_STAT0_VNEG_OK_MASK (0x1U) +#define AI_NEG_CHARGE_PUMP_STAT0_VNEG_OK_SHIFT (0U) +#define AI_NEG_CHARGE_PUMP_STAT0_VNEG_OK(x) ((uint32_t)((((uint32_t)(x)) & AI_NEG_CHARGE_PUMP_STAT0_VNEG_OK_MASK) >> AI_NEG_CHARGE_PUMP_STAT0_VNEG_OK_SHIFT)) +#define AI_NEG_CHARGE_PUMP_STAT0_SKIP_MASK (0x2U) +#define AI_NEG_CHARGE_PUMP_STAT0_SKIP_SHIFT (1U) +#define AI_NEG_CHARGE_PUMP_STAT0_SKIP(x) ((uint32_t)((((uint32_t)(x)) & AI_NEG_CHARGE_PUMP_STAT0_SKIP_MASK) >> AI_NEG_CHARGE_PUMP_STAT0_SKIP_SHIFT)) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_CLOSED_MASK (0x4U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_CLOSED_SHIFT (2U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_CLOSED(x) ((uint32_t)((((uint32_t)(x)) & AI_NEG_CHARGE_PUMP_STAT0_SW_CLOSED_MASK) >> AI_NEG_CHARGE_PUMP_STAT0_SW_CLOSED_SHIFT)) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_DISCHARGE_MASK (0x8U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_DISCHARGE_SHIFT (3U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_DISCHARGE(x) ((uint32_t)((((uint32_t)(x)) & AI_NEG_CHARGE_PUMP_STAT0_SW_DISCHARGE_MASK) >> AI_NEG_CHARGE_PUMP_STAT0_SW_DISCHARGE_SHIFT)) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_OPEN_MASK (0x10U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_OPEN_SHIFT (4U) +#define AI_NEG_CHARGE_PUMP_STAT0_SW_OPEN(x) ((uint32_t)((((uint32_t)(x)) & AI_NEG_CHARGE_PUMP_STAT0_SW_OPEN_MASK) >> AI_NEG_CHARGE_PUMP_STAT0_SW_OPEN_SHIFT)) + +#define AI_WELL_LEVEL_SOURCE_CTRL0_REF_V_CTRL_MASK (0xFFU) +#define AI_WELL_LEVEL_SOURCE_CTRL0_REF_V_CTRL_SHIFT (0U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_REF_V_CTRL(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_REF_V_CTRL_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_REF_V_CTRL_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_V_FB_MASK (0x700U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_V_FB_SHIFT (8U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_V_FB(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_V_FB_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_V_FB_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_SEL_MASK (0xF800U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_SEL_SHIFT (11U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_SEL_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_SEL_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_REG_LINES_MASK (0x1F0000U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_REG_LINES_SHIFT (16U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_REG_LINES(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_EN_REG_LINES_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_EN_REG_LINES_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_BLK_SEL_MASK (0xE00000U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_BLK_SEL_SHIFT (21U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_BLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_BLK_SEL_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_TEST_MODE_BLK_SEL_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_DLYD_REG_LINES_MASK (0x1F000000U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_DLYD_REG_LINES_SHIFT (24U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_EN_DLYD_REG_LINES(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_EN_DLYD_REG_LINES_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_EN_DLYD_REG_LINES_MASK) +#define AI_WELL_LEVEL_SOURCE_CTRL0_ASYM_BIAS_MASK (0xC0000000U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_ASYM_BIAS_SHIFT (30U) +#define AI_WELL_LEVEL_SOURCE_CTRL0_ASYM_BIAS(x) (((uint32_t)(((uint32_t)(x)) << AI_WELL_LEVEL_SOURCE_CTRL0_ASYM_BIAS_SHIFT)) & AI_WELL_LEVEL_SOURCE_CTRL0_ASYM_BIAS_MASK) + +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWD_MASK (0x1U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWD_SHIFT (0U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWD(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_PWD_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_PWD_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LINREGREF_PWD_MASK (0x2U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LINREGREF_PWD_SHIFT (1U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LINREGREF_PWD(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_LINREGREF_PWD_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_LINREGREF_PWD_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWDVBGUP_MASK (0x4U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWDVBGUP_SHIFT (2U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_PWDVBGUP(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_PWDVBGUP_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_PWDVBGUP_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LOWPOWER_MASK (0x8U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LOWPOWER_SHIFT (3U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_LOWPOWER(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_LOWPOWER_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_LOWPOWER_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_SELFBIASOFF_MASK (0x10U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_SELFBIASOFF_SHIFT (4U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_SELFBIASOFF(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_SELFBIASOFF_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_SELFBIASOFF_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_VBGADJ_MASK (0xE0U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_VBGADJ_SHIFT (5U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_VBGADJ(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_VBGADJ_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_VBGADJ_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_BIAS_TST_MASK (0x300U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_BIAS_TST_SHIFT (8U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_BIAS_TST(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_BIAS_TST_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_BIAS_TST_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_IBZTCADJ_MASK (0x1C00U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_IBZTCADJ_SHIFT (10U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_IBZTCADJ(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_IBZTCADJ_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_IBZTCADJ_MASK) +#define AI_BANDGAP_REF_CTRL0_REFTOP_ANATEST_MASK (0x1E000U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_ANATEST_SHIFT (13U) +#define AI_BANDGAP_REF_CTRL0_REFTOP_ANATEST(x) (((uint32_t)(((uint32_t)(x)) << AI_BANDGAP_REF_CTRL0_REFTOP_ANATEST_SHIFT)) & AI_BANDGAP_REF_CTRL0_REFTOP_ANATEST_MASK) +#define AI_BANDGAP_REF_STAT0_REFTOP_VBGUP_MASK (0x1U) +#define AI_BANDGAP_REF_STAT0_REFTOP_VBGUP_SHIFT (0U) +#define AI_BANDGAP_REF_STAT0_REFTOP_VBGUP(x) ((uint32_t)((((uint32_t)(x)) & AI_BANDGAP_REF_STAT0_REFTOP_VBGUP_MASK) >> AI_BANDGAP_REF_STAT0_REFTOP_VBGUP_SHIFT)) +#define AI_BANDGAP_REF_STAT0_VDD1_PORB_MASK (0x2U) +#define AI_BANDGAP_REF_STAT0_VDD1_PORB_SHIFT (1U) +#define AI_BANDGAP_REF_STAT0_VDD1_PORB(x) ((uint32_t)((((uint32_t)(x)) & AI_BANDGAP_REF_STAT0_VDD1_PORB_MASK) >> AI_BANDGAP_REF_STAT0_VDD1_PORB_SHIFT)) +#define AI_BANDGAP_REF_STAT0_VDD2_PORB_MASK (0x4U) +#define AI_BANDGAP_REF_STAT0_VDD2_PORB_SHIFT (2U) +#define AI_BANDGAP_REF_STAT0_VDD2_PORB(x) ((uint32_t)((((uint32_t)(x)) & AI_BANDGAP_REF_STAT0_VDD2_PORB_MASK) >> AI_BANDGAP_REF_STAT0_VDD2_PORB_SHIFT)) +#define AI_BANDGAP_REF_STAT0_VDD3_PORB_MASK (0x8U) +#define AI_BANDGAP_REF_STAT0_VDD3_PORB_SHIFT (3U) +#define AI_BANDGAP_REF_STAT0_VDD3_PORB(x) ((uint32_t)((((uint32_t)(x)) & AI_BANDGAP_REF_STAT0_VDD3_PORB_MASK) >> AI_BANDGAP_REF_STAT0_VDD3_PORB_SHIFT)) + +#define AI_VA_REFGEN_CTRL0_REFGEN_TRIM_MASK (0xFFU) +#define AI_VA_REFGEN_CTRL0_REFGEN_TRIM_SHIFT (0U) +#define AI_VA_REFGEN_CTRL0_REFGEN_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_VA_REFGEN_CTRL0_REFGEN_TRIM_SHIFT)) & AI_VA_REFGEN_CTRL0_REFGEN_TRIM_MASK) +#define AI_VA_REFGEN_CTRL0_REFGEN_ANATEST_MASK (0x700U) +#define AI_VA_REFGEN_CTRL0_REFGEN_ANATEST_SHIFT (8U) +#define AI_VA_REFGEN_CTRL0_REFGEN_ANATEST(x) (((uint32_t)(((uint32_t)(x)) << AI_VA_REFGEN_CTRL0_REFGEN_ANATEST_SHIFT)) & AI_VA_REFGEN_CTRL0_REFGEN_ANATEST_MASK) +#define AI_VA_REFGEN_CTRL0_REFGEN_EN_MASK (0x800U) +#define AI_VA_REFGEN_CTRL0_REFGEN_EN_SHIFT (11U) +#define AI_VA_REFGEN_CTRL0_REFGEN_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_VA_REFGEN_CTRL0_REFGEN_EN_SHIFT)) & AI_VA_REFGEN_CTRL0_REFGEN_EN_MASK) +#define AI_VA_REFGEN_STAT0_REFGEN_SZ_MASK (0x1U) +#define AI_VA_REFGEN_STAT0_REFGEN_SZ_SHIFT (0U) +#define AI_VA_REFGEN_STAT0_REFGEN_SZ(x) ((uint32_t)((((uint32_t)(x)) & AI_VA_REFGEN_STAT0_REFGEN_SZ_MASK) >> AI_VA_REFGEN_STAT0_REFGEN_SZ_SHIFT)) + +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_MASK (0x1U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_SHIFT (0U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_PWDB_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_PWDB_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_CLKPATH_MASK (0x2U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_CLKPATH_SHIFT (1U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_CLKPATH(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_PWDB_CLKPATH_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_PWDB_CLKPATH_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_REG1P0A_MASK (0x4U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_REG1P0A_SHIFT (2U) +#define AI_DIFFCLK_RPTR_CTRL0_PWDB_REG1P0A(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_PWDB_REG1P0A_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_PWDB_REG1P0A_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_CLKOUT_SEL_MASK (0x10U) +#define AI_DIFFCLK_RPTR_CTRL0_CLKOUT_SEL_SHIFT (4U) +#define AI_DIFFCLK_RPTR_CTRL0_CLKOUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_CLKOUT_SEL_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_CLKOUT_SEL_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_REG1P0A_ADJ_MASK (0xE0U) +#define AI_DIFFCLK_RPTR_CTRL0_REG1P0A_ADJ_SHIFT (5U) +#define AI_DIFFCLK_RPTR_CTRL0_REG1P0A_ADJ(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_REG1P0A_ADJ_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_REG1P0A_ADJ_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR0_MASK (0x300U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR0_SHIFT (8U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR0(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_DRV_CUR0_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_DRV_CUR0_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR1_MASK (0xC00U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR1_SHIFT (10U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR1(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_DRV_CUR1_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_DRV_CUR1_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_TERM_RES_MASK (0x3000U) +#define AI_DIFFCLK_RPTR_CTRL0_TERM_RES_SHIFT (12U) +#define AI_DIFFCLK_RPTR_CTRL0_TERM_RES(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_TERM_RES_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_TERM_RES_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR_IN_MASK (0xC000U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR_IN_SHIFT (14U) +#define AI_DIFFCLK_RPTR_CTRL0_DRV_CUR_IN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_DRV_CUR_IN_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_DRV_CUR_IN_MASK) +#define AI_DIFFCLK_RPTR_CTRL0_EN_VDDA1P0_TEST_MASK (0x80000000U) +#define AI_DIFFCLK_RPTR_CTRL0_EN_VDDA1P0_TEST_SHIFT (31U) +#define AI_DIFFCLK_RPTR_CTRL0_EN_VDDA1P0_TEST(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_RPTR_CTRL0_EN_VDDA1P0_TEST_SHIFT)) & AI_DIFFCLK_RPTR_CTRL0_EN_VDDA1P0_TEST_MASK) + +#define AI_DIFFCLK_ROOT_CTRL0_PWDB_MASK (0x1U) +#define AI_DIFFCLK_ROOT_CTRL0_PWDB_SHIFT (0U) +#define AI_DIFFCLK_ROOT_CTRL0_PWDB(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_PWDB_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_PWDB_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_PWDB_CLKPATH_MASK (0x2U) +#define AI_DIFFCLK_ROOT_CTRL0_PWDB_CLKPATH_SHIFT (1U) +#define AI_DIFFCLK_ROOT_CTRL0_PWDB_CLKPATH(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_PWDB_CLKPATH_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_PWDB_CLKPATH_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_MASK (0x4U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_SHIFT (2U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_DIFF_MASK (0x8U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_DIFF_SHIFT (3U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_DIFF(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_DIFF_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_CLKMUX_ENABLE_DIFF_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_DIFF_MASK (0x10U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_DIFF_SHIFT (4U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_DIFF(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_DIFF_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_DIFF_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_SE_MASK (0x20U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_SE_SHIFT (5U) +#define AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_SE(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_SE_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_CLKIN_SEL_SE_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_XTALIN_ISO_B_MASK (0x40U) +#define AI_DIFFCLK_ROOT_CTRL0_XTALIN_ISO_B_SHIFT (6U) +#define AI_DIFFCLK_ROOT_CTRL0_XTALIN_ISO_B(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_XTALIN_ISO_B_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_XTALIN_ISO_B_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR0_MASK (0x300U) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR0_SHIFT (8U) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR0(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_DRV_CUR0_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_DRV_CUR0_MASK) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR1_MASK (0xC00U) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR1_SHIFT (10U) +#define AI_DIFFCLK_ROOT_CTRL0_DRV_CUR1(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_ROOT_CTRL0_DRV_CUR1_SHIFT)) & AI_DIFFCLK_ROOT_CTRL0_DRV_CUR1_MASK) + +#define AI_DIFFCLK_TERM_CTRL0_PWDB_MASK (0x1U) +#define AI_DIFFCLK_TERM_CTRL0_PWDB_SHIFT (0U) +#define AI_DIFFCLK_TERM_CTRL0_PWDB(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_PWDB_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_PWDB_MASK) +#define AI_DIFFCLK_TERM_CTRL0_PWDB_CLKPATH_MASK (0x2U) +#define AI_DIFFCLK_TERM_CTRL0_PWDB_CLKPATH_SHIFT (1U) +#define AI_DIFFCLK_TERM_CTRL0_PWDB_CLKPATH(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_PWDB_CLKPATH_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_PWDB_CLKPATH_MASK) +#define AI_DIFFCLK_TERM_CTRL0_CLKOUT_SEL_MASK (0x10U) +#define AI_DIFFCLK_TERM_CTRL0_CLKOUT_SEL_SHIFT (4U) +#define AI_DIFFCLK_TERM_CTRL0_CLKOUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_CLKOUT_SEL_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_CLKOUT_SEL_MASK) +#define AI_DIFFCLK_TERM_CTRL0_TERM_RES_MASK (0x300U) +#define AI_DIFFCLK_TERM_CTRL0_TERM_RES_SHIFT (8U) +#define AI_DIFFCLK_TERM_CTRL0_TERM_RES(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_TERM_RES_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_TERM_RES_MASK) +#define AI_DIFFCLK_TERM_CTRL0_SQRUP_CUR_MASK (0xC00U) +#define AI_DIFFCLK_TERM_CTRL0_SQRUP_CUR_SHIFT (10U) +#define AI_DIFFCLK_TERM_CTRL0_SQRUP_CUR(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_SQRUP_CUR_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_SQRUP_CUR_MASK) +#define AI_DIFFCLK_TERM_CTRL0_DRV_CUR_IN_MASK (0x3000U) +#define AI_DIFFCLK_TERM_CTRL0_DRV_CUR_IN_SHIFT (12U) +#define AI_DIFFCLK_TERM_CTRL0_DRV_CUR_IN(x) (((uint32_t)(((uint32_t)(x)) << AI_DIFFCLK_TERM_CTRL0_DRV_CUR_IN_SHIFT)) & AI_DIFFCLK_TERM_CTRL0_DRV_CUR_IN_MASK) + +#define AI_AV_PLL_CTRL0_DIV_SELECT_MASK (0x7FU) +#define AI_AV_PLL_CTRL0_DIV_SELECT_SHIFT (0U) +#define AI_AV_PLL_CTRL0_DIV_SELECT(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_DIV_SELECT_SHIFT)) & AI_AV_PLL_CTRL0_DIV_SELECT_MASK) +#define AI_AV_PLL_CTRL0_ENABLE_ALT_MASK (0x100U) +#define AI_AV_PLL_CTRL0_ENABLE_ALT_SHIFT (8U) +#define AI_AV_PLL_CTRL0_ENABLE_ALT(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_ENABLE_ALT_SHIFT)) & AI_AV_PLL_CTRL0_ENABLE_ALT_MASK) +#define AI_AV_PLL_CTRL0_HALF_LF_MASK (0x200U) +#define AI_AV_PLL_CTRL0_HALF_LF_SHIFT (9U) +#define AI_AV_PLL_CTRL0_HALF_LF(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_HALF_LF_SHIFT)) & AI_AV_PLL_CTRL0_HALF_LF_MASK) +#define AI_AV_PLL_CTRL0_DOUBLE_LF_MASK (0x400U) +#define AI_AV_PLL_CTRL0_DOUBLE_LF_SHIFT (10U) +#define AI_AV_PLL_CTRL0_DOUBLE_LF(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_DOUBLE_LF_SHIFT)) & AI_AV_PLL_CTRL0_DOUBLE_LF_MASK) +#define AI_AV_PLL_CTRL0_HALF_CP_MASK (0x800U) +#define AI_AV_PLL_CTRL0_HALF_CP_SHIFT (11U) +#define AI_AV_PLL_CTRL0_HALF_CP(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_HALF_CP_SHIFT)) & AI_AV_PLL_CTRL0_HALF_CP_MASK) +#define AI_AV_PLL_CTRL0_DOUBLE_CP_MASK (0x1000U) +#define AI_AV_PLL_CTRL0_DOUBLE_CP_SHIFT (12U) +#define AI_AV_PLL_CTRL0_DOUBLE_CP(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_DOUBLE_CP_SHIFT)) & AI_AV_PLL_CTRL0_DOUBLE_CP_MASK) +#define AI_AV_PLL_CTRL0_HOLD_RING_OFF_MASK (0x2000U) +#define AI_AV_PLL_CTRL0_HOLD_RING_OFF_SHIFT (13U) +#define AI_AV_PLL_CTRL0_HOLD_RING_OFF(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_HOLD_RING_OFF_SHIFT)) & AI_AV_PLL_CTRL0_HOLD_RING_OFF_MASK) +#define AI_AV_PLL_CTRL0_POWERUP_MASK (0x4000U) +#define AI_AV_PLL_CTRL0_POWERUP_SHIFT (14U) +#define AI_AV_PLL_CTRL0_POWERUP(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_POWERUP_SHIFT)) & AI_AV_PLL_CTRL0_POWERUP_MASK) +#define AI_AV_PLL_CTRL0_ENABLE_MASK (0x8000U) +#define AI_AV_PLL_CTRL0_ENABLE_SHIFT (15U) +#define AI_AV_PLL_CTRL0_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_ENABLE_SHIFT)) & AI_AV_PLL_CTRL0_ENABLE_MASK) +#define AI_AV_PLL_CTRL0_BYPASS_MASK (0x10000U) +#define AI_AV_PLL_CTRL0_BYPASS_SHIFT (16U) +#define AI_AV_PLL_CTRL0_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_BYPASS_SHIFT)) & AI_AV_PLL_CTRL0_BYPASS_MASK) +#define AI_AV_PLL_CTRL0_DITHER_EN_MASK (0x20000U) +#define AI_AV_PLL_CTRL0_DITHER_EN_SHIFT (17U) +#define AI_AV_PLL_CTRL0_DITHER_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_DITHER_EN_SHIFT)) & AI_AV_PLL_CTRL0_DITHER_EN_MASK) +#define AI_AV_PLL_CTRL0_PFD_OFFSET_EN_MASK (0x40000U) +#define AI_AV_PLL_CTRL0_PFD_OFFSET_EN_SHIFT (18U) +#define AI_AV_PLL_CTRL0_PFD_OFFSET_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_PFD_OFFSET_EN_SHIFT)) & AI_AV_PLL_CTRL0_PFD_OFFSET_EN_MASK) +#define AI_AV_PLL_CTRL0_BIAS_TRIM_MASK (0x380000U) +#define AI_AV_PLL_CTRL0_BIAS_TRIM_SHIFT (19U) +#define AI_AV_PLL_CTRL0_BIAS_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_BIAS_TRIM_SHIFT)) & AI_AV_PLL_CTRL0_BIAS_TRIM_MASK) +#define AI_AV_PLL_CTRL0_PLL_REG_EN_MASK (0x400000U) +#define AI_AV_PLL_CTRL0_PLL_REG_EN_SHIFT (22U) +#define AI_AV_PLL_CTRL0_PLL_REG_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_PLL_REG_EN_SHIFT)) & AI_AV_PLL_CTRL0_PLL_REG_EN_MASK) +#define AI_AV_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK (0x1800000U) +#define AI_AV_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT (23U) +#define AI_AV_PLL_CTRL0_REGULATOR_VOLT_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT)) & AI_AV_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK) +#define AI_AV_PLL_CTRL0_POST_DIV_SEL_MASK (0xE000000U) +#define AI_AV_PLL_CTRL0_POST_DIV_SEL_SHIFT (25U) +#define AI_AV_PLL_CTRL0_POST_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_POST_DIV_SEL_SHIFT)) & AI_AV_PLL_CTRL0_POST_DIV_SEL_MASK) +#define AI_AV_PLL_CTRL0_TEST_MODE_MASK (0x40000000U) +#define AI_AV_PLL_CTRL0_TEST_MODE_SHIFT (30U) +#define AI_AV_PLL_CTRL0_TEST_MODE(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_TEST_MODE_SHIFT)) & AI_AV_PLL_CTRL0_TEST_MODE_MASK) +#define AI_AV_PLL_CTRL0_TEST_MUX_ENABLE_MASK (0x80000000U) +#define AI_AV_PLL_CTRL0_TEST_MUX_ENABLE_SHIFT (31U) +#define AI_AV_PLL_CTRL0_TEST_MUX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_CTRL0_TEST_MUX_ENABLE_SHIFT)) & AI_AV_PLL_CTRL0_TEST_MUX_ENABLE_MASK) +#define AI_AV_PLL_SPREAD_SPECTRUM_STEP_MASK (0x7FFFU) +#define AI_AV_PLL_SPREAD_SPECTRUM_STEP_SHIFT (0U) +#define AI_AV_PLL_SPREAD_SPECTRUM_STEP(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_SPREAD_SPECTRUM_STEP_SHIFT)) & AI_AV_PLL_SPREAD_SPECTRUM_STEP_MASK) +#define AI_AV_PLL_SPREAD_SPECTRUM_ENABLE_MASK (0x8000U) +#define AI_AV_PLL_SPREAD_SPECTRUM_ENABLE_SHIFT (15U) +#define AI_AV_PLL_SPREAD_SPECTRUM_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_SPREAD_SPECTRUM_ENABLE_SHIFT)) & AI_AV_PLL_SPREAD_SPECTRUM_ENABLE_MASK) +#define AI_AV_PLL_SPREAD_SPECTRUM_STOP_MASK (0xFFFF0000U) +#define AI_AV_PLL_SPREAD_SPECTRUM_STOP_SHIFT (16U) +#define AI_AV_PLL_SPREAD_SPECTRUM_STOP(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_SPREAD_SPECTRUM_STOP_SHIFT)) & AI_AV_PLL_SPREAD_SPECTRUM_STOP_MASK) +#define AI_AV_PLL_NUMERATOR_NUM_MASK (0x3FFFFFFFU) +#define AI_AV_PLL_NUMERATOR_NUM_SHIFT (0U) +#define AI_AV_PLL_NUMERATOR_NUM(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_NUMERATOR_NUM_SHIFT)) & AI_AV_PLL_NUMERATOR_NUM_MASK) +#define AI_AV_PLL_DENOMINATOR_DENOM_MASK (0x3FFFFFFFU) +#define AI_AV_PLL_DENOMINATOR_DENOM_SHIFT (0U) +#define AI_AV_PLL_DENOMINATOR_DENOM(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_DENOMINATOR_DENOM_SHIFT)) & AI_AV_PLL_DENOMINATOR_DENOM_MASK) + +#define AI_AV_PLL_STAT0_REG_MASK (0xFFFFFFFFU) +#define AI_AV_PLL_STAT0_REG_SHIFT (0U) +#define AI_AV_PLL_STAT0_REG(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_STAT0_REG_SHIFT)) & AI_AV_PLL_STAT0_REG_MASK) + +#define AI_AV_PLL_STAT1_REG_MASK (0xFFFFFFFFU) +#define AI_AV_PLL_STAT1_REG_SHIFT (0U) +#define AI_AV_PLL_STAT1_REG(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_STAT1_REG_SHIFT)) & AI_AV_PLL_STAT1_REG_MASK) +#define AI_AV_PLL_STAT2_REG_MASK (0xFFFFFFFFU) +#define AI_AV_PLL_STAT2_REG_SHIFT (0U) +#define AI_AV_PLL_STAT2_REG(x) (((uint32_t)(((uint32_t)(x)) << AI_AV_PLL_STAT1_REG_SHIFT)) & AI_AV_PLL_STAT1_REG_MASK) + +#define AI_MLB_PLL_CTRL0_PLL_REG_ENABLE_MASK (0x1U) +#define AI_MLB_PLL_CTRL0_PLL_REG_ENABLE_SHIFT (0U) +#define AI_MLB_PLL_CTRL0_PLL_REG_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_PLL_REG_ENABLE_SHIFT)) & AI_MLB_PLL_CTRL0_PLL_REG_ENABLE_MASK) +#define AI_MLB_PLL_CTRL0_POWERUP_MASK (0x2U) +#define AI_MLB_PLL_CTRL0_POWERUP_SHIFT (1U) +#define AI_MLB_PLL_CTRL0_POWERUP(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_POWERUP_SHIFT)) & AI_MLB_PLL_CTRL0_POWERUP_MASK) +#define AI_MLB_PLL_CTRL0_MLBPLL_ENABLE_MASK (0x4U) +#define AI_MLB_PLL_CTRL0_MLBPLL_ENABLE_SHIFT (2U) +#define AI_MLB_PLL_CTRL0_MLBPLL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLBPLL_ENABLE_SHIFT)) & AI_MLB_PLL_CTRL0_MLBPLL_ENABLE_MASK) +#define AI_MLB_PLL_CTRL0_MLBPLL_BYPASS_MASK (0x8U) +#define AI_MLB_PLL_CTRL0_MLBPLL_BYPASS_SHIFT (3U) +#define AI_MLB_PLL_CTRL0_MLBPLL_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLBPLL_BYPASS_SHIFT)) & AI_MLB_PLL_CTRL0_MLBPLL_BYPASS_MASK) +#define AI_MLB_PLL_CTRL0_LVDS_SRC_CLK_EN_MLB_PLL_MASK (0x10U) +#define AI_MLB_PLL_CTRL0_LVDS_SRC_CLK_EN_MLB_PLL_SHIFT (4U) +#define AI_MLB_PLL_CTRL0_LVDS_SRC_CLK_EN_MLB_PLL(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_LVDS_SRC_CLK_EN_MLB_PLL_SHIFT)) & AI_MLB_PLL_CTRL0_LVDS_SRC_CLK_EN_MLB_PLL_MASK) +#define AI_MLB_PLL_CTRL0_DOUBLE_CP_CURRENT_MASK (0x20U) +#define AI_MLB_PLL_CTRL0_DOUBLE_CP_CURRENT_SHIFT (5U) +#define AI_MLB_PLL_CTRL0_DOUBLE_CP_CURRENT(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_DOUBLE_CP_CURRENT_SHIFT)) & AI_MLB_PLL_CTRL0_DOUBLE_CP_CURRENT_MASK) +#define AI_MLB_PLL_CTRL0_HALF_CP_CURRENT_MASK (0x40U) +#define AI_MLB_PLL_CTRL0_HALF_CP_CURRENT_SHIFT (6U) +#define AI_MLB_PLL_CTRL0_HALF_CP_CURRENT(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_HALF_CP_CURRENT_SHIFT)) & AI_MLB_PLL_CTRL0_HALF_CP_CURRENT_MASK) +#define AI_MLB_PLL_CTRL0_HOLD_RING_OFF_MASK (0x80U) +#define AI_MLB_PLL_CTRL0_HOLD_RING_OFF_SHIFT (7U) +#define AI_MLB_PLL_CTRL0_HOLD_RING_OFF(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_HOLD_RING_OFF_SHIFT)) & AI_MLB_PLL_CTRL0_HOLD_RING_OFF_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_DIV_CFG_MASK (0x300U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_DIV_CFG_SHIFT (8U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_DIV_CFG(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_DIV_CFG_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_DIV_CFG_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_PHASE_SEL_MASK (0xC00U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_PHASE_SEL_SHIFT (10U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_PHASE_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_PHASE_SEL_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_PHASE_SEL_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_RXCLK_DEL_CFG_MASK (0x7000U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_RXCLK_DEL_CFG_SHIFT (12U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_RXCLK_DEL_CFG(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_RXCLK_DEL_CFG_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_RXCLK_DEL_CFG_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDD_DELAY_CFG_MASK (0x70000U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDD_DELAY_CFG_SHIFT (16U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDD_DELAY_CFG(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_VDDD_DELAY_CFG_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_VDDD_DELAY_CFG_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_FLT_RES_SEL_MASK (0x700000U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_FLT_RES_SEL_SHIFT (20U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_FLT_RES_SEL(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_FLT_RES_SEL_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_FLT_RES_SEL_MASK) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDA_DELAY_CFG_MASK (0x7000000U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDA_DELAY_CFG_SHIFT (24U) +#define AI_MLB_PLL_CTRL0_MLB_PLL_VDDA_DELAY_CFG(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_MLB_PLL_VDDA_DELAY_CFG_SHIFT)) & AI_MLB_PLL_CTRL0_MLB_PLL_VDDA_DELAY_CFG_MASK) +#define AI_MLB_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK (0x18000000U) +#define AI_MLB_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT (27U) +#define AI_MLB_PLL_CTRL0_REGULATOR_VOLT_TRIM(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_REGULATOR_VOLT_TRIM_SHIFT)) & AI_MLB_PLL_CTRL0_REGULATOR_VOLT_TRIM_MASK) +#define AI_MLB_PLL_CTRL0_TEST_MUX_ENABLE_MASK (0x20000000U) +#define AI_MLB_PLL_CTRL0_TEST_MUX_ENABLE_SHIFT (29U) +#define AI_MLB_PLL_CTRL0_TEST_MUX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_TEST_MUX_ENABLE_SHIFT)) & AI_MLB_PLL_CTRL0_TEST_MUX_ENABLE_MASK) +#define AI_MLB_PLL_CTRL0_TSTI_POWERUP_MASK (0x40000000U) +#define AI_MLB_PLL_CTRL0_TSTI_POWERUP_SHIFT (30U) +#define AI_MLB_PLL_CTRL0_TSTI_POWERUP(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_TSTI_POWERUP_SHIFT)) & AI_MLB_PLL_CTRL0_TSTI_POWERUP_MASK) +#define AI_MLB_PLL_CTRL0_TESTMODE_MASK (0x80000000U) +#define AI_MLB_PLL_CTRL0_TESTMODE_SHIFT (31U) +#define AI_MLB_PLL_CTRL0_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << AI_MLB_PLL_CTRL0_TESTMODE_SHIFT)) & AI_MLB_PLL_CTRL0_TESTMODE_MASK) + +#define AI_PHY_LDO_CTRL0_LINREG_EN_MASK (0x1U) +#define AI_PHY_LDO_CTRL0_LINREG_EN_SHIFT (0U) +#define AI_PHY_LDO_CTRL0_LINREG_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_EN_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_EN_MASK) +#define AI_PHY_LDO_CTRL0_LINREG_PWRUPLOAD_DIS_MASK (0x2U) +#define AI_PHY_LDO_CTRL0_LINREG_PWRUPLOAD_DIS_SHIFT (1U) +#define AI_PHY_LDO_CTRL0_LINREG_PWRUPLOAD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_PWRUPLOAD_DIS_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_PWRUPLOAD_DIS_MASK) +#define AI_PHY_LDO_CTRL0_LINREG_ILIMIT_EN_MASK (0x4U) +#define AI_PHY_LDO_CTRL0_LINREG_ILIMIT_EN_SHIFT (2U) +#define AI_PHY_LDO_CTRL0_LINREG_ILIMIT_EN(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_ILIMIT_EN_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_ILIMIT_EN_MASK) +#define AI_PHY_LDO_CTRL0_LINREG_OUTPUT_TRG_MASK (0x1F0U) +#define AI_PHY_LDO_CTRL0_LINREG_OUTPUT_TRG_SHIFT (4U) +#define AI_PHY_LDO_CTRL0_LINREG_OUTPUT_TRG(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_OUTPUT_TRG_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_OUTPUT_TRG_MASK) +#define AI_PHY_LDO_CTRL0_LINREG_ANATEST_MASK (0x7000U) +#define AI_PHY_LDO_CTRL0_LINREG_ANATEST_SHIFT (12U) +#define AI_PHY_LDO_CTRL0_LINREG_ANATEST(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_ANATEST_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_ANATEST_MASK) +#define AI_PHY_LDO_CTRL0_LINREG_PHY_ISO_B_MASK (0x8000U) +#define AI_PHY_LDO_CTRL0_LINREG_PHY_ISO_B_SHIFT (15U) +#define AI_PHY_LDO_CTRL0_LINREG_PHY_ISO_B(x) (((uint32_t)(((uint32_t)(x)) << AI_PHY_LDO_CTRL0_LINREG_PHY_ISO_B_SHIFT)) & AI_PHY_LDO_CTRL0_LINREG_PHY_ISO_B_MASK) +#define AI_PHY_LDO_STAT0_LINREG_STAT_MASK (0xFU) +#define AI_PHY_LDO_STAT0_LINREG_STAT_SHIFT (0U) +#define AI_PHY_LDO_STAT0_LINREG_STAT(x) ((uint32_t)((((uint32_t)(x)) & AI_PHY_LDO_STAT0_LINREG_STAT_MASK) >> AI_PHY_LDO_STAT0_LINREG_STAT_SHIFT)) + +#endif diff --git a/platform/devices/MX8/MX8_ecsr_reset.h b/platform/devices/MX8/MX8_ecsr_reset.h new file mode 100755 index 0000000..f299839 --- /dev/null +++ b/platform/devices/MX8/MX8_ecsr_reset.h @@ -0,0 +1,147 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_ecsr_reset.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for ESCR Peripheral Reset + * + * CMSIS Peripheral Access Layer for ECSR Reset + */ + +#ifndef ECSR_RESET_H +#define ECSR_RESET_H /**< Symbol preventing repeated inclusion */ + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- ECSR Reset Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ECSR_Reset_Peripheral_Access_Layer ECSR Reset Peripheral Access Layer + * @{ + */ + +/** ECSR Reset - Register Layout Typedef */ +typedef struct { + __IO uint32_t ECSR_PER_RESET_REQ[4]; /**< offset: 0x00 */ + __I uint32_t ECSR_PER_RESET_ACK[4]; /**< offset: 0x10 */ + __IO uint32_t ECSR_PER_CLK_STOP_REQ[4]; /**< offset: 0x20 */ + __I uint32_t ECSR_PER_CLK_STOP_ACK[4]; /**< offset: 0x30 */ + __IO uint32_t ECSR_PER_BUS_IDLE_REQ[4]; /**< offset: 0x40 */ + __I uint32_t ECSR_PER_BUS_IDLE_ACK[4]; /**< offset: 0x50 */ + __IO uint32_t ECSR_PER_BUS_BLACK_HOLE[4]; /**< offset: 0x60 */ +} ECSR_Reset_Type; + +/* ECSR Reset - Peripheral instance base addresses */ +/** Peripheral ECSR Reset base address */ +#define ECSR_RESET_BASE (0u) +/** Peripheral ECSR Reset base pointer */ +#define ECSR_RESET ((ECSR_Reset_Type *)ECSR_RESET_BASE) +/** Array initializer of ECSR Reset peripheral base addresses */ +#define ECSR_RESET_BASE_ADDRS { ECSR_RESET_BASE } +/** Array initializer of ECSR Reset peripheral base pointers */ +#define ECSR_RESET_BASE_PTRS { ECSR_RESET } + +/*! + * @} + */ /* end of group CSR_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* ECSR_RESET_H */ + diff --git a/platform/devices/MX8/MX8_flexspi.h b/platform/devices/MX8/MX8_flexspi.h new file mode 100755 index 0000000..e6cfe1a --- /dev/null +++ b/platform/devices/MX8/MX8_flexspi.h @@ -0,0 +1,690 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_FLEXSPI_REGISTERS_H +#define HW_FLEXSPI_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- FLEXSPI Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FLEXSPI_Peripheral_Access_Layer FLEXSPI Peripheral Access Layer + * @{ + */ + +/** FLEXSPI - Register Layout Typedef */ +typedef struct { + __IO uint32_t MCR0; /**< Module Control Register 0, offset: 0x0 */ + __IO uint32_t MCR1; /**< Module Control Register 1, offset: 0x4 */ + __IO uint32_t MCR2; /**< Module Control Register 2, offset: 0x8 */ + __IO uint32_t AHBCR; /**< AHB Bus Control Register, offset: 0xC */ + __IO uint32_t INTEN; /**< Interrupt Enable Register, offset: 0x10 */ + __IO uint32_t INTR; /**< Interrupt Register, offset: 0x14 */ + __IO uint32_t LUTKEY; /**< LUT Key Register, offset: 0x18 */ + __IO uint32_t LUTCR; /**< LUT Control Register, offset: 0x1C */ + __IO uint32_t AHBRXBUFCR0[8]; /**< AHB RX Buffer 0 Control Register 0..AHB RX Buffer 7 Control Register 0, array offset: 0x20, array step: 0x4 */ + __O uint32_t AHBRXBUFCR1[8]; /**< AHB RX Buffer 0 Control Register 1..AHB RX Buffer 7 Control Register 1, array offset: 0x40, array step: 0x4 */ + __IO uint32_t FLSHCR0[4]; /**< Flash A1 Control Register 0..Flash B2 Control Register 0, array offset: 0x60, array step: 0x4 */ + __IO uint32_t FLSHCR1[4]; /**< Flash A1 Control Register 1..Flash B2 Control Register 1, array offset: 0x70, array step: 0x4 */ + __IO uint32_t FLSHCR2[4]; /**< Flash A1 Control Register 2..Flash B2 Control Register 2, array offset: 0x80, array step: 0x4 */ + __IO uint32_t FLSHCR3; /**< Flash Control Register 3, offset: 0x90 */ + __IO uint32_t FLSHCR4; /**< Flash Control Register 4, offset: 0x94 */ + __O uint32_t FLSHCR5; /**< Flash Control Register 5, offset: 0x98 */ + __O uint32_t FLSHCR6; /**< Flash Control Register 6, offset: 0x9C */ + __IO uint32_t IPCR0; /**< IP Control Register 0, offset: 0xA0 */ + __IO uint32_t IPCR1; /**< IP Control Register 1, offset: 0xA4 */ + __O uint32_t IPCR2; /**< IP Control Register 2, offset: 0xA8 */ + __O uint32_t IPCR3; /**< IP Control Register 3, offset: 0xAC */ + __IO uint32_t IPCMD; /**< IP Command Register, offset: 0xB0 */ + __IO uint32_t DLPR; /**< Data Learn Pattern Register, offset: 0xB4 */ + __IO uint32_t IPRXFCR; /**< IP RX FIFO Control Register, offset: 0xB8 */ + __IO uint32_t IPTXFCR; /**< IP TX FIFO Control Register, offset: 0xBC */ + __IO uint32_t DLLCR[2]; /**< DLL Control Register 0, array offset: 0xC0, array step: 0x4 */ + __IO uint32_t MISCCR2; /**< Misc Control Register 2, offset: 0xC8 */ + __O uint32_t MISCCR3; /**< Misc Control Register 3, offset: 0xCC */ + __O uint32_t MISCCR4; /**< Misc Control Register 4, offset: 0xD0 */ + __O uint32_t MISCCR5; /**< Misc Control Register 5, offset: 0xD4 */ + __O uint32_t MISCCR6; /**< Misc Control Register 6, offset: 0xD8 */ + __O uint32_t MISCCR7; /**< Misc Control Register 7, offset: 0xDC */ + __I uint32_t STS0; /**< Status Register 0, offset: 0xE0 */ + __I uint32_t STS1; /**< Status Register 1, offset: 0xE4 */ + __I uint32_t STS2; /**< Status Register 2, offset: 0xE8 */ + __I uint32_t AHBSPNDSTS; /**< AHB Suspend Status Register, offset: 0xEC */ + __I uint32_t IPRXFSTS; /**< IP RX FIFO Status Register, offset: 0xF0 */ + __I uint32_t IPTXFSTS; /**< IP TX FIFO Status Register, offset: 0xF4 */ + uint8_t RESERVED_0[8]; + __I uint32_t RFDR[32]; /**< IP RX FIFO Data Register 0..IP RX FIFO Data Register 31, array offset: 0x100, array step: 0x4 */ + __O uint32_t TFDR[32]; /**< IP TX FIFO Data Register 0..IP TX FIFO Data Register 31, array offset: 0x180, array step: 0x4 */ + __IO uint32_t LUT[128]; /**< LUT 0..LUT 127, array offset: 0x200, array step: 0x4 */ +} FLEXSPI_Type; + +/* ---------------------------------------------------------------------------- + -- FLEXSPI Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FLEXSPI_Register_Masks FLEXSPI Register Masks + * @{ + */ + +/*! @name MCR0 - Module Control Register 0 */ +#define FLEXSPI_MCR0_SWRESET_MASK (0x1U) +#define FLEXSPI_MCR0_SWRESET_SHIFT (0U) +#define FLEXSPI_MCR0_SWRESET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SWRESET_SHIFT)) & FLEXSPI_MCR0_SWRESET_MASK) +#define FLEXSPI_MCR0_MDIS_MASK (0x2U) +#define FLEXSPI_MCR0_MDIS_SHIFT (1U) +#define FLEXSPI_MCR0_MDIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_MDIS_SHIFT)) & FLEXSPI_MCR0_MDIS_MASK) +#define FLEXSPI_MCR0_ENDCFG_MASK (0xCU) +#define FLEXSPI_MCR0_ENDCFG_SHIFT (2U) +#define FLEXSPI_MCR0_ENDCFG(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ENDCFG_SHIFT)) & FLEXSPI_MCR0_ENDCFG_MASK) +#define FLEXSPI_MCR0_RXCLKSRC_MASK (0x30U) +#define FLEXSPI_MCR0_RXCLKSRC_SHIFT (4U) +#define FLEXSPI_MCR0_RXCLKSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_RXCLKSRC_SHIFT)) & FLEXSPI_MCR0_RXCLKSRC_MASK) +#define FLEXSPI_MCR0_ARDFEN_MASK (0x40U) +#define FLEXSPI_MCR0_ARDFEN_SHIFT (6U) +#define FLEXSPI_MCR0_ARDFEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ARDFEN_SHIFT)) & FLEXSPI_MCR0_ARDFEN_MASK) +#define FLEXSPI_MCR0_ATDFEN_MASK (0x80U) +#define FLEXSPI_MCR0_ATDFEN_SHIFT (7U) +#define FLEXSPI_MCR0_ATDFEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ATDFEN_SHIFT)) & FLEXSPI_MCR0_ATDFEN_MASK) +#define FLEXSPI_MCR0_SERCLKDIV_MASK (0x700U) +#define FLEXSPI_MCR0_SERCLKDIV_SHIFT (8U) +#define FLEXSPI_MCR0_SERCLKDIV(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SERCLKDIV_SHIFT)) & FLEXSPI_MCR0_SERCLKDIV_MASK) +#define FLEXSPI_MCR0_HSEN_MASK (0x800U) +#define FLEXSPI_MCR0_HSEN_SHIFT (11U) +#define FLEXSPI_MCR0_HSEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_HSEN_SHIFT)) & FLEXSPI_MCR0_HSEN_MASK) +#define FLEXSPI_MCR0_DOZEEN_MASK (0x1000U) +#define FLEXSPI_MCR0_DOZEEN_SHIFT (12U) +#define FLEXSPI_MCR0_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_DOZEEN_SHIFT)) & FLEXSPI_MCR0_DOZEEN_MASK) +#define FLEXSPI_MCR0_COMBINATIONEN_MASK (0x2000U) +#define FLEXSPI_MCR0_COMBINATIONEN_SHIFT (13U) +#define FLEXSPI_MCR0_COMBINATIONEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_COMBINATIONEN_SHIFT)) & FLEXSPI_MCR0_COMBINATIONEN_MASK) +#define FLEXSPI_MCR0_SCKFREERUNEN_MASK (0x4000U) +#define FLEXSPI_MCR0_SCKFREERUNEN_SHIFT (14U) +#define FLEXSPI_MCR0_SCKFREERUNEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SCKFREERUNEN_SHIFT)) & FLEXSPI_MCR0_SCKFREERUNEN_MASK) +#define FLEXSPI_MCR0_LEARNEN_MASK (0x8000U) +#define FLEXSPI_MCR0_LEARNEN_SHIFT (15U) +#define FLEXSPI_MCR0_LEARNEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_LEARNEN_SHIFT)) & FLEXSPI_MCR0_LEARNEN_MASK) +#define FLEXSPI_MCR0_IPGRANTWAIT_MASK (0xFF0000U) +#define FLEXSPI_MCR0_IPGRANTWAIT_SHIFT (16U) +#define FLEXSPI_MCR0_IPGRANTWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_IPGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_IPGRANTWAIT_MASK) +#define FLEXSPI_MCR0_AHBGRANTWAIT_MASK (0xFF000000U) +#define FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT (24U) +#define FLEXSPI_MCR0_AHBGRANTWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_AHBGRANTWAIT_MASK) + +/*! @name MCR1 - Module Control Register 1 */ +#define FLEXSPI_MCR1_AHBBUSWAIT_MASK (0xFFFFU) +#define FLEXSPI_MCR1_AHBBUSWAIT_SHIFT (0U) +#define FLEXSPI_MCR1_AHBBUSWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_AHBBUSWAIT_SHIFT)) & FLEXSPI_MCR1_AHBBUSWAIT_MASK) +#define FLEXSPI_MCR1_SEQWAIT_MASK (0xFFFF0000U) +#define FLEXSPI_MCR1_SEQWAIT_SHIFT (16U) +#define FLEXSPI_MCR1_SEQWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_SEQWAIT_SHIFT)) & FLEXSPI_MCR1_SEQWAIT_MASK) + +/*! @name MCR2 - Module Control Register 2 */ +#define FLEXSPI_MCR2_ABORTONCMDEN_MASK (0x1U) +#define FLEXSPI_MCR2_ABORTONCMDEN_SHIFT (0U) +#define FLEXSPI_MCR2_ABORTONCMDEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONCMDEN_SHIFT)) & FLEXSPI_MCR2_ABORTONCMDEN_MASK) +#define FLEXSPI_MCR2_ABORTONRADDREN_MASK (0x2U) +#define FLEXSPI_MCR2_ABORTONRADDREN_SHIFT (1U) +#define FLEXSPI_MCR2_ABORTONRADDREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONRADDREN_SHIFT)) & FLEXSPI_MCR2_ABORTONRADDREN_MASK) +#define FLEXSPI_MCR2_ABORTONCADDREN_MASK (0x4U) +#define FLEXSPI_MCR2_ABORTONCADDREN_SHIFT (2U) +#define FLEXSPI_MCR2_ABORTONCADDREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONCADDREN_SHIFT)) & FLEXSPI_MCR2_ABORTONCADDREN_MASK) +#define FLEXSPI_MCR2_ABORTONMODEEN_MASK (0x8U) +#define FLEXSPI_MCR2_ABORTONMODEEN_SHIFT (3U) +#define FLEXSPI_MCR2_ABORTONMODEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONMODEEN_SHIFT)) & FLEXSPI_MCR2_ABORTONMODEEN_MASK) +#define FLEXSPI_MCR2_ABORTONDUMMYEN_MASK (0x10U) +#define FLEXSPI_MCR2_ABORTONDUMMYEN_SHIFT (4U) +#define FLEXSPI_MCR2_ABORTONDUMMYEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONDUMMYEN_SHIFT)) & FLEXSPI_MCR2_ABORTONDUMMYEN_MASK) +#define FLEXSPI_MCR2_ABORTONWRITEEN_MASK (0x20U) +#define FLEXSPI_MCR2_ABORTONWRITEEN_SHIFT (5U) +#define FLEXSPI_MCR2_ABORTONWRITEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONWRITEEN_SHIFT)) & FLEXSPI_MCR2_ABORTONWRITEEN_MASK) +#define FLEXSPI_MCR2_ABORTONREADEN_MASK (0x40U) +#define FLEXSPI_MCR2_ABORTONREADEN_SHIFT (6U) +#define FLEXSPI_MCR2_ABORTONREADEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONREADEN_SHIFT)) & FLEXSPI_MCR2_ABORTONREADEN_MASK) +#define FLEXSPI_MCR2_ABORTONLEARNEN_MASK (0x80U) +#define FLEXSPI_MCR2_ABORTONLEARNEN_SHIFT (7U) +#define FLEXSPI_MCR2_ABORTONLEARNEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONLEARNEN_SHIFT)) & FLEXSPI_MCR2_ABORTONLEARNEN_MASK) +#define FLEXSPI_MCR2_ABORTONDATSZEN_MASK (0x100U) +#define FLEXSPI_MCR2_ABORTONDATSZEN_SHIFT (8U) +#define FLEXSPI_MCR2_ABORTONDATSZEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_ABORTONDATSZEN_SHIFT)) & FLEXSPI_MCR2_ABORTONDATSZEN_MASK) +#define FLEXSPI_MCR2_CLRAHBBUFOPT_MASK (0x800U) +#define FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT (11U) +#define FLEXSPI_MCR2_CLRAHBBUFOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT)) & FLEXSPI_MCR2_CLRAHBBUFOPT_MASK) +#define FLEXSPI_MCR2_SCK2OPT_MASK (0x1000U) +#define FLEXSPI_MCR2_SCK2OPT_SHIFT (12U) +#define FLEXSPI_MCR2_SCK2OPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SCK2OPT_SHIFT)) & FLEXSPI_MCR2_SCK2OPT_MASK) +#define FLEXSPI_MCR2_TSTMD_MASK (0x2000U) +#define FLEXSPI_MCR2_TSTMD_SHIFT (13U) +#define FLEXSPI_MCR2_TSTMD(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_TSTMD_SHIFT)) & FLEXSPI_MCR2_TSTMD_MASK) +#define FLEXSPI_MCR2_CLRLEARNPHASE_MASK (0x4000U) +#define FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT (14U) +#define FLEXSPI_MCR2_CLRLEARNPHASE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT)) & FLEXSPI_MCR2_CLRLEARNPHASE_MASK) +#define FLEXSPI_MCR2_SAMEDEVICEEN_MASK (0x8000U) +#define FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT (15U) +#define FLEXSPI_MCR2_SAMEDEVICEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT)) & FLEXSPI_MCR2_SAMEDEVICEEN_MASK) +#define FLEXSPI_MCR2_FLASHDQSOPT_MASK (0x10000U) +#define FLEXSPI_MCR2_FLASHDQSOPT_SHIFT (16U) +#define FLEXSPI_MCR2_FLASHDQSOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_FLASHDQSOPT_SHIFT)) & FLEXSPI_MCR2_FLASHDQSOPT_MASK) +#define FLEXSPI_MCR2_RXDELAYOPT_MASK (0x60000U) +#define FLEXSPI_MCR2_RXDELAYOPT_SHIFT (17U) +#define FLEXSPI_MCR2_RXDELAYOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RXDELAYOPT_SHIFT)) & FLEXSPI_MCR2_RXDELAYOPT_MASK) +#define FLEXSPI_MCR2_SCKBDIFFOPT_MASK (0x80000U) +#define FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT (19U) +#define FLEXSPI_MCR2_SCKBDIFFOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT)) & FLEXSPI_MCR2_SCKBDIFFOPT_MASK) +#define FLEXSPI_MCR2_CLKPHASERST_MASK (0x100000U) +#define FLEXSPI_MCR2_CLKPHASERST_SHIFT (20U) +#define FLEXSPI_MCR2_CLKPHASERST(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLKPHASERST_SHIFT)) & FLEXSPI_MCR2_CLKPHASERST_MASK) +#define FLEXSPI_MCR2_RESUMEWAIT_MASK (0xFF000000U) +#define FLEXSPI_MCR2_RESUMEWAIT_SHIFT (24U) +#define FLEXSPI_MCR2_RESUMEWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RESUMEWAIT_SHIFT)) & FLEXSPI_MCR2_RESUMEWAIT_MASK) + +/*! @name AHBCR - AHB Bus Control Register */ +#define FLEXSPI_AHBCR_APAREN_MASK (0x1U) +#define FLEXSPI_AHBCR_APAREN_SHIFT (0U) +#define FLEXSPI_AHBCR_APAREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_APAREN_SHIFT)) & FLEXSPI_AHBCR_APAREN_MASK) +#define FLEXSPI_AHBCR_CLRAHBRXBUF_MASK (0x2U) +#define FLEXSPI_AHBCR_CLRAHBRXBUF_SHIFT (1U) +#define FLEXSPI_AHBCR_CLRAHBRXBUF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CLRAHBRXBUF_SHIFT)) & FLEXSPI_AHBCR_CLRAHBRXBUF_MASK) +#define FLEXSPI_AHBCR_CLRAHBTXBUF_MASK (0x4U) +#define FLEXSPI_AHBCR_CLRAHBTXBUF_SHIFT (2U) +#define FLEXSPI_AHBCR_CLRAHBTXBUF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CLRAHBTXBUF_SHIFT)) & FLEXSPI_AHBCR_CLRAHBTXBUF_MASK) +#define FLEXSPI_AHBCR_CACHABLEEN_MASK (0x8U) +#define FLEXSPI_AHBCR_CACHABLEEN_SHIFT (3U) +#define FLEXSPI_AHBCR_CACHABLEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CACHABLEEN_SHIFT)) & FLEXSPI_AHBCR_CACHABLEEN_MASK) +#define FLEXSPI_AHBCR_BUFFERABLEEN_MASK (0x10U) +#define FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT (4U) +#define FLEXSPI_AHBCR_BUFFERABLEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT)) & FLEXSPI_AHBCR_BUFFERABLEEN_MASK) +#define FLEXSPI_AHBCR_PREFETCHEN_MASK (0x20U) +#define FLEXSPI_AHBCR_PREFETCHEN_SHIFT (5U) +#define FLEXSPI_AHBCR_PREFETCHEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_PREFETCHEN_SHIFT)) & FLEXSPI_AHBCR_PREFETCHEN_MASK) +#define FLEXSPI_AHBCR_READADDROPT_MASK (0x40U) +#define FLEXSPI_AHBCR_READADDROPT_SHIFT (6U) +#define FLEXSPI_AHBCR_READADDROPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_READADDROPT_SHIFT)) & FLEXSPI_AHBCR_READADDROPT_MASK) +#define FLEXSPI_AHBCR_AFLASHBASE_MASK (0xF0000000U) /* Merged from fields with different position or width, of widths (2, 4), largest definition used */ +#define FLEXSPI_AHBCR_AFLASHBASE_SHIFT (28U) +#define FLEXSPI_AHBCR_AFLASHBASE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_AFLASHBASE_SHIFT)) & FLEXSPI_AHBCR_AFLASHBASE_MASK) /* Merged from fields with different position or width, of widths (2, 4), largest definition used */ + +/*! @name INTEN - Interrupt Enable Register */ +#define FLEXSPI_INTEN_IPCMDDONEEN_MASK (0x1U) +#define FLEXSPI_INTEN_IPCMDDONEEN_SHIFT (0U) +#define FLEXSPI_INTEN_IPCMDDONEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDDONEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDDONEEN_MASK) +#define FLEXSPI_INTEN_IPCMDGEEN_MASK (0x2U) +#define FLEXSPI_INTEN_IPCMDGEEN_SHIFT (1U) +#define FLEXSPI_INTEN_IPCMDGEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDGEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDGEEN_MASK) +#define FLEXSPI_INTEN_AHBCMDGEEN_MASK (0x4U) +#define FLEXSPI_INTEN_AHBCMDGEEN_SHIFT (2U) +#define FLEXSPI_INTEN_AHBCMDGEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDGEEN_SHIFT)) & FLEXSPI_INTEN_AHBCMDGEEN_MASK) +#define FLEXSPI_INTEN_IPCMDERREN_MASK (0x8U) +#define FLEXSPI_INTEN_IPCMDERREN_SHIFT (3U) +#define FLEXSPI_INTEN_IPCMDERREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDERREN_SHIFT)) & FLEXSPI_INTEN_IPCMDERREN_MASK) +#define FLEXSPI_INTEN_AHBCMDERREN_MASK (0x10U) +#define FLEXSPI_INTEN_AHBCMDERREN_SHIFT (4U) +#define FLEXSPI_INTEN_AHBCMDERREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDERREN_SHIFT)) & FLEXSPI_INTEN_AHBCMDERREN_MASK) +#define FLEXSPI_INTEN_IPRXWAEN_MASK (0x20U) +#define FLEXSPI_INTEN_IPRXWAEN_SHIFT (5U) +#define FLEXSPI_INTEN_IPRXWAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPRXWAEN_SHIFT)) & FLEXSPI_INTEN_IPRXWAEN_MASK) +#define FLEXSPI_INTEN_IPTXWEEN_MASK (0x40U) +#define FLEXSPI_INTEN_IPTXWEEN_SHIFT (6U) +#define FLEXSPI_INTEN_IPTXWEEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPTXWEEN_SHIFT)) & FLEXSPI_INTEN_IPTXWEEN_MASK) +#define FLEXSPI_INTEN_DATALEARNFAILEN_MASK (0x80U) +#define FLEXSPI_INTEN_DATALEARNFAILEN_SHIFT (7U) +#define FLEXSPI_INTEN_DATALEARNFAILEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_DATALEARNFAILEN_SHIFT)) & FLEXSPI_INTEN_DATALEARNFAILEN_MASK) +#define FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK (0x100U) +#define FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT (8U) +#define FLEXSPI_INTEN_SCKSTOPBYRDEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK) +#define FLEXSPI_INTEN_SCKSTOPBYWREN_MASK (0x200U) +#define FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT (9U) +#define FLEXSPI_INTEN_SCKSTOPBYWREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYWREN_MASK) +#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK (0x400U) +#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT (10U) +#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK) +#define FLEXSPI_INTEN_SEQTIMEOUTEN_MASK (0x800U) +#define FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT (11U) +#define FLEXSPI_INTEN_SEQTIMEOUTEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_SEQTIMEOUTEN_MASK) + +/*! @name INTR - Interrupt Register */ +#define FLEXSPI_INTR_IPCMDDONE_MASK (0x1U) +#define FLEXSPI_INTR_IPCMDDONE_SHIFT (0U) +#define FLEXSPI_INTR_IPCMDDONE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDDONE_SHIFT)) & FLEXSPI_INTR_IPCMDDONE_MASK) +#define FLEXSPI_INTR_IPCMDGE_MASK (0x2U) +#define FLEXSPI_INTR_IPCMDGE_SHIFT (1U) +#define FLEXSPI_INTR_IPCMDGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDGE_SHIFT)) & FLEXSPI_INTR_IPCMDGE_MASK) +#define FLEXSPI_INTR_AHBCMDGE_MASK (0x4U) +#define FLEXSPI_INTR_AHBCMDGE_SHIFT (2U) +#define FLEXSPI_INTR_AHBCMDGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDGE_SHIFT)) & FLEXSPI_INTR_AHBCMDGE_MASK) +#define FLEXSPI_INTR_IPCMDERR_MASK (0x8U) +#define FLEXSPI_INTR_IPCMDERR_SHIFT (3U) +#define FLEXSPI_INTR_IPCMDERR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDERR_SHIFT)) & FLEXSPI_INTR_IPCMDERR_MASK) +#define FLEXSPI_INTR_AHBCMDERR_MASK (0x10U) +#define FLEXSPI_INTR_AHBCMDERR_SHIFT (4U) +#define FLEXSPI_INTR_AHBCMDERR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDERR_SHIFT)) & FLEXSPI_INTR_AHBCMDERR_MASK) +#define FLEXSPI_INTR_IPRXWA_MASK (0x20U) +#define FLEXSPI_INTR_IPRXWA_SHIFT (5U) +#define FLEXSPI_INTR_IPRXWA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPRXWA_SHIFT)) & FLEXSPI_INTR_IPRXWA_MASK) +#define FLEXSPI_INTR_IPTXWE_MASK (0x40U) +#define FLEXSPI_INTR_IPTXWE_SHIFT (6U) +#define FLEXSPI_INTR_IPTXWE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPTXWE_SHIFT)) & FLEXSPI_INTR_IPTXWE_MASK) +#define FLEXSPI_INTR_DATALEARNFAIL_MASK (0x80U) +#define FLEXSPI_INTR_DATALEARNFAIL_SHIFT (7U) +#define FLEXSPI_INTR_DATALEARNFAIL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_DATALEARNFAIL_SHIFT)) & FLEXSPI_INTR_DATALEARNFAIL_MASK) +#define FLEXSPI_INTR_SCKSTOPBYRD_MASK (0x100U) +#define FLEXSPI_INTR_SCKSTOPBYRD_SHIFT (8U) +#define FLEXSPI_INTR_SCKSTOPBYRD(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYRD_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYRD_MASK) +#define FLEXSPI_INTR_SCKSTOPBYWR_MASK (0x200U) +#define FLEXSPI_INTR_SCKSTOPBYWR_SHIFT (9U) +#define FLEXSPI_INTR_SCKSTOPBYWR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYWR_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYWR_MASK) +#define FLEXSPI_INTR_AHBBUSTIMEOUT_MASK (0x400U) +#define FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT (10U) +#define FLEXSPI_INTR_AHBBUSTIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT)) & FLEXSPI_INTR_AHBBUSTIMEOUT_MASK) +#define FLEXSPI_INTR_SEQTIMEOUT_MASK (0x800U) +#define FLEXSPI_INTR_SEQTIMEOUT_SHIFT (11U) +#define FLEXSPI_INTR_SEQTIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SEQTIMEOUT_SHIFT)) & FLEXSPI_INTR_SEQTIMEOUT_MASK) + +/*! @name LUTKEY - LUT Key Register */ +#define FLEXSPI_LUTKEY_KEY_MASK (0xFFFFFFFFU) +#define FLEXSPI_LUTKEY_KEY_SHIFT (0U) +#define FLEXSPI_LUTKEY_KEY(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTKEY_KEY_SHIFT)) & FLEXSPI_LUTKEY_KEY_MASK) + +/*! @name LUTCR - LUT Control Register */ +#define FLEXSPI_LUTCR_LOCK_MASK (0x1U) +#define FLEXSPI_LUTCR_LOCK_SHIFT (0U) +#define FLEXSPI_LUTCR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_LOCK_SHIFT)) & FLEXSPI_LUTCR_LOCK_MASK) +#define FLEXSPI_LUTCR_UNLOCK_MASK (0x2U) +#define FLEXSPI_LUTCR_UNLOCK_SHIFT (1U) +#define FLEXSPI_LUTCR_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_UNLOCK_SHIFT)) & FLEXSPI_LUTCR_UNLOCK_MASK) + +/*! @name AHBRXBUFCR0 - AHB RX Buffer 0 Control Register 0..AHB RX Buffer 7 Control Register 0 */ +#define FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK (0x1FFU) +#define FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT (0U) +#define FLEXSPI_AHBRXBUFCR0_BUFSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT)) & FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK) +#define FLEXSPI_AHBRXBUFCR0_MSTRID_MASK (0xF0000U) +#define FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT (16U) +#define FLEXSPI_AHBRXBUFCR0_MSTRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT)) & FLEXSPI_AHBRXBUFCR0_MSTRID_MASK) +#define FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK (0x7000000U) +#define FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT (24U) +#define FLEXSPI_AHBRXBUFCR0_PRIORITY(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK) +#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK (0x80000000U) +#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT (31U) +#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK) + +/* The count of FLEXSPI_AHBRXBUFCR0 */ +#define FLEXSPI_AHBRXBUFCR0_COUNT (8U) + +/* The count of FLEXSPI_AHBRXBUFCR1 */ +#define FLEXSPI_AHBRXBUFCR1_COUNT (8U) + +/*! @name FLSHCR0 - Flash A1 Control Register 0..Flash B2 Control Register 0 */ +#define FLEXSPI_FLSHCR0_FLSHSZ_MASK (0x7FFFFFU) +#define FLEXSPI_FLSHCR0_FLSHSZ_SHIFT (0U) +#define FLEXSPI_FLSHCR0_FLSHSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_FLSHSZ_SHIFT)) & FLEXSPI_FLSHCR0_FLSHSZ_MASK) + +/* The count of FLEXSPI_FLSHCR0 */ +#define FLEXSPI_FLSHCR0_COUNT (4U) + +/*! @name FLSHCR1 - Flash A1 Control Register 1..Flash B2 Control Register 1 */ +#define FLEXSPI_FLSHCR1_TCSS_MASK (0x1FU) +#define FLEXSPI_FLSHCR1_TCSS_SHIFT (0U) +#define FLEXSPI_FLSHCR1_TCSS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSS_SHIFT)) & FLEXSPI_FLSHCR1_TCSS_MASK) +#define FLEXSPI_FLSHCR1_TCSH_MASK (0x3E0U) +#define FLEXSPI_FLSHCR1_TCSH_SHIFT (5U) +#define FLEXSPI_FLSHCR1_TCSH(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSH_SHIFT)) & FLEXSPI_FLSHCR1_TCSH_MASK) +#define FLEXSPI_FLSHCR1_WA_MASK (0x400U) +#define FLEXSPI_FLSHCR1_WA_SHIFT (10U) +#define FLEXSPI_FLSHCR1_WA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_WA_SHIFT)) & FLEXSPI_FLSHCR1_WA_MASK) +#define FLEXSPI_FLSHCR1_CAS_MASK (0x7800U) +#define FLEXSPI_FLSHCR1_CAS_SHIFT (11U) +#define FLEXSPI_FLSHCR1_CAS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CAS_SHIFT)) & FLEXSPI_FLSHCR1_CAS_MASK) +#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK (0x8000U) +#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT (15U) +#define FLEXSPI_FLSHCR1_CSINTERVALUNIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK) +#define FLEXSPI_FLSHCR1_CSINTERVAL_MASK (0xFFFF0000U) +#define FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT (16U) +#define FLEXSPI_FLSHCR1_CSINTERVAL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVAL_MASK) + +/* The count of FLEXSPI_FLSHCR1 */ +#define FLEXSPI_FLSHCR1_COUNT (4U) + +/*! @name FLSHCR2 - Flash A1 Control Register 2..Flash B2 Control Register 2 */ +#define FLEXSPI_FLSHCR2_ARDSEQID_MASK (0x1FU) +#define FLEXSPI_FLSHCR2_ARDSEQID_SHIFT (0U) +#define FLEXSPI_FLSHCR2_ARDSEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQID_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQID_MASK) +#define FLEXSPI_FLSHCR2_ARDSEQNUM_MASK (0xE0U) +#define FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT (5U) +#define FLEXSPI_FLSHCR2_ARDSEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQNUM_MASK) +#define FLEXSPI_FLSHCR2_AWRSEQID_MASK (0x1F00U) +#define FLEXSPI_FLSHCR2_AWRSEQID_SHIFT (8U) +#define FLEXSPI_FLSHCR2_AWRSEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQID_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQID_MASK) +#define FLEXSPI_FLSHCR2_AWRSEQNUM_MASK (0xE000U) +#define FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT (13U) +#define FLEXSPI_FLSHCR2_AWRSEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQNUM_MASK) +#define FLEXSPI_FLSHCR2_AWRWAIT_MASK (0xFFF0000U) +#define FLEXSPI_FLSHCR2_AWRWAIT_SHIFT (16U) +#define FLEXSPI_FLSHCR2_AWRWAIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAIT_MASK) +#define FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK (0x70000000U) +#define FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT (28U) +#define FLEXSPI_FLSHCR2_AWRWAITUNIT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK) +#define FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK (0x80000000U) +#define FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT (31U) +#define FLEXSPI_FLSHCR2_CLRINSTRPTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT)) & FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK) + +/* The count of FLEXSPI_FLSHCR2 */ +#define FLEXSPI_FLSHCR2_COUNT (4U) + +/*! @name FLSHCR3 - Flash Control Register 3 */ +#define FLEXSPI_FLSHCR3_SIODOIDLE_MASK (0xFFU) +#define FLEXSPI_FLSHCR3_SIODOIDLE_SHIFT (0U) +#define FLEXSPI_FLSHCR3_SIODOIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR3_SIODOIDLE_SHIFT)) & FLEXSPI_FLSHCR3_SIODOIDLE_MASK) +#define FLEXSPI_FLSHCR3_SIODONONIDLE_MASK (0xFF00U) +#define FLEXSPI_FLSHCR3_SIODONONIDLE_SHIFT (8U) +#define FLEXSPI_FLSHCR3_SIODONONIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR3_SIODONONIDLE_SHIFT)) & FLEXSPI_FLSHCR3_SIODONONIDLE_MASK) +#define FLEXSPI_FLSHCR3_SIOOEIDLE_MASK (0xFF0000U) +#define FLEXSPI_FLSHCR3_SIOOEIDLE_SHIFT (16U) +#define FLEXSPI_FLSHCR3_SIOOEIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR3_SIOOEIDLE_SHIFT)) & FLEXSPI_FLSHCR3_SIOOEIDLE_MASK) +#define FLEXSPI_FLSHCR3_SIOOENONIDLE_MASK (0xFF000000U) +#define FLEXSPI_FLSHCR3_SIOOENONIDLE_SHIFT (24U) +#define FLEXSPI_FLSHCR3_SIOOENONIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR3_SIOOENONIDLE_SHIFT)) & FLEXSPI_FLSHCR3_SIOOENONIDLE_MASK) + +/*! @name FLSHCR4 - Flash Control Register 4 */ +#define FLEXSPI_FLSHCR4_WMOPT1_MASK (0x1U) +#define FLEXSPI_FLSHCR4_WMOPT1_SHIFT (0U) +#define FLEXSPI_FLSHCR4_WMOPT1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMOPT1_SHIFT)) & FLEXSPI_FLSHCR4_WMOPT1_MASK) +#define FLEXSPI_FLSHCR4_WMENA_MASK (0x4U) +#define FLEXSPI_FLSHCR4_WMENA_SHIFT (2U) +#define FLEXSPI_FLSHCR4_WMENA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENA_SHIFT)) & FLEXSPI_FLSHCR4_WMENA_MASK) +#define FLEXSPI_FLSHCR4_WMENB_MASK (0x8U) +#define FLEXSPI_FLSHCR4_WMENB_SHIFT (3U) +#define FLEXSPI_FLSHCR4_WMENB(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENB_SHIFT)) & FLEXSPI_FLSHCR4_WMENB_MASK) + +/*! @name IPCR0 - IP Control Register 0 */ +#define FLEXSPI_IPCR0_SFAR_MASK (0xFFFFFFFFU) +#define FLEXSPI_IPCR0_SFAR_SHIFT (0U) +#define FLEXSPI_IPCR0_SFAR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR0_SFAR_SHIFT)) & FLEXSPI_IPCR0_SFAR_MASK) + +/*! @name IPCR1 - IP Control Register 1 */ +#define FLEXSPI_IPCR1_IDATSZ_MASK (0xFFFFU) +#define FLEXSPI_IPCR1_IDATSZ_SHIFT (0U) +#define FLEXSPI_IPCR1_IDATSZ(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_IDATSZ_SHIFT)) & FLEXSPI_IPCR1_IDATSZ_MASK) +#define FLEXSPI_IPCR1_ISEQID_MASK (0x1F0000U) +#define FLEXSPI_IPCR1_ISEQID_SHIFT (16U) +#define FLEXSPI_IPCR1_ISEQID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQID_SHIFT)) & FLEXSPI_IPCR1_ISEQID_MASK) +#define FLEXSPI_IPCR1_ISEQNUM_MASK (0x7000000U) +#define FLEXSPI_IPCR1_ISEQNUM_SHIFT (24U) +#define FLEXSPI_IPCR1_ISEQNUM(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQNUM_SHIFT)) & FLEXSPI_IPCR1_ISEQNUM_MASK) +#define FLEXSPI_IPCR1_IPAREN_MASK (0x80000000U) +#define FLEXSPI_IPCR1_IPAREN_SHIFT (31U) +#define FLEXSPI_IPCR1_IPAREN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_IPAREN_SHIFT)) & FLEXSPI_IPCR1_IPAREN_MASK) + +/*! @name IPCMD - IP Command Register */ +#define FLEXSPI_IPCMD_TRG_MASK (0x1U) +#define FLEXSPI_IPCMD_TRG_SHIFT (0U) +#define FLEXSPI_IPCMD_TRG(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCMD_TRG_SHIFT)) & FLEXSPI_IPCMD_TRG_MASK) + +/*! @name DLPR - Data Learn Pattern Register */ +#define FLEXSPI_DLPR_DLP_MASK (0xFFFFFFFFU) +#define FLEXSPI_DLPR_DLP_SHIFT (0U) +#define FLEXSPI_DLPR_DLP(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLPR_DLP_SHIFT)) & FLEXSPI_DLPR_DLP_MASK) + +/*! @name IPRXFCR - IP RX FIFO Control Register */ +#define FLEXSPI_IPRXFCR_CLRIPRXF_MASK (0x1U) +#define FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT (0U) +#define FLEXSPI_IPRXFCR_CLRIPRXF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT)) & FLEXSPI_IPRXFCR_CLRIPRXF_MASK) +#define FLEXSPI_IPRXFCR_RXDMAEN_MASK (0x2U) +#define FLEXSPI_IPRXFCR_RXDMAEN_SHIFT (1U) +#define FLEXSPI_IPRXFCR_RXDMAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXDMAEN_SHIFT)) & FLEXSPI_IPRXFCR_RXDMAEN_MASK) +#define FLEXSPI_IPRXFCR_RXWMRK_MASK (0xFCU) +#define FLEXSPI_IPRXFCR_RXWMRK_SHIFT (2U) +#define FLEXSPI_IPRXFCR_RXWMRK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXWMRK_SHIFT)) & FLEXSPI_IPRXFCR_RXWMRK_MASK) + +/*! @name IPTXFCR - IP TX FIFO Control Register */ +#define FLEXSPI_IPTXFCR_CLRIPTXF_MASK (0x1U) +#define FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT (0U) +#define FLEXSPI_IPTXFCR_CLRIPTXF(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT)) & FLEXSPI_IPTXFCR_CLRIPTXF_MASK) +#define FLEXSPI_IPTXFCR_TXDMAEN_MASK (0x2U) +#define FLEXSPI_IPTXFCR_TXDMAEN_SHIFT (1U) +#define FLEXSPI_IPTXFCR_TXDMAEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXDMAEN_SHIFT)) & FLEXSPI_IPTXFCR_TXDMAEN_MASK) +#define FLEXSPI_IPTXFCR_TXWMRK_MASK (0x1FCU) +#define FLEXSPI_IPTXFCR_TXWMRK_SHIFT (2U) +#define FLEXSPI_IPTXFCR_TXWMRK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXWMRK_SHIFT)) & FLEXSPI_IPTXFCR_TXWMRK_MASK) + +/*! @name DLLCR - DLL Control Register 0 */ +#define FLEXSPI_DLLCR_DLLEN_MASK (0x1U) +#define FLEXSPI_DLLCR_DLLEN_SHIFT (0U) +#define FLEXSPI_DLLCR_DLLEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLEN_SHIFT)) & FLEXSPI_DLLCR_DLLEN_MASK) +#define FLEXSPI_DLLCR_DLLRESET_MASK (0x2U) +#define FLEXSPI_DLLCR_DLLRESET_SHIFT (1U) +#define FLEXSPI_DLLCR_DLLRESET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLRESET_SHIFT)) & FLEXSPI_DLLCR_DLLRESET_MASK) +#define FLEXSPI_DLLCR_FORCEUPDATE_MASK (0x4U) +#define FLEXSPI_DLLCR_FORCEUPDATE_SHIFT (2U) +#define FLEXSPI_DLLCR_FORCEUPDATE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_FORCEUPDATE_SHIFT)) & FLEXSPI_DLLCR_FORCEUPDATE_MASK) +#define FLEXSPI_DLLCR_SLVDLYTARGET_MASK (0x78U) +#define FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT (3U) +#define FLEXSPI_DLLCR_SLVDLYTARGET(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT)) & FLEXSPI_DLLCR_SLVDLYTARGET_MASK) +#define FLEXSPI_DLLCR_GATEUPDATE_MASK (0x80U) +#define FLEXSPI_DLLCR_GATEUPDATE_SHIFT (7U) +#define FLEXSPI_DLLCR_GATEUPDATE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_GATEUPDATE_SHIFT)) & FLEXSPI_DLLCR_GATEUPDATE_MASK) +#define FLEXSPI_DLLCR_OVRDEN_MASK (0x100U) +#define FLEXSPI_DLLCR_OVRDEN_SHIFT (8U) +#define FLEXSPI_DLLCR_OVRDEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDEN_SHIFT)) & FLEXSPI_DLLCR_OVRDEN_MASK) +#define FLEXSPI_DLLCR_OVRDVAL_MASK (0x7E00U) +#define FLEXSPI_DLLCR_OVRDVAL_SHIFT (9U) +#define FLEXSPI_DLLCR_OVRDVAL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDVAL_SHIFT)) & FLEXSPI_DLLCR_OVRDVAL_MASK) +#define FLEXSPI_DLLCR_REFPHASEGAP_MASK (0x18000U) +#define FLEXSPI_DLLCR_REFPHASEGAP_SHIFT (15U) +#define FLEXSPI_DLLCR_REFPHASEGAP(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_REFPHASEGAP_SHIFT)) & FLEXSPI_DLLCR_REFPHASEGAP_MASK) +#define FLEXSPI_DLLCR_REFPHASESTART_MASK (0xE0000U) +#define FLEXSPI_DLLCR_REFPHASESTART_SHIFT (17U) +#define FLEXSPI_DLLCR_REFPHASESTART(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_REFPHASESTART_SHIFT)) & FLEXSPI_DLLCR_REFPHASESTART_MASK) +#define FLEXSPI_DLLCR_SLVUPDATEINT_MASK (0xFF00000U) +#define FLEXSPI_DLLCR_SLVUPDATEINT_SHIFT (20U) +#define FLEXSPI_DLLCR_SLVUPDATEINT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_SLVUPDATEINT_SHIFT)) & FLEXSPI_DLLCR_SLVUPDATEINT_MASK) +#define FLEXSPI_DLLCR_REFUPDATEINT_MASK (0xF0000000U) +#define FLEXSPI_DLLCR_REFUPDATEINT_SHIFT (28U) +#define FLEXSPI_DLLCR_REFUPDATEINT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_REFUPDATEINT_SHIFT)) & FLEXSPI_DLLCR_REFUPDATEINT_MASK) + +/* The count of FLEXSPI_DLLCR */ +#define FLEXSPI_DLLCR_COUNT (2U) + +/*! @name MISCCR2 - Misc Control Register 2 */ +#define FLEXSPI_MISCCR2_LEARNPHASEGAP_MASK (0x3U) +#define FLEXSPI_MISCCR2_LEARNPHASEGAP_SHIFT (0U) +#define FLEXSPI_MISCCR2_LEARNPHASEGAP(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MISCCR2_LEARNPHASEGAP_SHIFT)) & FLEXSPI_MISCCR2_LEARNPHASEGAP_MASK) +#define FLEXSPI_MISCCR2_PHASERSTOPT_MASK (0xCU) +#define FLEXSPI_MISCCR2_PHASERSTOPT_SHIFT (2U) +#define FLEXSPI_MISCCR2_PHASERSTOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MISCCR2_PHASERSTOPT_SHIFT)) & FLEXSPI_MISCCR2_PHASERSTOPT_MASK) +#define FLEXSPI_MISCCR2_DOEOPT_MASK (0x10U) +#define FLEXSPI_MISCCR2_DOEOPT_SHIFT (4U) +#define FLEXSPI_MISCCR2_DOEOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MISCCR2_DOEOPT_SHIFT)) & FLEXSPI_MISCCR2_DOEOPT_MASK) +#define FLEXSPI_MISCCR2_RWDSOEOPT_MASK (0x20U) +#define FLEXSPI_MISCCR2_RWDSOEOPT_SHIFT (5U) +#define FLEXSPI_MISCCR2_RWDSOEOPT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MISCCR2_RWDSOEOPT_SHIFT)) & FLEXSPI_MISCCR2_RWDSOEOPT_MASK) + +/*! @name STS0 - Status Register 0 */ +#define FLEXSPI_STS0_SEQIDLE_MASK (0x1U) +#define FLEXSPI_STS0_SEQIDLE_SHIFT (0U) +#define FLEXSPI_STS0_SEQIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_SEQIDLE_SHIFT)) & FLEXSPI_STS0_SEQIDLE_MASK) +#define FLEXSPI_STS0_ARBIDLE_MASK (0x2U) +#define FLEXSPI_STS0_ARBIDLE_SHIFT (1U) +#define FLEXSPI_STS0_ARBIDLE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBIDLE_SHIFT)) & FLEXSPI_STS0_ARBIDLE_MASK) +#define FLEXSPI_STS0_ARBCMDSRC_MASK (0xCU) +#define FLEXSPI_STS0_ARBCMDSRC_SHIFT (2U) +#define FLEXSPI_STS0_ARBCMDSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBCMDSRC_SHIFT)) & FLEXSPI_STS0_ARBCMDSRC_MASK) +#define FLEXSPI_STS0_DATALEARNPHASEA_MASK (0xF0U) +#define FLEXSPI_STS0_DATALEARNPHASEA_SHIFT (4U) +#define FLEXSPI_STS0_DATALEARNPHASEA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_DATALEARNPHASEA_SHIFT)) & FLEXSPI_STS0_DATALEARNPHASEA_MASK) +#define FLEXSPI_STS0_DATALEARNPHASEB_MASK (0xF00U) +#define FLEXSPI_STS0_DATALEARNPHASEB_SHIFT (8U) +#define FLEXSPI_STS0_DATALEARNPHASEB(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_DATALEARNPHASEB_SHIFT)) & FLEXSPI_STS0_DATALEARNPHASEB_MASK) + +/*! @name STS1 - Status Register 1 */ +#define FLEXSPI_STS1_AHBCMDERRID_MASK (0x1FU) +#define FLEXSPI_STS1_AHBCMDERRID_SHIFT (0U) +#define FLEXSPI_STS1_AHBCMDERRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRID_SHIFT)) & FLEXSPI_STS1_AHBCMDERRID_MASK) +#define FLEXSPI_STS1_AHBCMDERRCODE_MASK (0xF00U) +#define FLEXSPI_STS1_AHBCMDERRCODE_SHIFT (8U) +#define FLEXSPI_STS1_AHBCMDERRCODE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRCODE_SHIFT)) & FLEXSPI_STS1_AHBCMDERRCODE_MASK) +#define FLEXSPI_STS1_IPCMDERRID_MASK (0x1F0000U) +#define FLEXSPI_STS1_IPCMDERRID_SHIFT (16U) +#define FLEXSPI_STS1_IPCMDERRID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRID_SHIFT)) & FLEXSPI_STS1_IPCMDERRID_MASK) +#define FLEXSPI_STS1_IPCMDERRCODE_MASK (0xF000000U) +#define FLEXSPI_STS1_IPCMDERRCODE_SHIFT (24U) +#define FLEXSPI_STS1_IPCMDERRCODE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRCODE_SHIFT)) & FLEXSPI_STS1_IPCMDERRCODE_MASK) + +/*! @name STS2 - Status Register 2 */ +#define FLEXSPI_STS2_ASLVLOCK_MASK (0x1U) +#define FLEXSPI_STS2_ASLVLOCK_SHIFT (0U) +#define FLEXSPI_STS2_ASLVLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVLOCK_SHIFT)) & FLEXSPI_STS2_ASLVLOCK_MASK) +#define FLEXSPI_STS2_AREFLOCK_MASK (0x2U) +#define FLEXSPI_STS2_AREFLOCK_SHIFT (1U) +#define FLEXSPI_STS2_AREFLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFLOCK_SHIFT)) & FLEXSPI_STS2_AREFLOCK_MASK) +#define FLEXSPI_STS2_ASLVSEL_MASK (0xFCU) +#define FLEXSPI_STS2_ASLVSEL_SHIFT (2U) +#define FLEXSPI_STS2_ASLVSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVSEL_SHIFT)) & FLEXSPI_STS2_ASLVSEL_MASK) +#define FLEXSPI_STS2_AREFSEL_MASK (0x3F00U) +#define FLEXSPI_STS2_AREFSEL_SHIFT (8U) +#define FLEXSPI_STS2_AREFSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFSEL_SHIFT)) & FLEXSPI_STS2_AREFSEL_MASK) +#define FLEXSPI_STS2_BSLVLOCK_MASK (0x10000U) +#define FLEXSPI_STS2_BSLVLOCK_SHIFT (16U) +#define FLEXSPI_STS2_BSLVLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVLOCK_SHIFT)) & FLEXSPI_STS2_BSLVLOCK_MASK) +#define FLEXSPI_STS2_BREFLOCK_MASK (0x20000U) +#define FLEXSPI_STS2_BREFLOCK_SHIFT (17U) +#define FLEXSPI_STS2_BREFLOCK(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFLOCK_SHIFT)) & FLEXSPI_STS2_BREFLOCK_MASK) +#define FLEXSPI_STS2_BSLVSEL_MASK (0xFC0000U) +#define FLEXSPI_STS2_BSLVSEL_SHIFT (18U) +#define FLEXSPI_STS2_BSLVSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVSEL_SHIFT)) & FLEXSPI_STS2_BSLVSEL_MASK) +#define FLEXSPI_STS2_BREFSEL_MASK (0x3F000000U) +#define FLEXSPI_STS2_BREFSEL_SHIFT (24U) +#define FLEXSPI_STS2_BREFSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFSEL_SHIFT)) & FLEXSPI_STS2_BREFSEL_MASK) + +/*! @name AHBSPNDSTS - AHB Suspend Status Register */ +#define FLEXSPI_AHBSPNDSTS_ACTIVE_MASK (0x1U) +#define FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT (0U) +#define FLEXSPI_AHBSPNDSTS_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT)) & FLEXSPI_AHBSPNDSTS_ACTIVE_MASK) +#define FLEXSPI_AHBSPNDSTS_BUFID_MASK (0xEU) +#define FLEXSPI_AHBSPNDSTS_BUFID_SHIFT (1U) +#define FLEXSPI_AHBSPNDSTS_BUFID(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_BUFID_SHIFT)) & FLEXSPI_AHBSPNDSTS_BUFID_MASK) +#define FLEXSPI_AHBSPNDSTS_DATLFT_MASK (0xFFFF0000U) +#define FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT (16U) +#define FLEXSPI_AHBSPNDSTS_DATLFT(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT)) & FLEXSPI_AHBSPNDSTS_DATLFT_MASK) + +/*! @name IPRXFSTS - IP RX FIFO Status Register */ +#define FLEXSPI_IPRXFSTS_FILL_MASK (0xFFU) +#define FLEXSPI_IPRXFSTS_FILL_SHIFT (0U) +#define FLEXSPI_IPRXFSTS_FILL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_FILL_SHIFT)) & FLEXSPI_IPRXFSTS_FILL_MASK) +#define FLEXSPI_IPRXFSTS_RDCNTR_MASK (0xFFFF0000U) +#define FLEXSPI_IPRXFSTS_RDCNTR_SHIFT (16U) +#define FLEXSPI_IPRXFSTS_RDCNTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_RDCNTR_SHIFT)) & FLEXSPI_IPRXFSTS_RDCNTR_MASK) + +/*! @name IPTXFSTS - IP TX FIFO Status Register */ +#define FLEXSPI_IPTXFSTS_FILL_MASK (0xFFU) +#define FLEXSPI_IPTXFSTS_FILL_SHIFT (0U) +#define FLEXSPI_IPTXFSTS_FILL(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_FILL_SHIFT)) & FLEXSPI_IPTXFSTS_FILL_MASK) +#define FLEXSPI_IPTXFSTS_WRCNTR_MASK (0xFFFF0000U) +#define FLEXSPI_IPTXFSTS_WRCNTR_SHIFT (16U) +#define FLEXSPI_IPTXFSTS_WRCNTR(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_WRCNTR_SHIFT)) & FLEXSPI_IPTXFSTS_WRCNTR_MASK) + +/*! @name RFDR - IP RX FIFO Data Register 0..IP RX FIFO Data Register 31 */ +#define FLEXSPI_RFDR_RXDATA_MASK (0xFFFFFFFFU) +#define FLEXSPI_RFDR_RXDATA_SHIFT (0U) +#define FLEXSPI_RFDR_RXDATA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_RFDR_RXDATA_SHIFT)) & FLEXSPI_RFDR_RXDATA_MASK) + +/* The count of FLEXSPI_RFDR */ +#define FLEXSPI_RFDR_COUNT (32U) + +/*! @name TFDR - IP TX FIFO Data Register 0..IP TX FIFO Data Register 31 */ +#define FLEXSPI_TFDR_TXDATA_MASK (0xFFFFFFFFU) +#define FLEXSPI_TFDR_TXDATA_SHIFT (0U) +#define FLEXSPI_TFDR_TXDATA(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_TFDR_TXDATA_SHIFT)) & FLEXSPI_TFDR_TXDATA_MASK) + +/* The count of FLEXSPI_TFDR */ +#define FLEXSPI_TFDR_COUNT (32U) + +/*! @name LUT - LUT 0..LUT 127 */ +#define FLEXSPI_LUT_OPERAND0_MASK (0xFFU) +#define FLEXSPI_LUT_OPERAND0_SHIFT (0U) +#define FLEXSPI_LUT_OPERAND0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND0_SHIFT)) & FLEXSPI_LUT_OPERAND0_MASK) +#define FLEXSPI_LUT_NUM_PADS0_MASK (0x300U) +#define FLEXSPI_LUT_NUM_PADS0_SHIFT (8U) +#define FLEXSPI_LUT_NUM_PADS0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS0_SHIFT)) & FLEXSPI_LUT_NUM_PADS0_MASK) +#define FLEXSPI_LUT_OPCODE0_MASK (0xFC00U) +#define FLEXSPI_LUT_OPCODE0_SHIFT (10U) +#define FLEXSPI_LUT_OPCODE0(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE0_SHIFT)) & FLEXSPI_LUT_OPCODE0_MASK) +#define FLEXSPI_LUT_OPERAND1_MASK (0xFF0000U) +#define FLEXSPI_LUT_OPERAND1_SHIFT (16U) +#define FLEXSPI_LUT_OPERAND1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND1_SHIFT)) & FLEXSPI_LUT_OPERAND1_MASK) +#define FLEXSPI_LUT_NUM_PADS1_MASK (0x3000000U) +#define FLEXSPI_LUT_NUM_PADS1_SHIFT (24U) +#define FLEXSPI_LUT_NUM_PADS1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS1_SHIFT)) & FLEXSPI_LUT_NUM_PADS1_MASK) +#define FLEXSPI_LUT_OPCODE1_MASK (0xFC000000U) +#define FLEXSPI_LUT_OPCODE1_SHIFT (26U) +#define FLEXSPI_LUT_OPCODE1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE1_SHIFT)) & FLEXSPI_LUT_OPCODE1_MASK) + +/* The count of FLEXSPI_LUT */ +#define FLEXSPI_LUT_COUNT (128U) + + +/*! + * @} + */ /* end of group FLEXSPI_Register_Masks */ + + +/* FLEXSPI - Peripheral instance base addresses */ +/** Peripheral FSPI0 base pointer */ +#define FSPI0 ((FLEXSPI_Type *)FSPI0_BASE) +/** Peripheral FSPI1 base pointer */ +#define FSPI1 ((FLEXSPI_Type *)FSPI1_BASE) +/** Array initializer of FLEXSPI peripheral base addresses */ +#define FSPI_BASE_ADDRS { FSPI0_BASE, FSPI1_BASE } +/** Array initializer of FLEXSPI peripheral base pointers */ +#define FSPI_BASE_PTRS { FSPI0, FSPI1 } +/** Interrupt vectors for the FLEXSPI peripheral type */ +#define FLEXSPI_IRQS { NotAvail_IRQn } + + +/*! + * @} + */ /* end of group FLEXSPI_Peripheral_Access_Layer */ + +#endif /* HW_FLEXSPI_REGISTERS_H */ diff --git a/platform/devices/MX8/MX8_gpio.h b/platform/devices/MX8/MX8_gpio.h new file mode 100755 index 0000000..dd89cc4 --- /dev/null +++ b/platform/devices/MX8/MX8_gpio.h @@ -0,0 +1,207 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_GPIO_REGISTERS_H +#define HW_GPIO_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- FGPIO Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FGPIO_Peripheral_Access_Layer FGPIO Peripheral Access Layer + * @{ + */ + +/** FGPIO - Register Layout Typedef */ +typedef struct { + __IO uint32_t PDOR; /**< Port Data Output Register, offset: 0x0 */ + __O uint32_t PSOR; /**< Port Set Output Register, offset: 0x4 */ + __O uint32_t PCOR; /**< Port Clear Output Register, offset: 0x8 */ + __O uint32_t PTOR; /**< Port Toggle Output Register, offset: 0xC */ + __I uint32_t PDIR; /**< Port Data Input Register, offset: 0x10 */ + __IO uint32_t PDDR; /**< Port Data Direction Register, offset: 0x14 */ +} FGPIO_Type; + +/* ---------------------------------------------------------------------------- + -- FGPIO Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FGPIO_Register_Masks FGPIO Register Masks + * @{ + */ + +/*! @name PDOR - Port Data Output Register */ +#define FGPIO_PDOR_PDO_MASK (0xFFFFFFFFU) +#define FGPIO_PDOR_PDO_SHIFT (0U) +#define FGPIO_PDOR_PDO(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PDOR_PDO_SHIFT)) & FGPIO_PDOR_PDO_MASK) + +/*! @name PSOR - Port Set Output Register */ +#define FGPIO_PSOR_PTSO_MASK (0xFFFFFFFFU) +#define FGPIO_PSOR_PTSO_SHIFT (0U) +#define FGPIO_PSOR_PTSO(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PSOR_PTSO_SHIFT)) & FGPIO_PSOR_PTSO_MASK) + +/*! @name PCOR - Port Clear Output Register */ +#define FGPIO_PCOR_PTCO_MASK (0xFFFFFFFFU) +#define FGPIO_PCOR_PTCO_SHIFT (0U) +#define FGPIO_PCOR_PTCO(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PCOR_PTCO_SHIFT)) & FGPIO_PCOR_PTCO_MASK) + +/*! @name PTOR - Port Toggle Output Register */ +#define FGPIO_PTOR_PTTO_MASK (0xFFFFFFFFU) +#define FGPIO_PTOR_PTTO_SHIFT (0U) +#define FGPIO_PTOR_PTTO(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PTOR_PTTO_SHIFT)) & FGPIO_PTOR_PTTO_MASK) + +/*! @name PDIR - Port Data Input Register */ +#define FGPIO_PDIR_PDI_MASK (0xFFFFFFFFU) +#define FGPIO_PDIR_PDI_SHIFT (0U) +#define FGPIO_PDIR_PDI(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PDIR_PDI_SHIFT)) & FGPIO_PDIR_PDI_MASK) + +/*! @name PDDR - Port Data Direction Register */ +#define FGPIO_PDDR_PDD_MASK (0xFFFFFFFFU) +#define FGPIO_PDDR_PDD_SHIFT (0U) +#define FGPIO_PDDR_PDD(x) (((uint32_t)(((uint32_t)(x)) << FGPIO_PDDR_PDD_SHIFT)) & FGPIO_PDDR_PDD_MASK) + + +/*! + * @} + */ /* end of group FGPIO_Register_Masks */ + + +/* FGPIO - Peripheral instance base addresses */ +/** Peripheral FGPIOA base address */ +#define FGPIOA_BASE (0xF8000000u) +/** Peripheral FGPIOA base pointer */ +#define FGPIOA ((FGPIO_Type *)FGPIOA_BASE) +/** Array initializer of FGPIO peripheral base addresses */ +#define FGPIO_BASE_ADDRS { FGPIOA_BASE } +/** Array initializer of FGPIO peripheral base pointers */ +#define FGPIO_BASE_PTRS { FGPIOA } + +/*! + * @} + */ /* end of group FGPIO_Peripheral_Access_Layer */ + +/* ---------------------------------------------------------------------------- + -- RGPIO Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup RGPIO_Peripheral_Access_Layer RGPIO Peripheral Access Layer + * @{ + */ + +/** RGPIO - Register Layout Typedef */ +typedef struct { + __IO uint32_t PDOR; /**< Port Data Output Register, offset: 0x0 */ + __O uint32_t PSOR; /**< Port Set Output Register, offset: 0x4 */ + __O uint32_t PCOR; /**< Port Clear Output Register, offset: 0x8 */ + __O uint32_t PTOR; /**< Port Toggle Output Register, offset: 0xC */ + __I uint32_t PDIR; /**< Port Data Input Register, offset: 0x10 */ + __IO uint32_t PDDR; /**< Port Data Direction Register, offset: 0x14 */ +} RGPIO_Type; + +/* ---------------------------------------------------------------------------- + -- RGPIO Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup RGPIO_Register_Masks RGPIO Register Masks + * @{ + */ + +/*! @name PDOR - Port Data Output Register */ +#define RGPIO_PDOR_PDO_MASK (0xFFFFFFFFU) +#define RGPIO_PDOR_PDO_SHIFT (0U) +#define RGPIO_PDOR_PDO(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PDOR_PDO_SHIFT)) & RGPIO_PDOR_PDO_MASK) + +/*! @name PSOR - Port Set Output Register */ +#define RGPIO_PSOR_PTSO_MASK (0xFFFFFFFFU) +#define RGPIO_PSOR_PTSO_SHIFT (0U) +#define RGPIO_PSOR_PTSO(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PSOR_PTSO_SHIFT)) & RGPIO_PSOR_PTSO_MASK) + +/*! @name PCOR - Port Clear Output Register */ +#define RGPIO_PCOR_PTCO_MASK (0xFFFFFFFFU) +#define RGPIO_PCOR_PTCO_SHIFT (0U) +#define RGPIO_PCOR_PTCO(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PCOR_PTCO_SHIFT)) & RGPIO_PCOR_PTCO_MASK) + +/*! @name PTOR - Port Toggle Output Register */ +#define RGPIO_PTOR_PTTO_MASK (0xFFFFFFFFU) +#define RGPIO_PTOR_PTTO_SHIFT (0U) +#define RGPIO_PTOR_PTTO(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PTOR_PTTO_SHIFT)) & RGPIO_PTOR_PTTO_MASK) + +/*! @name PDIR - Port Data Input Register */ +#define RGPIO_PDIR_PDI_MASK (0xFFFFFFFFU) +#define RGPIO_PDIR_PDI_SHIFT (0U) +#define RGPIO_PDIR_PDI(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PDIR_PDI_SHIFT)) & RGPIO_PDIR_PDI_MASK) + +/*! @name PDDR - Port Data Direction Register */ +#define RGPIO_PDDR_PDD_MASK (0xFFFFFFFFU) +#define RGPIO_PDDR_PDD_SHIFT (0U) +#define RGPIO_PDDR_PDD(x) (((uint32_t)(((uint32_t)(x)) << RGPIO_PDDR_PDD_SHIFT)) & RGPIO_PDDR_PDD_MASK) + + +/*! + * @} + */ /* end of group RGPIO_Register_Masks */ + + +/* RGPIO - Peripheral instance base addresses */ +/** Peripheral RGPIOA base pointer */ +#define RGPIOA ((RGPIO_Type *)RGPIOA_BASE) +/** Peripheral RGPIOB base pointer */ +#define RGPIOB ((RGPIO_Type *)RGPIOB_BASE) +/** Peripheral RGPIOC base pointer */ +#define RGPIOC ((RGPIO_Type *)RGPIOC_BASE) +/** Array initializer of RGPIO peripheral base addresses */ +#define RGPIO_BASE_ADDRS { RGPIOA_BASE, RGPIOB_BASE, RGPIOC_BASE } +/** Array initializer of RGPIO peripheral base pointers */ +#define RGPIO_BASE_PTRS { RGPIOA, RGPIOB, RGPIOC } + +/*! + * @} + */ /* end of group RGPIO_Peripheral_Access_Layer */ + +#endif /* HW_GPIO_REGISTERS_H */ diff --git a/platform/devices/MX8/MX8_igpio.h b/platform/devices/MX8/MX8_igpio.h new file mode 100755 index 0000000..cbd7eb8 --- /dev/null +++ b/platform/devices/MX8/MX8_igpio.h @@ -0,0 +1,464 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_IGPIO_REGISTERS_H +#define HW_IGPIO_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- GPIO Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer + * @{ + */ + +/** GPIO - Register Layout Typedef */ +typedef struct { + __IO uint32_t DR; /**< GPIO data register, offset: 0x0 */ + __IO uint32_t GDIR; /**< GPIO direction register, offset: 0x4 */ + __I uint32_t PSR; /**< GPIO pad status register, offset: 0x8 */ + __IO uint32_t ICR1; /**< GPIO interrupt configuration register1, offset: 0xC */ + __IO uint32_t ICR2; /**< GPIO interrupt configuration register2, offset: 0x10 */ + __IO uint32_t IMR; /**< GPIO interrupt mask register, offset: 0x14 */ + __IO uint32_t ISR; /**< GPIO interrupt status register, offset: 0x18 */ + __IO uint32_t EDGE_SEL; /**< GPIO edge select register, offset: 0x1C */ +} GPIO_Type; + +/* ---------------------------------------------------------------------------- + -- GPIO Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GPIO_Register_Masks GPIO Register Masks + * @{ + */ + +/*! @name DR - GPIO data register */ +/*! @{ */ +#define GPIO_DR_DR_MASK (0xFFFFFFFFU) +#define GPIO_DR_DR_SHIFT (0U) +#define GPIO_DR_DR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_DR_DR_SHIFT)) & GPIO_DR_DR_MASK) +/*! @} */ + +/*! @name GDIR - GPIO direction register */ +/*! @{ */ +#define GPIO_GDIR_GDIR_MASK (0xFFFFFFFFU) +#define GPIO_GDIR_GDIR_SHIFT (0U) +/*! GDIR + * 0b00000000000000000000000000000000..GPIO is configured as input. + * 0b00000000000000000000000000000001..GPIO is configured as output. + */ +#define GPIO_GDIR_GDIR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GDIR_GDIR_SHIFT)) & GPIO_GDIR_GDIR_MASK) +/*! @} */ + +/*! @name PSR - GPIO pad status register */ +/*! @{ */ +#define GPIO_PSR_PSR_MASK (0xFFFFFFFFU) +#define GPIO_PSR_PSR_SHIFT (0U) +#define GPIO_PSR_PSR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSR_PSR_SHIFT)) & GPIO_PSR_PSR_MASK) +/*! @} */ + +/*! @name ICR1 - GPIO interrupt configuration register1 */ +/*! @{ */ +#define GPIO_ICR1_ICR0_MASK (0x3U) +#define GPIO_ICR1_ICR0_SHIFT (0U) +/*! ICR0 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR0_SHIFT)) & GPIO_ICR1_ICR0_MASK) +#define GPIO_ICR1_ICR1_MASK (0xCU) +#define GPIO_ICR1_ICR1_SHIFT (2U) +/*! ICR1 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR1_SHIFT)) & GPIO_ICR1_ICR1_MASK) +#define GPIO_ICR1_ICR2_MASK (0x30U) +#define GPIO_ICR1_ICR2_SHIFT (4U) +/*! ICR2 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR2_SHIFT)) & GPIO_ICR1_ICR2_MASK) +#define GPIO_ICR1_ICR3_MASK (0xC0U) +#define GPIO_ICR1_ICR3_SHIFT (6U) +/*! ICR3 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR3_SHIFT)) & GPIO_ICR1_ICR3_MASK) +#define GPIO_ICR1_ICR4_MASK (0x300U) +#define GPIO_ICR1_ICR4_SHIFT (8U) +/*! ICR4 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR4_SHIFT)) & GPIO_ICR1_ICR4_MASK) +#define GPIO_ICR1_ICR5_MASK (0xC00U) +#define GPIO_ICR1_ICR5_SHIFT (10U) +/*! ICR5 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR5_SHIFT)) & GPIO_ICR1_ICR5_MASK) +#define GPIO_ICR1_ICR6_MASK (0x3000U) +#define GPIO_ICR1_ICR6_SHIFT (12U) +/*! ICR6 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR6_SHIFT)) & GPIO_ICR1_ICR6_MASK) +#define GPIO_ICR1_ICR7_MASK (0xC000U) +#define GPIO_ICR1_ICR7_SHIFT (14U) +/*! ICR7 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR7_SHIFT)) & GPIO_ICR1_ICR7_MASK) +#define GPIO_ICR1_ICR8_MASK (0x30000U) +#define GPIO_ICR1_ICR8_SHIFT (16U) +/*! ICR8 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR8_SHIFT)) & GPIO_ICR1_ICR8_MASK) +#define GPIO_ICR1_ICR9_MASK (0xC0000U) +#define GPIO_ICR1_ICR9_SHIFT (18U) +/*! ICR9 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR9_SHIFT)) & GPIO_ICR1_ICR9_MASK) +#define GPIO_ICR1_ICR10_MASK (0x300000U) +#define GPIO_ICR1_ICR10_SHIFT (20U) +/*! ICR10 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR10_SHIFT)) & GPIO_ICR1_ICR10_MASK) +#define GPIO_ICR1_ICR11_MASK (0xC00000U) +#define GPIO_ICR1_ICR11_SHIFT (22U) +/*! ICR11 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR11_SHIFT)) & GPIO_ICR1_ICR11_MASK) +#define GPIO_ICR1_ICR12_MASK (0x3000000U) +#define GPIO_ICR1_ICR12_SHIFT (24U) +/*! ICR12 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR12_SHIFT)) & GPIO_ICR1_ICR12_MASK) +#define GPIO_ICR1_ICR13_MASK (0xC000000U) +#define GPIO_ICR1_ICR13_SHIFT (26U) +/*! ICR13 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR13_SHIFT)) & GPIO_ICR1_ICR13_MASK) +#define GPIO_ICR1_ICR14_MASK (0x30000000U) +#define GPIO_ICR1_ICR14_SHIFT (28U) +/*! ICR14 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR14_SHIFT)) & GPIO_ICR1_ICR14_MASK) +#define GPIO_ICR1_ICR15_MASK (0xC0000000U) +#define GPIO_ICR1_ICR15_SHIFT (30U) +/*! ICR15 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR1_ICR15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR1_ICR15_SHIFT)) & GPIO_ICR1_ICR15_MASK) +/*! @} */ + +/*! @name ICR2 - GPIO interrupt configuration register2 */ +/*! @{ */ +#define GPIO_ICR2_ICR16_MASK (0x3U) +#define GPIO_ICR2_ICR16_SHIFT (0U) +/*! ICR16 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR16_SHIFT)) & GPIO_ICR2_ICR16_MASK) +#define GPIO_ICR2_ICR17_MASK (0xCU) +#define GPIO_ICR2_ICR17_SHIFT (2U) +/*! ICR17 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR17_SHIFT)) & GPIO_ICR2_ICR17_MASK) +#define GPIO_ICR2_ICR18_MASK (0x30U) +#define GPIO_ICR2_ICR18_SHIFT (4U) +/*! ICR18 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR18_SHIFT)) & GPIO_ICR2_ICR18_MASK) +#define GPIO_ICR2_ICR19_MASK (0xC0U) +#define GPIO_ICR2_ICR19_SHIFT (6U) +/*! ICR19 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR19_SHIFT)) & GPIO_ICR2_ICR19_MASK) +#define GPIO_ICR2_ICR20_MASK (0x300U) +#define GPIO_ICR2_ICR20_SHIFT (8U) +/*! ICR20 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR20_SHIFT)) & GPIO_ICR2_ICR20_MASK) +#define GPIO_ICR2_ICR21_MASK (0xC00U) +#define GPIO_ICR2_ICR21_SHIFT (10U) +/*! ICR21 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR21_SHIFT)) & GPIO_ICR2_ICR21_MASK) +#define GPIO_ICR2_ICR22_MASK (0x3000U) +#define GPIO_ICR2_ICR22_SHIFT (12U) +/*! ICR22 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR22_SHIFT)) & GPIO_ICR2_ICR22_MASK) +#define GPIO_ICR2_ICR23_MASK (0xC000U) +#define GPIO_ICR2_ICR23_SHIFT (14U) +/*! ICR23 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR23_SHIFT)) & GPIO_ICR2_ICR23_MASK) +#define GPIO_ICR2_ICR24_MASK (0x30000U) +#define GPIO_ICR2_ICR24_SHIFT (16U) +/*! ICR24 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR24_SHIFT)) & GPIO_ICR2_ICR24_MASK) +#define GPIO_ICR2_ICR25_MASK (0xC0000U) +#define GPIO_ICR2_ICR25_SHIFT (18U) +/*! ICR25 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR25_SHIFT)) & GPIO_ICR2_ICR25_MASK) +#define GPIO_ICR2_ICR26_MASK (0x300000U) +#define GPIO_ICR2_ICR26_SHIFT (20U) +/*! ICR26 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR26_SHIFT)) & GPIO_ICR2_ICR26_MASK) +#define GPIO_ICR2_ICR27_MASK (0xC00000U) +#define GPIO_ICR2_ICR27_SHIFT (22U) +/*! ICR27 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR27_SHIFT)) & GPIO_ICR2_ICR27_MASK) +#define GPIO_ICR2_ICR28_MASK (0x3000000U) +#define GPIO_ICR2_ICR28_SHIFT (24U) +/*! ICR28 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR28_SHIFT)) & GPIO_ICR2_ICR28_MASK) +#define GPIO_ICR2_ICR29_MASK (0xC000000U) +#define GPIO_ICR2_ICR29_SHIFT (26U) +/*! ICR29 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR29_SHIFT)) & GPIO_ICR2_ICR29_MASK) +#define GPIO_ICR2_ICR30_MASK (0x30000000U) +#define GPIO_ICR2_ICR30_SHIFT (28U) +/*! ICR30 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR30_SHIFT)) & GPIO_ICR2_ICR30_MASK) +#define GPIO_ICR2_ICR31_MASK (0xC0000000U) +#define GPIO_ICR2_ICR31_SHIFT (30U) +/*! ICR31 + * 0b00..Interrupt n is low-level sensitive. + * 0b01..Interrupt n is high-level sensitive. + * 0b10..Interrupt n is rising-edge sensitive. + * 0b11..Interrupt n is falling-edge sensitive. + */ +#define GPIO_ICR2_ICR31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR2_ICR31_SHIFT)) & GPIO_ICR2_ICR31_MASK) +/*! @} */ + +/*! @name IMR - GPIO interrupt mask register */ +/*! @{ */ +#define GPIO_IMR_IMR_MASK (0xFFFFFFFFU) +#define GPIO_IMR_IMR_SHIFT (0U) +/*! IMR + * 0b00000000000000000000000000000000..Interrupt n is disabled. + * 0b00000000000000000000000000000001..Interrupt n is enabled. + */ +#define GPIO_IMR_IMR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_IMR_IMR_SHIFT)) & GPIO_IMR_IMR_MASK) +/*! @} */ + +/*! @name ISR - GPIO interrupt status register */ +/*! @{ */ +#define GPIO_ISR_ISR_MASK (0xFFFFFFFFU) +#define GPIO_ISR_ISR_SHIFT (0U) +#define GPIO_ISR_ISR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISR_ISR_SHIFT)) & GPIO_ISR_ISR_MASK) +/*! @} */ + +/*! @name EDGE_SEL - GPIO edge select register */ +/*! @{ */ +#define GPIO_EDGE_SEL_GPIO_EDGE_SEL_MASK (0xFFFFFFFFU) +#define GPIO_EDGE_SEL_GPIO_EDGE_SEL_SHIFT (0U) +#define GPIO_EDGE_SEL_GPIO_EDGE_SEL(x) (((uint32_t)(((uint32_t)(x)) << GPIO_EDGE_SEL_GPIO_EDGE_SEL_SHIFT)) & GPIO_EDGE_SEL_GPIO_EDGE_SEL_MASK) +/*! @} */ + +/*! + * @} + */ /* end of group GPIO_Register_Masks */ + +/* GPIO - Peripheral instance base addresses */ +/** Peripheral GPIO1 base pointer */ +#define GPIO0 ((GPIO_Type *)GPIO0_BASE) +/** Peripheral GPIO1 base pointer */ +#define GPIO1 ((GPIO_Type *)GPIO1_BASE) +/** Peripheral GPIO2 base pointer */ +#define GPIO2 ((GPIO_Type *)GPIO2_BASE) +/** Peripheral GPIO3 base pointer */ +#define GPIO3 ((GPIO_Type *)GPIO3_BASE) +/** Peripheral GPIO4 base pointer */ +#define GPIO4 ((GPIO_Type *)GPIO4_BASE) +/** Peripheral GPIO5 base pointer */ +#define GPIO5 ((GPIO_Type *)GPIO5_BASE) +/** Peripheral GPIO5 base pointer */ +#define GPIO6 ((GPIO_Type *)GPIO6_BASE) +/** Peripheral GPIO5 base pointer */ +#define GPIO7 ((GPIO_Type *)GPIO7_BASE) +/** Array initializer of GPIO peripheral base addresses */ +#define GPIO_BASE_ADDRS { GPIO0_BASE, GPIO1_BASE, \ + GPIO2_BASE, GPIO3_BASE, \ + GPIO4_BASE, GPIO5_BASE, \ + GPIO6_BASE, GPIO7_BASE } +/** Array initializer of GPIO peripheral base pointers */ +#define GPIO_BASE_PTRS { GPIO0, GPIO1, GPIO2, \ + GPIO3, GPIO4, GPIO5, \ + GPIO6, GPIO7 } +/** Interrupt vectors for the GPIO peripheral type */ +#define GPIO_IRQS { NotAvail_IRQn } +#define GPIO_COMBINED_LOW_IRQS { NotAvail_IRQn } +#define GPIO_COMBINED_HIGH_IRQS { NotAvail_IRQn } + +/*! + * @} + */ /* end of group GPIO_Peripheral_Access_Layer */ + +#endif /* HW_IGPIO_REGISTERS_H */ diff --git a/platform/devices/MX8/MX8_isi.h b/platform/devices/MX8/MX8_isi.h new file mode 100755 index 0000000..78e9b8d --- /dev/null +++ b/platform/devices/MX8/MX8_isi.h @@ -0,0 +1,831 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8_isi.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for ISI + * + * CMSIS Peripheral Access Layer for ISI + */ + +#ifndef ISI_H +#define ISI_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- ISI Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ISI_Peripheral_Access_Layer ISI Peripheral Access Layer + * @{ + */ + +/** ISI - Register Layout Typedef */ +typedef struct { + __IO uint32_t CHNL_CTRL; /**< Channel Control Register, offset: 0x0 */ + __IO uint32_t CHNL_IMG_CTRL; /**< Channel Image Control Register, offset: 0x4 */ + __IO uint32_t CHNL_OUT_BUF_CTRL; /**< Channel Output Buffer Control Register, offset: 0x8 */ + __IO uint32_t CHNL_IMG_CFG; /**< Channel Image Configuration, offset: 0xC */ + __IO uint32_t CHNL_IER; /**< Channel Interrupt Enable Register, offset: 0x10 */ + __IO uint32_t CHNL_STS; /**< Channel Status Register, offset: 0x14 */ + __IO uint32_t CHNL_SCALE_FACTOR; /**< Channel Scale Factor Register, offset: 0x18 */ + __IO uint32_t CHNL_SCALE_OFFSET; /**< Channel Scale Offset Register, offset: 0x1C */ + __IO uint32_t CHNL_CROP_ULC; /**< Channel Crop Upper Left Corner Coordinate Register, offset: 0x20 */ + __IO uint32_t CHNL_CROP_LRC; /**< Channel Crop Lower Right Corner Coordinate Register, offset: 0x24 */ + __IO uint32_t CHNL_CSC_COEFF0; /**< Channel Color Space Conversion Coefficient Register 0, offset: 0x28 */ + __IO uint32_t CHNL_CSC_COEFF1; /**< Channel Color Space Conversion Coefficient Register 1, offset: 0x2C */ + __IO uint32_t CHNL_CSC_COEFF2; /**< Channel Color Space Conversion Coefficient Register 2, offset: 0x30 */ + __IO uint32_t CHNL_CSC_COEFF3; /**< Channel Color Space Conversion Coefficient Register 3, offset: 0x34 */ + __IO uint32_t CHNL_CSC_COEFF4; /**< Channel Color Space Conversion Coefficient Register 4, offset: 0x38 */ + __IO uint32_t CHNL_CSC_COEFF5; /**< Channel Color Space Conversion Coefficient Register 5, offset: 0x3C */ + __IO uint32_t CHNL_ROI_0_ALPHA; /**< Channel Alpha Value Register for Region of Interest 0, offset: 0x40 */ + __IO uint32_t CHNL_ROI_0_ULC; /**< Channel Upper Left Coordinate Register for Region of Interest 0, offset: 0x44 */ + __IO uint32_t CHNL_ROI_0_LRC; /**< Channel Lower Right Coordinate Register for Region of Interest 0, offset: 0x48 */ + __IO uint32_t CHNL_ROI_1_ALPHA; /**< Channel Alpha Value Register for Region of Interest 1, offset: 0x4C */ + __IO uint32_t CHNL_ROI_1_ULC; /**< Channel Upper Left Coordinate Register for Region of Interest 1, offset: 0x50 */ + __IO uint32_t CHNL_ROI_1_LRC; /**< Channel Lower Right Coordinate Register for Region of Interest 1, offset: 0x54 */ + __IO uint32_t CHNL_ROI_2_ALPHA; /**< Channel Alpha Value Register for Region of Interest 2, offset: 0x58 */ + __IO uint32_t CHNL_ROI_2_ULC; /**< Channel Upper Left Coordinate Register for Region of Interest 2, offset: 0x5C */ + __IO uint32_t CHNL_ROI_2_LRC; /**< Channel Lower Right Coordinate Register for Region of Interest 2, offset: 0x60 */ + __IO uint32_t CHNL_ROI_3_ALPHA; /**< Channel Alpha Value Register for Region of Interest 3, offset: 0x64 */ + __IO uint32_t CHNL_ROI_3_ULC; /**< Channel Upper Left Coordinate Register for Region of Interest 3, offset: 0x68 */ + __IO uint32_t CHNL_ROI_3_LRC; /**< Channel Lower Right Coordinate Register for Region of Interest 3, offset: 0x6C */ + __IO uint32_t CHNL_OUT_BUF1_ADDR_Y; /**< Channel RGB or Luma (Y) Output Buffer 1 Address, offset: 0x70 */ + __IO uint32_t CHNL_OUT_BUF1_ADDR_U; /**< Channel Chroma (U/Cb/UV/CbCr) Output Buffer 1 Address, offset: 0x74 */ + __IO uint32_t CHNL_OUT_BUF1_ADDR_V; /**< Channel Chroma (V/Cr) Output Buffer 1 Address, offset: 0x78 */ + __IO uint32_t CHNL_OUT_BUF_PITCH; /**< Channel Output Buffer Pitch, offset: 0x7C */ + __IO uint32_t CHNL_IN_BUF_ADDR; /**< Channel Input Buffer Address, offset: 0x80 */ + __IO uint32_t CHNL_IN_BUF_PITCH; /**< Channel Input Buffer Pitch, offset: 0x84 */ + __IO uint32_t CHNL_MEM_RD_CTRL; /**< Channel Memory Read Control, offset: 0x88 */ + __IO uint32_t CHNL_OUT_BUF2_ADDR_Y; /**< Channel RGB or Luma (Y) Output Buffer 2 Address, offset: 0x8C */ + __IO uint32_t CHNL_OUT_BUF2_ADDR_U; /**< Channel Chroma (U/Cb/UV/CbCr) Output Buffer 2 Address, offset: 0x90 */ + __IO uint32_t CHNL_OUT_BUF2_ADDR_V; /**< Channel Chroma (V/Cr) Output Buffer 2 Address, offset: 0x94 */ + __IO uint32_t CHNL_SCL_IMG_CFG; /**< Channel Scaled Image Configuration, offset: 0x98 */ +} ISI_Type; + +/* ---------------------------------------------------------------------------- + -- ISI Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ISI_Register_Masks ISI Register Masks + * @{ + */ + +/*! @name CHNL_CTRL - Channel Control Register */ +#define ISI_CHNL_CTRL_SRC_MASK (0x7U) +#define ISI_CHNL_CTRL_SRC_SHIFT (0U) +#define ISI_CHNL_CTRL_SRC(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_SRC_SHIFT)) & ISI_CHNL_CTRL_SRC_MASK) +#define ISI_CHNL_CTRL_SRC_TYPE_MASK (0x10U) +#define ISI_CHNL_CTRL_SRC_TYPE_SHIFT (4U) +#define ISI_CHNL_CTRL_SRC_TYPE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_SRC_TYPE_SHIFT)) & ISI_CHNL_CTRL_SRC_TYPE_MASK) +#define ISI_CHNL_CTRL_MIPI_VC_ID_MASK (0xC0U) +#define ISI_CHNL_CTRL_MIPI_VC_ID_SHIFT (6U) +#define ISI_CHNL_CTRL_MIPI_VC_ID(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_MIPI_VC_ID_SHIFT)) & ISI_CHNL_CTRL_MIPI_VC_ID_MASK) +#define ISI_CHNL_CTRL_SEC_LB_SRC_MASK (0x700U) +#define ISI_CHNL_CTRL_SEC_LB_SRC_SHIFT (8U) +#define ISI_CHNL_CTRL_SEC_LB_SRC(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_SEC_LB_SRC_SHIFT)) & ISI_CHNL_CTRL_SEC_LB_SRC_MASK) +#define ISI_CHNL_CTRL_BLANK_PXL_MASK (0xFF0000U) +#define ISI_CHNL_CTRL_BLANK_PXL_SHIFT (16U) +#define ISI_CHNL_CTRL_BLANK_PXL(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_BLANK_PXL_SHIFT)) & ISI_CHNL_CTRL_BLANK_PXL_MASK) +#define ISI_CHNL_CTRL_SW_RST_MASK (0x1000000U) +#define ISI_CHNL_CTRL_SW_RST_SHIFT (24U) +#define ISI_CHNL_CTRL_SW_RST(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_SW_RST_SHIFT)) & ISI_CHNL_CTRL_SW_RST_MASK) +#define ISI_CHNL_CTRL_CHAIN_BUF_MASK (0x6000000U) +#define ISI_CHNL_CTRL_CHAIN_BUF_SHIFT (25U) +#define ISI_CHNL_CTRL_CHAIN_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_CHAIN_BUF_SHIFT)) & ISI_CHNL_CTRL_CHAIN_BUF_MASK) +#define ISI_CHNL_CTRL_CHNL_BYPASS_MASK (0x20000000U) +#define ISI_CHNL_CTRL_CHNL_BYPASS_SHIFT (29U) +#define ISI_CHNL_CTRL_CHNL_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_CHNL_BYPASS_SHIFT)) & ISI_CHNL_CTRL_CHNL_BYPASS_MASK) +#define ISI_CHNL_CTRL_CLK_EN_MASK (0x40000000U) +#define ISI_CHNL_CTRL_CLK_EN_SHIFT (30U) +#define ISI_CHNL_CTRL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_CLK_EN_SHIFT)) & ISI_CHNL_CTRL_CLK_EN_MASK) +#define ISI_CHNL_CTRL_CHNL_EN_MASK (0x80000000U) +#define ISI_CHNL_CTRL_CHNL_EN_SHIFT (31U) +#define ISI_CHNL_CTRL_CHNL_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CTRL_CHNL_EN_SHIFT)) & ISI_CHNL_CTRL_CHNL_EN_MASK) + +/*! @name CHNL_IMG_CTRL - Channel Image Control Register */ +#define ISI_CHNL_IMG_CTRL_CSC_BYP_MASK (0x1U) +#define ISI_CHNL_IMG_CTRL_CSC_BYP_SHIFT (0U) +#define ISI_CHNL_IMG_CTRL_CSC_BYP(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_CSC_BYP_SHIFT)) & ISI_CHNL_IMG_CTRL_CSC_BYP_MASK) +#define ISI_CHNL_IMG_CTRL_CSC_MODE_MASK (0x6U) +#define ISI_CHNL_IMG_CTRL_CSC_MODE_SHIFT (1U) +#define ISI_CHNL_IMG_CTRL_CSC_MODE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_CSC_MODE_SHIFT)) & ISI_CHNL_IMG_CTRL_CSC_MODE_MASK) +#define ISI_CHNL_IMG_CTRL_YCBCR_MODE_MASK (0x8U) +#define ISI_CHNL_IMG_CTRL_YCBCR_MODE_SHIFT (3U) +#define ISI_CHNL_IMG_CTRL_YCBCR_MODE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_YCBCR_MODE_SHIFT)) & ISI_CHNL_IMG_CTRL_YCBCR_MODE_MASK) +#define ISI_CHNL_IMG_CTRL_RSVD2_MASK (0x10U) +#define ISI_CHNL_IMG_CTRL_RSVD2_SHIFT (4U) +#define ISI_CHNL_IMG_CTRL_RSVD2(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_RSVD2_SHIFT)) & ISI_CHNL_IMG_CTRL_RSVD2_MASK) +#define ISI_CHNL_IMG_CTRL_HFLIP_EN_MASK (0x20U) +#define ISI_CHNL_IMG_CTRL_HFLIP_EN_SHIFT (5U) +#define ISI_CHNL_IMG_CTRL_HFLIP_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_HFLIP_EN_SHIFT)) & ISI_CHNL_IMG_CTRL_HFLIP_EN_MASK) +#define ISI_CHNL_IMG_CTRL_VFLIP_EN_MASK (0x40U) +#define ISI_CHNL_IMG_CTRL_VFLIP_EN_SHIFT (6U) +#define ISI_CHNL_IMG_CTRL_VFLIP_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_VFLIP_EN_SHIFT)) & ISI_CHNL_IMG_CTRL_VFLIP_EN_MASK) +#define ISI_CHNL_IMG_CTRL_CROP_EN_MASK (0x80U) +#define ISI_CHNL_IMG_CTRL_CROP_EN_SHIFT (7U) +#define ISI_CHNL_IMG_CTRL_CROP_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_CROP_EN_SHIFT)) & ISI_CHNL_IMG_CTRL_CROP_EN_MASK) +#define ISI_CHNL_IMG_CTRL_DEC_Y_MASK (0x300U) +#define ISI_CHNL_IMG_CTRL_DEC_Y_SHIFT (8U) +#define ISI_CHNL_IMG_CTRL_DEC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_DEC_Y_SHIFT)) & ISI_CHNL_IMG_CTRL_DEC_Y_MASK) +#define ISI_CHNL_IMG_CTRL_DEC_X_MASK (0xC00U) +#define ISI_CHNL_IMG_CTRL_DEC_X_SHIFT (10U) +#define ISI_CHNL_IMG_CTRL_DEC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_DEC_X_SHIFT)) & ISI_CHNL_IMG_CTRL_DEC_X_MASK) +#define ISI_CHNL_IMG_CTRL_DEINT_MASK (0x7000U) +#define ISI_CHNL_IMG_CTRL_DEINT_SHIFT (12U) +#define ISI_CHNL_IMG_CTRL_DEINT(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_DEINT_SHIFT)) & ISI_CHNL_IMG_CTRL_DEINT_MASK) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_EN_MASK (0x8000U) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_EN_SHIFT (15U) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_GBL_ALPHA_EN_SHIFT)) & ISI_CHNL_IMG_CTRL_GBL_ALPHA_EN_MASK) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_VAL_MASK (0xFF0000U) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_VAL_SHIFT (16U) +#define ISI_CHNL_IMG_CTRL_GBL_ALPHA_VAL(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_GBL_ALPHA_VAL_SHIFT)) & ISI_CHNL_IMG_CTRL_GBL_ALPHA_VAL_MASK) +#define ISI_CHNL_IMG_CTRL_FORMAT_MASK (0x3F000000U) +#define ISI_CHNL_IMG_CTRL_FORMAT_SHIFT (24U) +#define ISI_CHNL_IMG_CTRL_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_FORMAT_SHIFT)) & ISI_CHNL_IMG_CTRL_FORMAT_MASK) +#define ISI_CHNL_IMG_CTRL_RSVD0_MASK (0xC0000000U) +#define ISI_CHNL_IMG_CTRL_RSVD0_SHIFT (30U) +#define ISI_CHNL_IMG_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CTRL_RSVD0_SHIFT)) & ISI_CHNL_IMG_CTRL_RSVD0_MASK) + +/*! @name CHNL_OUT_BUF_CTRL - Channel Output Buffer Control Register */ +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_Y_MASK (0x3U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_Y_SHIFT (0U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_Y_SHIFT)) & ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_Y_MASK) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_U_MASK (0x18U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_U_SHIFT (3U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_U(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_U_SHIFT)) & ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_U_MASK) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_V_MASK (0xC0U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_V_SHIFT (6U) +#define ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_V(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_V_SHIFT)) & ISI_CHNL_OUT_BUF_CTRL_OFLW_PANIC_SET_THD_V_MASK) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF1_ADDR_MASK (0x4000U) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF1_ADDR_SHIFT (14U) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF1_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF1_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF1_ADDR_MASK) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF2_ADDR_MASK (0x8000U) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF2_ADDR_SHIFT (15U) +#define ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF2_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF2_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF_CTRL_LOAD_BUF2_ADDR_MASK) + +/*! @name CHNL_IMG_CFG - Channel Image Configuration */ +#define ISI_CHNL_IMG_CFG_WIDTH_MASK (0x1FFFU) +#define ISI_CHNL_IMG_CFG_WIDTH_SHIFT (0U) +#define ISI_CHNL_IMG_CFG_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CFG_WIDTH_SHIFT)) & ISI_CHNL_IMG_CFG_WIDTH_MASK) +#define ISI_CHNL_IMG_CFG_RSVD0_MASK (0xE000U) +#define ISI_CHNL_IMG_CFG_RSVD0_SHIFT (13U) +#define ISI_CHNL_IMG_CFG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CFG_RSVD0_SHIFT)) & ISI_CHNL_IMG_CFG_RSVD0_MASK) +#define ISI_CHNL_IMG_CFG_HEIGHT_MASK (0x1FFF0000U) +#define ISI_CHNL_IMG_CFG_HEIGHT_SHIFT (16U) +#define ISI_CHNL_IMG_CFG_HEIGHT(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CFG_HEIGHT_SHIFT)) & ISI_CHNL_IMG_CFG_HEIGHT_MASK) +#define ISI_CHNL_IMG_CFG_RSVD1_MASK (0xE0000000U) +#define ISI_CHNL_IMG_CFG_RSVD1_SHIFT (29U) +#define ISI_CHNL_IMG_CFG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IMG_CFG_RSVD1_SHIFT)) & ISI_CHNL_IMG_CFG_RSVD1_MASK) + +/*! @name CHNL_IER - Channel Interrupt Enable Register */ +#define ISI_CHNL_IER_RSVD0_MASK (0x3FFFU) +#define ISI_CHNL_IER_RSVD0_SHIFT (0U) +#define ISI_CHNL_IER_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_RSVD0_SHIFT)) & ISI_CHNL_IER_RSVD0_MASK) +#define ISI_CHNL_IER_LATE_VSYNC_ERR_EN_MASK (0x4000U) +#define ISI_CHNL_IER_LATE_VSYNC_ERR_EN_SHIFT (14U) +#define ISI_CHNL_IER_LATE_VSYNC_ERR_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_LATE_VSYNC_ERR_EN_SHIFT)) & ISI_CHNL_IER_LATE_VSYNC_ERR_EN_MASK) +#define ISI_CHNL_IER_EARLY_VSYNC_ERR_EN_MASK (0x8000U) +#define ISI_CHNL_IER_EARLY_VSYNC_ERR_EN_SHIFT (15U) +#define ISI_CHNL_IER_EARLY_VSYNC_ERR_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_EARLY_VSYNC_ERR_EN_SHIFT)) & ISI_CHNL_IER_EARLY_VSYNC_ERR_EN_MASK) +#define ISI_CHNL_IER_OFLW_Y_BUF_EN_MASK (0x10000U) +#define ISI_CHNL_IER_OFLW_Y_BUF_EN_SHIFT (16U) +#define ISI_CHNL_IER_OFLW_Y_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_Y_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_Y_BUF_EN_MASK) +#define ISI_CHNL_IER_EXCS_OFLW_Y_BUF_EN_MASK (0x20000U) +#define ISI_CHNL_IER_EXCS_OFLW_Y_BUF_EN_SHIFT (17U) +#define ISI_CHNL_IER_EXCS_OFLW_Y_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_EXCS_OFLW_Y_BUF_EN_SHIFT)) & ISI_CHNL_IER_EXCS_OFLW_Y_BUF_EN_MASK) +#define ISI_CHNL_IER_OFLW_PANIC_Y_BUF_EN_MASK (0x40000U) +#define ISI_CHNL_IER_OFLW_PANIC_Y_BUF_EN_SHIFT (18U) +#define ISI_CHNL_IER_OFLW_PANIC_Y_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_PANIC_Y_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_PANIC_Y_BUF_EN_MASK) +#define ISI_CHNL_IER_OFLW_U_BUF_EN_MASK (0x80000U) +#define ISI_CHNL_IER_OFLW_U_BUF_EN_SHIFT (19U) +#define ISI_CHNL_IER_OFLW_U_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_U_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_U_BUF_EN_MASK) +#define ISI_CHNL_IER_EXCS_OFLW_U_BUF_EN_MASK (0x100000U) +#define ISI_CHNL_IER_EXCS_OFLW_U_BUF_EN_SHIFT (20U) +#define ISI_CHNL_IER_EXCS_OFLW_U_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_EXCS_OFLW_U_BUF_EN_SHIFT)) & ISI_CHNL_IER_EXCS_OFLW_U_BUF_EN_MASK) +#define ISI_CHNL_IER_OFLW_PANIC_U_BUF_EN_MASK (0x200000U) +#define ISI_CHNL_IER_OFLW_PANIC_U_BUF_EN_SHIFT (21U) +#define ISI_CHNL_IER_OFLW_PANIC_U_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_PANIC_U_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_PANIC_U_BUF_EN_MASK) +#define ISI_CHNL_IER_OFLW_V_BUF_EN_MASK (0x400000U) +#define ISI_CHNL_IER_OFLW_V_BUF_EN_SHIFT (22U) +#define ISI_CHNL_IER_OFLW_V_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_V_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_V_BUF_EN_MASK) +#define ISI_CHNL_IER_EXCS_OFLW_V_BUF_EN_MASK (0x800000U) +#define ISI_CHNL_IER_EXCS_OFLW_V_BUF_EN_SHIFT (23U) +#define ISI_CHNL_IER_EXCS_OFLW_V_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_EXCS_OFLW_V_BUF_EN_SHIFT)) & ISI_CHNL_IER_EXCS_OFLW_V_BUF_EN_MASK) +#define ISI_CHNL_IER_OFLW_PANIC_V_BUF_EN_MASK (0x1000000U) +#define ISI_CHNL_IER_OFLW_PANIC_V_BUF_EN_SHIFT (24U) +#define ISI_CHNL_IER_OFLW_PANIC_V_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_OFLW_PANIC_V_BUF_EN_SHIFT)) & ISI_CHNL_IER_OFLW_PANIC_V_BUF_EN_MASK) +#define ISI_CHNL_IER_AXI_RD_ERR_EN_MASK (0x2000000U) +#define ISI_CHNL_IER_AXI_RD_ERR_EN_SHIFT (25U) +#define ISI_CHNL_IER_AXI_RD_ERR_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_AXI_RD_ERR_EN_SHIFT)) & ISI_CHNL_IER_AXI_RD_ERR_EN_MASK) +#define ISI_CHNL_IER_AXI_WR_ERR_Y_EN_MASK (0x4000000U) +#define ISI_CHNL_IER_AXI_WR_ERR_Y_EN_SHIFT (26U) +#define ISI_CHNL_IER_AXI_WR_ERR_Y_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_AXI_WR_ERR_Y_EN_SHIFT)) & ISI_CHNL_IER_AXI_WR_ERR_Y_EN_MASK) +#define ISI_CHNL_IER_AXI_WR_ERR_U_EN_MASK (0x8000000U) +#define ISI_CHNL_IER_AXI_WR_ERR_U_EN_SHIFT (27U) +#define ISI_CHNL_IER_AXI_WR_ERR_U_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_AXI_WR_ERR_U_EN_SHIFT)) & ISI_CHNL_IER_AXI_WR_ERR_U_EN_MASK) +#define ISI_CHNL_IER_AXI_WR_ERR_V_EN_MASK (0x10000000U) +#define ISI_CHNL_IER_AXI_WR_ERR_V_EN_SHIFT (28U) +#define ISI_CHNL_IER_AXI_WR_ERR_V_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_AXI_WR_ERR_V_EN_SHIFT)) & ISI_CHNL_IER_AXI_WR_ERR_V_EN_MASK) +#define ISI_CHNL_IER_FRM_RCVD_EN_MASK (0x20000000U) +#define ISI_CHNL_IER_FRM_RCVD_EN_SHIFT (29U) +#define ISI_CHNL_IER_FRM_RCVD_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_FRM_RCVD_EN_SHIFT)) & ISI_CHNL_IER_FRM_RCVD_EN_MASK) +#define ISI_CHNL_IER_LINE_RCVD_EN_MASK (0x40000000U) +#define ISI_CHNL_IER_LINE_RCVD_EN_SHIFT (30U) +#define ISI_CHNL_IER_LINE_RCVD_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_LINE_RCVD_EN_SHIFT)) & ISI_CHNL_IER_LINE_RCVD_EN_MASK) +#define ISI_CHNL_IER_MEM_RD_DONE_EN_MASK (0x80000000U) +#define ISI_CHNL_IER_MEM_RD_DONE_EN_SHIFT (31U) +#define ISI_CHNL_IER_MEM_RD_DONE_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IER_MEM_RD_DONE_EN_SHIFT)) & ISI_CHNL_IER_MEM_RD_DONE_EN_MASK) + +/*! @name CHNL_STS - Channel Status Register */ +#define ISI_CHNL_STS_OFLW_BYTES_MASK (0xFFU) +#define ISI_CHNL_STS_OFLW_BYTES_SHIFT (0U) +#define ISI_CHNL_STS_OFLW_BYTES(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_BYTES_SHIFT)) & ISI_CHNL_STS_OFLW_BYTES_MASK) +#define ISI_CHNL_STS_BUF1_ACTIVE_MASK (0x100U) +#define ISI_CHNL_STS_BUF1_ACTIVE_SHIFT (8U) +#define ISI_CHNL_STS_BUF1_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_BUF1_ACTIVE_SHIFT)) & ISI_CHNL_STS_BUF1_ACTIVE_MASK) +#define ISI_CHNL_STS_BUF2_ACTIVE_MASK (0x200U) +#define ISI_CHNL_STS_BUF2_ACTIVE_SHIFT (9U) +#define ISI_CHNL_STS_BUF2_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_BUF2_ACTIVE_SHIFT)) & ISI_CHNL_STS_BUF2_ACTIVE_MASK) +#define ISI_CHNL_STS_RSVD1_MASK (0x3C00U) +#define ISI_CHNL_STS_RSVD1_SHIFT (10U) +#define ISI_CHNL_STS_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_RSVD1_SHIFT)) & ISI_CHNL_STS_RSVD1_MASK) +#define ISI_CHNL_STS_LATE_VSYNC_ERR_MASK (0x4000U) +#define ISI_CHNL_STS_LATE_VSYNC_ERR_SHIFT (14U) +#define ISI_CHNL_STS_LATE_VSYNC_ERR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_LATE_VSYNC_ERR_SHIFT)) & ISI_CHNL_STS_LATE_VSYNC_ERR_MASK) +#define ISI_CHNL_STS_EARLY_VSYNC_ERR_MASK (0x8000U) +#define ISI_CHNL_STS_EARLY_VSYNC_ERR_SHIFT (15U) +#define ISI_CHNL_STS_EARLY_VSYNC_ERR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_EARLY_VSYNC_ERR_SHIFT)) & ISI_CHNL_STS_EARLY_VSYNC_ERR_MASK) +#define ISI_CHNL_STS_OFLW_Y_BUF_MASK (0x10000U) +#define ISI_CHNL_STS_OFLW_Y_BUF_SHIFT (16U) +#define ISI_CHNL_STS_OFLW_Y_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_Y_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_Y_BUF_MASK) +#define ISI_CHNL_STS_EXCS_OFLW_Y_BUF_MASK (0x20000U) +#define ISI_CHNL_STS_EXCS_OFLW_Y_BUF_SHIFT (17U) +#define ISI_CHNL_STS_EXCS_OFLW_Y_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_EXCS_OFLW_Y_BUF_SHIFT)) & ISI_CHNL_STS_EXCS_OFLW_Y_BUF_MASK) +#define ISI_CHNL_STS_OFLW_PANIC_Y_BUF_MASK (0x40000U) +#define ISI_CHNL_STS_OFLW_PANIC_Y_BUF_SHIFT (18U) +#define ISI_CHNL_STS_OFLW_PANIC_Y_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_PANIC_Y_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_PANIC_Y_BUF_MASK) +#define ISI_CHNL_STS_OFLW_U_BUF_MASK (0x80000U) +#define ISI_CHNL_STS_OFLW_U_BUF_SHIFT (19U) +#define ISI_CHNL_STS_OFLW_U_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_U_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_U_BUF_MASK) +#define ISI_CHNL_STS_EXCS_OFLW_U_BUF_MASK (0x100000U) +#define ISI_CHNL_STS_EXCS_OFLW_U_BUF_SHIFT (20U) +#define ISI_CHNL_STS_EXCS_OFLW_U_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_EXCS_OFLW_U_BUF_SHIFT)) & ISI_CHNL_STS_EXCS_OFLW_U_BUF_MASK) +#define ISI_CHNL_STS_OFLW_PANIC_U_BUF_MASK (0x200000U) +#define ISI_CHNL_STS_OFLW_PANIC_U_BUF_SHIFT (21U) +#define ISI_CHNL_STS_OFLW_PANIC_U_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_PANIC_U_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_PANIC_U_BUF_MASK) +#define ISI_CHNL_STS_OFLW_V_BUF_MASK (0x400000U) +#define ISI_CHNL_STS_OFLW_V_BUF_SHIFT (22U) +#define ISI_CHNL_STS_OFLW_V_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_V_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_V_BUF_MASK) +#define ISI_CHNL_STS_EXCS_OFLW_V_BUF_MASK (0x800000U) +#define ISI_CHNL_STS_EXCS_OFLW_V_BUF_SHIFT (23U) +#define ISI_CHNL_STS_EXCS_OFLW_V_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_EXCS_OFLW_V_BUF_SHIFT)) & ISI_CHNL_STS_EXCS_OFLW_V_BUF_MASK) +#define ISI_CHNL_STS_OFLW_PANIC_V_BUF_MASK (0x1000000U) +#define ISI_CHNL_STS_OFLW_PANIC_V_BUF_SHIFT (24U) +#define ISI_CHNL_STS_OFLW_PANIC_V_BUF(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_OFLW_PANIC_V_BUF_SHIFT)) & ISI_CHNL_STS_OFLW_PANIC_V_BUF_MASK) +#define ISI_CHNL_STS_AXI_RD_ERR_MASK (0x2000000U) +#define ISI_CHNL_STS_AXI_RD_ERR_SHIFT (25U) +#define ISI_CHNL_STS_AXI_RD_ERR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_AXI_RD_ERR_SHIFT)) & ISI_CHNL_STS_AXI_RD_ERR_MASK) +#define ISI_CHNL_STS_AXI_WR_ERR_Y_MASK (0x4000000U) +#define ISI_CHNL_STS_AXI_WR_ERR_Y_SHIFT (26U) +#define ISI_CHNL_STS_AXI_WR_ERR_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_AXI_WR_ERR_Y_SHIFT)) & ISI_CHNL_STS_AXI_WR_ERR_Y_MASK) +#define ISI_CHNL_STS_AXI_WR_ERR_U_MASK (0x8000000U) +#define ISI_CHNL_STS_AXI_WR_ERR_U_SHIFT (27U) +#define ISI_CHNL_STS_AXI_WR_ERR_U(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_AXI_WR_ERR_U_SHIFT)) & ISI_CHNL_STS_AXI_WR_ERR_U_MASK) +#define ISI_CHNL_STS_AXI_WR_ERR_V_MASK (0x10000000U) +#define ISI_CHNL_STS_AXI_WR_ERR_V_SHIFT (28U) +#define ISI_CHNL_STS_AXI_WR_ERR_V(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_AXI_WR_ERR_V_SHIFT)) & ISI_CHNL_STS_AXI_WR_ERR_V_MASK) +#define ISI_CHNL_STS_FRM_STRD_MASK (0x20000000U) +#define ISI_CHNL_STS_FRM_STRD_SHIFT (29U) +#define ISI_CHNL_STS_FRM_STRD(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_FRM_STRD_SHIFT)) & ISI_CHNL_STS_FRM_STRD_MASK) +#define ISI_CHNL_STS_LINE_STRD_MASK (0x40000000U) +#define ISI_CHNL_STS_LINE_STRD_SHIFT (30U) +#define ISI_CHNL_STS_LINE_STRD(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_LINE_STRD_SHIFT)) & ISI_CHNL_STS_LINE_STRD_MASK) +#define ISI_CHNL_STS_MEM_RD_DONE_MASK (0x80000000U) +#define ISI_CHNL_STS_MEM_RD_DONE_SHIFT (31U) +#define ISI_CHNL_STS_MEM_RD_DONE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_STS_MEM_RD_DONE_SHIFT)) & ISI_CHNL_STS_MEM_RD_DONE_MASK) + +/*! @name CHNL_SCALE_FACTOR - Channel Scale Factor Register */ +#define ISI_CHNL_SCALE_FACTOR_X_SCALE_MASK (0x3FFFU) +#define ISI_CHNL_SCALE_FACTOR_X_SCALE_SHIFT (0U) +#define ISI_CHNL_SCALE_FACTOR_X_SCALE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_FACTOR_X_SCALE_SHIFT)) & ISI_CHNL_SCALE_FACTOR_X_SCALE_MASK) +#define ISI_CHNL_SCALE_FACTOR_RSVD1_MASK (0xC000U) +#define ISI_CHNL_SCALE_FACTOR_RSVD1_SHIFT (14U) +#define ISI_CHNL_SCALE_FACTOR_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_FACTOR_RSVD1_SHIFT)) & ISI_CHNL_SCALE_FACTOR_RSVD1_MASK) +#define ISI_CHNL_SCALE_FACTOR_Y_SCALE_MASK (0x3FFF0000U) +#define ISI_CHNL_SCALE_FACTOR_Y_SCALE_SHIFT (16U) +#define ISI_CHNL_SCALE_FACTOR_Y_SCALE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_FACTOR_Y_SCALE_SHIFT)) & ISI_CHNL_SCALE_FACTOR_Y_SCALE_MASK) +#define ISI_CHNL_SCALE_FACTOR_RSVD0_MASK (0xC0000000U) +#define ISI_CHNL_SCALE_FACTOR_RSVD0_SHIFT (30U) +#define ISI_CHNL_SCALE_FACTOR_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_FACTOR_RSVD0_SHIFT)) & ISI_CHNL_SCALE_FACTOR_RSVD0_MASK) + +/*! @name CHNL_SCALE_OFFSET - Channel Scale Offset Register */ +#define ISI_CHNL_SCALE_OFFSET_X_OFFSET_MASK (0xFFFU) +#define ISI_CHNL_SCALE_OFFSET_X_OFFSET_SHIFT (0U) +#define ISI_CHNL_SCALE_OFFSET_X_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_OFFSET_X_OFFSET_SHIFT)) & ISI_CHNL_SCALE_OFFSET_X_OFFSET_MASK) +#define ISI_CHNL_SCALE_OFFSET_RSVD1_MASK (0xF000U) +#define ISI_CHNL_SCALE_OFFSET_RSVD1_SHIFT (12U) +#define ISI_CHNL_SCALE_OFFSET_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_OFFSET_RSVD1_SHIFT)) & ISI_CHNL_SCALE_OFFSET_RSVD1_MASK) +#define ISI_CHNL_SCALE_OFFSET_Y_OFFSET_MASK (0xFFF0000U) +#define ISI_CHNL_SCALE_OFFSET_Y_OFFSET_SHIFT (16U) +#define ISI_CHNL_SCALE_OFFSET_Y_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_OFFSET_Y_OFFSET_SHIFT)) & ISI_CHNL_SCALE_OFFSET_Y_OFFSET_MASK) +#define ISI_CHNL_SCALE_OFFSET_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_SCALE_OFFSET_RSVD0_SHIFT (28U) +#define ISI_CHNL_SCALE_OFFSET_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCALE_OFFSET_RSVD0_SHIFT)) & ISI_CHNL_SCALE_OFFSET_RSVD0_MASK) + +/*! @name CHNL_CROP_ULC - Channel Crop Upper Left Corner Coordinate Register */ +#define ISI_CHNL_CROP_ULC_Y_MASK (0xFFFU) +#define ISI_CHNL_CROP_ULC_Y_SHIFT (0U) +#define ISI_CHNL_CROP_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_ULC_Y_SHIFT)) & ISI_CHNL_CROP_ULC_Y_MASK) +#define ISI_CHNL_CROP_ULC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_CROP_ULC_RSVD1_SHIFT (12U) +#define ISI_CHNL_CROP_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_ULC_RSVD1_SHIFT)) & ISI_CHNL_CROP_ULC_RSVD1_MASK) +#define ISI_CHNL_CROP_ULC_X_MASK (0xFFF0000U) +#define ISI_CHNL_CROP_ULC_X_SHIFT (16U) +#define ISI_CHNL_CROP_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_ULC_X_SHIFT)) & ISI_CHNL_CROP_ULC_X_MASK) +#define ISI_CHNL_CROP_ULC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_CROP_ULC_RSVD0_SHIFT (28U) +#define ISI_CHNL_CROP_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_ULC_RSVD0_SHIFT)) & ISI_CHNL_CROP_ULC_RSVD0_MASK) + +/*! @name CHNL_CROP_LRC - Channel Crop Lower Right Corner Coordinate Register */ +#define ISI_CHNL_CROP_LRC_Y_MASK (0xFFFU) +#define ISI_CHNL_CROP_LRC_Y_SHIFT (0U) +#define ISI_CHNL_CROP_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_LRC_Y_SHIFT)) & ISI_CHNL_CROP_LRC_Y_MASK) +#define ISI_CHNL_CROP_LRC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_CROP_LRC_RSVD1_SHIFT (12U) +#define ISI_CHNL_CROP_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_LRC_RSVD1_SHIFT)) & ISI_CHNL_CROP_LRC_RSVD1_MASK) +#define ISI_CHNL_CROP_LRC_X_MASK (0xFFF0000U) +#define ISI_CHNL_CROP_LRC_X_SHIFT (16U) +#define ISI_CHNL_CROP_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_LRC_X_SHIFT)) & ISI_CHNL_CROP_LRC_X_MASK) +#define ISI_CHNL_CROP_LRC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_CROP_LRC_RSVD0_SHIFT (28U) +#define ISI_CHNL_CROP_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CROP_LRC_RSVD0_SHIFT)) & ISI_CHNL_CROP_LRC_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF0 - Channel Color Space Conversion Coefficient Register 0 */ +#define ISI_CHNL_CSC_COEFF0_A1_MASK (0x7FFU) +#define ISI_CHNL_CSC_COEFF0_A1_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF0_A1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF0_A1_SHIFT)) & ISI_CHNL_CSC_COEFF0_A1_MASK) +#define ISI_CHNL_CSC_COEFF0_RSVD1_MASK (0xF800U) +#define ISI_CHNL_CSC_COEFF0_RSVD1_SHIFT (11U) +#define ISI_CHNL_CSC_COEFF0_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF0_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF0_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF0_A2_MASK (0x7FF0000U) +#define ISI_CHNL_CSC_COEFF0_A2_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF0_A2(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF0_A2_SHIFT)) & ISI_CHNL_CSC_COEFF0_A2_MASK) +#define ISI_CHNL_CSC_COEFF0_RSVD0_MASK (0xF8000000U) +#define ISI_CHNL_CSC_COEFF0_RSVD0_SHIFT (27U) +#define ISI_CHNL_CSC_COEFF0_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF0_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF0_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF1 - Channel Color Space Conversion Coefficient Register 1 */ +#define ISI_CHNL_CSC_COEFF1_A3_MASK (0x7FFU) +#define ISI_CHNL_CSC_COEFF1_A3_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF1_A3(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF1_A3_SHIFT)) & ISI_CHNL_CSC_COEFF1_A3_MASK) +#define ISI_CHNL_CSC_COEFF1_RSVD1_MASK (0xF800U) +#define ISI_CHNL_CSC_COEFF1_RSVD1_SHIFT (11U) +#define ISI_CHNL_CSC_COEFF1_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF1_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF1_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF1_B1_MASK (0x7FF0000U) +#define ISI_CHNL_CSC_COEFF1_B1_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF1_B1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF1_B1_SHIFT)) & ISI_CHNL_CSC_COEFF1_B1_MASK) +#define ISI_CHNL_CSC_COEFF1_RSVD0_MASK (0xF8000000U) +#define ISI_CHNL_CSC_COEFF1_RSVD0_SHIFT (27U) +#define ISI_CHNL_CSC_COEFF1_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF1_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF1_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF2 - Channel Color Space Conversion Coefficient Register 2 */ +#define ISI_CHNL_CSC_COEFF2_B2_MASK (0x7FFU) +#define ISI_CHNL_CSC_COEFF2_B2_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF2_B2(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF2_B2_SHIFT)) & ISI_CHNL_CSC_COEFF2_B2_MASK) +#define ISI_CHNL_CSC_COEFF2_RSVD1_MASK (0xF800U) +#define ISI_CHNL_CSC_COEFF2_RSVD1_SHIFT (11U) +#define ISI_CHNL_CSC_COEFF2_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF2_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF2_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF2_B3_MASK (0x7FF0000U) +#define ISI_CHNL_CSC_COEFF2_B3_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF2_B3(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF2_B3_SHIFT)) & ISI_CHNL_CSC_COEFF2_B3_MASK) +#define ISI_CHNL_CSC_COEFF2_RSVD0_MASK (0xF8000000U) +#define ISI_CHNL_CSC_COEFF2_RSVD0_SHIFT (27U) +#define ISI_CHNL_CSC_COEFF2_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF2_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF2_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF3 - Channel Color Space Conversion Coefficient Register 3 */ +#define ISI_CHNL_CSC_COEFF3_C1_MASK (0x7FFU) +#define ISI_CHNL_CSC_COEFF3_C1_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF3_C1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF3_C1_SHIFT)) & ISI_CHNL_CSC_COEFF3_C1_MASK) +#define ISI_CHNL_CSC_COEFF3_RSVD1_MASK (0xF800U) +#define ISI_CHNL_CSC_COEFF3_RSVD1_SHIFT (11U) +#define ISI_CHNL_CSC_COEFF3_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF3_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF3_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF3_C2_MASK (0x7FF0000U) +#define ISI_CHNL_CSC_COEFF3_C2_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF3_C2(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF3_C2_SHIFT)) & ISI_CHNL_CSC_COEFF3_C2_MASK) +#define ISI_CHNL_CSC_COEFF3_RSVD0_MASK (0xF8000000U) +#define ISI_CHNL_CSC_COEFF3_RSVD0_SHIFT (27U) +#define ISI_CHNL_CSC_COEFF3_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF3_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF3_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF4 - Channel Color Space Conversion Coefficient Register 4 */ +#define ISI_CHNL_CSC_COEFF4_C3_MASK (0x7FFU) +#define ISI_CHNL_CSC_COEFF4_C3_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF4_C3(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF4_C3_SHIFT)) & ISI_CHNL_CSC_COEFF4_C3_MASK) +#define ISI_CHNL_CSC_COEFF4_RSVD1_MASK (0xF800U) +#define ISI_CHNL_CSC_COEFF4_RSVD1_SHIFT (11U) +#define ISI_CHNL_CSC_COEFF4_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF4_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF4_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF4_D1_MASK (0x1FF0000U) +#define ISI_CHNL_CSC_COEFF4_D1_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF4_D1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF4_D1_SHIFT)) & ISI_CHNL_CSC_COEFF4_D1_MASK) +#define ISI_CHNL_CSC_COEFF4_RSVD0_MASK (0xFE000000U) +#define ISI_CHNL_CSC_COEFF4_RSVD0_SHIFT (25U) +#define ISI_CHNL_CSC_COEFF4_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF4_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF4_RSVD0_MASK) + +/*! @name CHNL_CSC_COEFF5 - Channel Color Space Conversion Coefficient Register 5 */ +#define ISI_CHNL_CSC_COEFF5_D2_MASK (0x1FFU) +#define ISI_CHNL_CSC_COEFF5_D2_SHIFT (0U) +#define ISI_CHNL_CSC_COEFF5_D2(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF5_D2_SHIFT)) & ISI_CHNL_CSC_COEFF5_D2_MASK) +#define ISI_CHNL_CSC_COEFF5_RSVD1_MASK (0xFE00U) +#define ISI_CHNL_CSC_COEFF5_RSVD1_SHIFT (9U) +#define ISI_CHNL_CSC_COEFF5_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF5_RSVD1_SHIFT)) & ISI_CHNL_CSC_COEFF5_RSVD1_MASK) +#define ISI_CHNL_CSC_COEFF5_D3_MASK (0x1FF0000U) +#define ISI_CHNL_CSC_COEFF5_D3_SHIFT (16U) +#define ISI_CHNL_CSC_COEFF5_D3(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF5_D3_SHIFT)) & ISI_CHNL_CSC_COEFF5_D3_MASK) +#define ISI_CHNL_CSC_COEFF5_RSVD0_MASK (0xFE000000U) +#define ISI_CHNL_CSC_COEFF5_RSVD0_SHIFT (25U) +#define ISI_CHNL_CSC_COEFF5_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_CSC_COEFF5_RSVD0_SHIFT)) & ISI_CHNL_CSC_COEFF5_RSVD0_MASK) + +/*! @name CHNL_ROI_0_ALPHA - Channel Alpha Value Register for Region of Interest 0 */ +#define ISI_CHNL_ROI_0_ALPHA_RSVD1_MASK (0xFFFFU) +#define ISI_CHNL_ROI_0_ALPHA_RSVD1_SHIFT (0U) +#define ISI_CHNL_ROI_0_ALPHA_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ALPHA_RSVD1_SHIFT)) & ISI_CHNL_ROI_0_ALPHA_RSVD1_MASK) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA_EN_MASK (0x10000U) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA_EN_SHIFT (16U) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ALPHA_ALPHA_EN_SHIFT)) & ISI_CHNL_ROI_0_ALPHA_ALPHA_EN_MASK) +#define ISI_CHNL_ROI_0_ALPHA_RSVD0_MASK (0xFE0000U) +#define ISI_CHNL_ROI_0_ALPHA_RSVD0_SHIFT (17U) +#define ISI_CHNL_ROI_0_ALPHA_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ALPHA_RSVD0_SHIFT)) & ISI_CHNL_ROI_0_ALPHA_RSVD0_MASK) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA_MASK (0xFF000000U) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA_SHIFT (24U) +#define ISI_CHNL_ROI_0_ALPHA_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ALPHA_ALPHA_SHIFT)) & ISI_CHNL_ROI_0_ALPHA_ALPHA_MASK) + +/*! @name CHNL_ROI_0_ULC - Channel Upper Left Coordinate Register for Region of Interest 0 */ +#define ISI_CHNL_ROI_0_ULC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_0_ULC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_0_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ULC_Y_SHIFT)) & ISI_CHNL_ROI_0_ULC_Y_MASK) +#define ISI_CHNL_ROI_0_ULC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_0_ULC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_0_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ULC_RSVD1_SHIFT)) & ISI_CHNL_ROI_0_ULC_RSVD1_MASK) +#define ISI_CHNL_ROI_0_ULC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_0_ULC_X_SHIFT (16U) +#define ISI_CHNL_ROI_0_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ULC_X_SHIFT)) & ISI_CHNL_ROI_0_ULC_X_MASK) +#define ISI_CHNL_ROI_0_ULC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_0_ULC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_0_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_ULC_RSVD0_SHIFT)) & ISI_CHNL_ROI_0_ULC_RSVD0_MASK) + +/*! @name CHNL_ROI_0_LRC - Channel Lower Right Coordinate Register for Region of Interest 0 */ +#define ISI_CHNL_ROI_0_LRC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_0_LRC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_0_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_LRC_Y_SHIFT)) & ISI_CHNL_ROI_0_LRC_Y_MASK) +#define ISI_CHNL_ROI_0_LRC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_0_LRC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_0_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_LRC_RSVD1_SHIFT)) & ISI_CHNL_ROI_0_LRC_RSVD1_MASK) +#define ISI_CHNL_ROI_0_LRC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_0_LRC_X_SHIFT (16U) +#define ISI_CHNL_ROI_0_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_LRC_X_SHIFT)) & ISI_CHNL_ROI_0_LRC_X_MASK) +#define ISI_CHNL_ROI_0_LRC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_0_LRC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_0_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_0_LRC_RSVD0_SHIFT)) & ISI_CHNL_ROI_0_LRC_RSVD0_MASK) + +/*! @name CHNL_ROI_1_ALPHA - Channel Alpha Value Register for Region of Interest 1 */ +#define ISI_CHNL_ROI_1_ALPHA_RSVD1_MASK (0xFFFFU) +#define ISI_CHNL_ROI_1_ALPHA_RSVD1_SHIFT (0U) +#define ISI_CHNL_ROI_1_ALPHA_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ALPHA_RSVD1_SHIFT)) & ISI_CHNL_ROI_1_ALPHA_RSVD1_MASK) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA_EN_MASK (0x10000U) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA_EN_SHIFT (16U) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ALPHA_ALPHA_EN_SHIFT)) & ISI_CHNL_ROI_1_ALPHA_ALPHA_EN_MASK) +#define ISI_CHNL_ROI_1_ALPHA_RSVD0_MASK (0xFE0000U) +#define ISI_CHNL_ROI_1_ALPHA_RSVD0_SHIFT (17U) +#define ISI_CHNL_ROI_1_ALPHA_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ALPHA_RSVD0_SHIFT)) & ISI_CHNL_ROI_1_ALPHA_RSVD0_MASK) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA_MASK (0xFF000000U) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA_SHIFT (24U) +#define ISI_CHNL_ROI_1_ALPHA_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ALPHA_ALPHA_SHIFT)) & ISI_CHNL_ROI_1_ALPHA_ALPHA_MASK) + +/*! @name CHNL_ROI_1_ULC - Channel Upper Left Coordinate Register for Region of Interest 1 */ +#define ISI_CHNL_ROI_1_ULC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_1_ULC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_1_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ULC_Y_SHIFT)) & ISI_CHNL_ROI_1_ULC_Y_MASK) +#define ISI_CHNL_ROI_1_ULC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_1_ULC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_1_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ULC_RSVD1_SHIFT)) & ISI_CHNL_ROI_1_ULC_RSVD1_MASK) +#define ISI_CHNL_ROI_1_ULC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_1_ULC_X_SHIFT (16U) +#define ISI_CHNL_ROI_1_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ULC_X_SHIFT)) & ISI_CHNL_ROI_1_ULC_X_MASK) +#define ISI_CHNL_ROI_1_ULC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_1_ULC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_1_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_ULC_RSVD0_SHIFT)) & ISI_CHNL_ROI_1_ULC_RSVD0_MASK) + +/*! @name CHNL_ROI_1_LRC - Channel Lower Right Coordinate Register for Region of Interest 1 */ +#define ISI_CHNL_ROI_1_LRC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_1_LRC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_1_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_LRC_Y_SHIFT)) & ISI_CHNL_ROI_1_LRC_Y_MASK) +#define ISI_CHNL_ROI_1_LRC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_1_LRC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_1_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_LRC_RSVD1_SHIFT)) & ISI_CHNL_ROI_1_LRC_RSVD1_MASK) +#define ISI_CHNL_ROI_1_LRC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_1_LRC_X_SHIFT (16U) +#define ISI_CHNL_ROI_1_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_LRC_X_SHIFT)) & ISI_CHNL_ROI_1_LRC_X_MASK) +#define ISI_CHNL_ROI_1_LRC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_1_LRC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_1_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_1_LRC_RSVD0_SHIFT)) & ISI_CHNL_ROI_1_LRC_RSVD0_MASK) + +/*! @name CHNL_ROI_2_ALPHA - Channel Alpha Value Register for Region of Interest 2 */ +#define ISI_CHNL_ROI_2_ALPHA_RSVD1_MASK (0xFFFFU) +#define ISI_CHNL_ROI_2_ALPHA_RSVD1_SHIFT (0U) +#define ISI_CHNL_ROI_2_ALPHA_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ALPHA_RSVD1_SHIFT)) & ISI_CHNL_ROI_2_ALPHA_RSVD1_MASK) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA_EN_MASK (0x10000U) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA_EN_SHIFT (16U) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ALPHA_ALPHA_EN_SHIFT)) & ISI_CHNL_ROI_2_ALPHA_ALPHA_EN_MASK) +#define ISI_CHNL_ROI_2_ALPHA_RSVD0_MASK (0xFE0000U) +#define ISI_CHNL_ROI_2_ALPHA_RSVD0_SHIFT (17U) +#define ISI_CHNL_ROI_2_ALPHA_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ALPHA_RSVD0_SHIFT)) & ISI_CHNL_ROI_2_ALPHA_RSVD0_MASK) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA_MASK (0xFF000000U) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA_SHIFT (24U) +#define ISI_CHNL_ROI_2_ALPHA_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ALPHA_ALPHA_SHIFT)) & ISI_CHNL_ROI_2_ALPHA_ALPHA_MASK) + +/*! @name CHNL_ROI_2_ULC - Channel Upper Left Coordinate Register for Region of Interest 2 */ +#define ISI_CHNL_ROI_2_ULC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_2_ULC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_2_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ULC_Y_SHIFT)) & ISI_CHNL_ROI_2_ULC_Y_MASK) +#define ISI_CHNL_ROI_2_ULC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_2_ULC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_2_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ULC_RSVD1_SHIFT)) & ISI_CHNL_ROI_2_ULC_RSVD1_MASK) +#define ISI_CHNL_ROI_2_ULC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_2_ULC_X_SHIFT (16U) +#define ISI_CHNL_ROI_2_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ULC_X_SHIFT)) & ISI_CHNL_ROI_2_ULC_X_MASK) +#define ISI_CHNL_ROI_2_ULC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_2_ULC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_2_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_ULC_RSVD0_SHIFT)) & ISI_CHNL_ROI_2_ULC_RSVD0_MASK) + +/*! @name CHNL_ROI_2_LRC - Channel Lower Right Coordinate Register for Region of Interest 2 */ +#define ISI_CHNL_ROI_2_LRC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_2_LRC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_2_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_LRC_Y_SHIFT)) & ISI_CHNL_ROI_2_LRC_Y_MASK) +#define ISI_CHNL_ROI_2_LRC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_2_LRC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_2_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_LRC_RSVD1_SHIFT)) & ISI_CHNL_ROI_2_LRC_RSVD1_MASK) +#define ISI_CHNL_ROI_2_LRC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_2_LRC_X_SHIFT (16U) +#define ISI_CHNL_ROI_2_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_LRC_X_SHIFT)) & ISI_CHNL_ROI_2_LRC_X_MASK) +#define ISI_CHNL_ROI_2_LRC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_2_LRC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_2_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_2_LRC_RSVD0_SHIFT)) & ISI_CHNL_ROI_2_LRC_RSVD0_MASK) + +/*! @name CHNL_ROI_3_ALPHA - Channel Alpha Value Register for Region of Interest 3 */ +#define ISI_CHNL_ROI_3_ALPHA_RSVD1_MASK (0xFFFFU) +#define ISI_CHNL_ROI_3_ALPHA_RSVD1_SHIFT (0U) +#define ISI_CHNL_ROI_3_ALPHA_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ALPHA_RSVD1_SHIFT)) & ISI_CHNL_ROI_3_ALPHA_RSVD1_MASK) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA_EN_MASK (0x10000U) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA_EN_SHIFT (16U) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA_EN(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ALPHA_ALPHA_EN_SHIFT)) & ISI_CHNL_ROI_3_ALPHA_ALPHA_EN_MASK) +#define ISI_CHNL_ROI_3_ALPHA_RSVD0_MASK (0xFE0000U) +#define ISI_CHNL_ROI_3_ALPHA_RSVD0_SHIFT (17U) +#define ISI_CHNL_ROI_3_ALPHA_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ALPHA_RSVD0_SHIFT)) & ISI_CHNL_ROI_3_ALPHA_RSVD0_MASK) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA_MASK (0xFF000000U) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA_SHIFT (24U) +#define ISI_CHNL_ROI_3_ALPHA_ALPHA(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ALPHA_ALPHA_SHIFT)) & ISI_CHNL_ROI_3_ALPHA_ALPHA_MASK) + +/*! @name CHNL_ROI_3_ULC - Channel Upper Left Coordinate Register for Region of Interest 3 */ +#define ISI_CHNL_ROI_3_ULC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_3_ULC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_3_ULC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ULC_Y_SHIFT)) & ISI_CHNL_ROI_3_ULC_Y_MASK) +#define ISI_CHNL_ROI_3_ULC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_3_ULC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_3_ULC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ULC_RSVD1_SHIFT)) & ISI_CHNL_ROI_3_ULC_RSVD1_MASK) +#define ISI_CHNL_ROI_3_ULC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_3_ULC_X_SHIFT (16U) +#define ISI_CHNL_ROI_3_ULC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ULC_X_SHIFT)) & ISI_CHNL_ROI_3_ULC_X_MASK) +#define ISI_CHNL_ROI_3_ULC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_3_ULC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_3_ULC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_ULC_RSVD0_SHIFT)) & ISI_CHNL_ROI_3_ULC_RSVD0_MASK) + +/*! @name CHNL_ROI_3_LRC - Channel Lower Right Coordinate Register for Region of Interest 3 */ +#define ISI_CHNL_ROI_3_LRC_Y_MASK (0xFFFU) +#define ISI_CHNL_ROI_3_LRC_Y_SHIFT (0U) +#define ISI_CHNL_ROI_3_LRC_Y(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_LRC_Y_SHIFT)) & ISI_CHNL_ROI_3_LRC_Y_MASK) +#define ISI_CHNL_ROI_3_LRC_RSVD1_MASK (0xF000U) +#define ISI_CHNL_ROI_3_LRC_RSVD1_SHIFT (12U) +#define ISI_CHNL_ROI_3_LRC_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_LRC_RSVD1_SHIFT)) & ISI_CHNL_ROI_3_LRC_RSVD1_MASK) +#define ISI_CHNL_ROI_3_LRC_X_MASK (0xFFF0000U) +#define ISI_CHNL_ROI_3_LRC_X_SHIFT (16U) +#define ISI_CHNL_ROI_3_LRC_X(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_LRC_X_SHIFT)) & ISI_CHNL_ROI_3_LRC_X_MASK) +#define ISI_CHNL_ROI_3_LRC_RSVD0_MASK (0xF0000000U) +#define ISI_CHNL_ROI_3_LRC_RSVD0_SHIFT (28U) +#define ISI_CHNL_ROI_3_LRC_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_ROI_3_LRC_RSVD0_SHIFT)) & ISI_CHNL_ROI_3_LRC_RSVD0_MASK) + +/*! @name CHNL_OUT_BUF1_ADDR_Y - Channel RGB or Luma (Y) Output Buffer 1 Address */ +#define ISI_CHNL_OUT_BUF1_ADDR_Y_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF1_ADDR_Y_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF1_ADDR_Y_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF1_ADDR_Y_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF1_ADDR_Y_ADDR_MASK) + +/*! @name CHNL_OUT_BUF1_ADDR_U - Channel Chroma (U/Cb/UV/CbCr) Output Buffer 1 Address */ +#define ISI_CHNL_OUT_BUF1_ADDR_U_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF1_ADDR_U_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF1_ADDR_U_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF1_ADDR_U_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF1_ADDR_U_ADDR_MASK) + +/*! @name CHNL_OUT_BUF1_ADDR_V - Channel Chroma (V/Cr) Output Buffer 1 Address */ +#define ISI_CHNL_OUT_BUF1_ADDR_V_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF1_ADDR_V_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF1_ADDR_V_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF1_ADDR_V_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF1_ADDR_V_ADDR_MASK) + +/*! @name CHNL_OUT_BUF_PITCH - Channel Output Buffer Pitch */ +#define ISI_CHNL_OUT_BUF_PITCH_LINE_PITCH_MASK (0xFFFFU) +#define ISI_CHNL_OUT_BUF_PITCH_LINE_PITCH_SHIFT (0U) +#define ISI_CHNL_OUT_BUF_PITCH_LINE_PITCH(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF_PITCH_LINE_PITCH_SHIFT)) & ISI_CHNL_OUT_BUF_PITCH_LINE_PITCH_MASK) + +/*! @name CHNL_IN_BUF_ADDR - Channel Input Buffer Address */ +#define ISI_CHNL_IN_BUF_ADDR_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_IN_BUF_ADDR_ADDR_SHIFT (0U) +#define ISI_CHNL_IN_BUF_ADDR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IN_BUF_ADDR_ADDR_SHIFT)) & ISI_CHNL_IN_BUF_ADDR_ADDR_MASK) + +/*! @name CHNL_IN_BUF_PITCH - Channel Input Buffer Pitch */ +#define ISI_CHNL_IN_BUF_PITCH_LINE_PITCH_MASK (0xFFFFU) +#define ISI_CHNL_IN_BUF_PITCH_LINE_PITCH_SHIFT (0U) +#define ISI_CHNL_IN_BUF_PITCH_LINE_PITCH(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IN_BUF_PITCH_LINE_PITCH_SHIFT)) & ISI_CHNL_IN_BUF_PITCH_LINE_PITCH_MASK) +#define ISI_CHNL_IN_BUF_PITCH_FRM_PITCH_MASK (0xFFFF0000U) +#define ISI_CHNL_IN_BUF_PITCH_FRM_PITCH_SHIFT (16U) +#define ISI_CHNL_IN_BUF_PITCH_FRM_PITCH(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_IN_BUF_PITCH_FRM_PITCH_SHIFT)) & ISI_CHNL_IN_BUF_PITCH_FRM_PITCH_MASK) + +/*! @name CHNL_MEM_RD_CTRL - Channel Memory Read Control */ +#define ISI_CHNL_MEM_RD_CTRL_READ_MEM_MASK (0x1U) +#define ISI_CHNL_MEM_RD_CTRL_READ_MEM_SHIFT (0U) +#define ISI_CHNL_MEM_RD_CTRL_READ_MEM(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_MEM_RD_CTRL_READ_MEM_SHIFT)) & ISI_CHNL_MEM_RD_CTRL_READ_MEM_MASK) +#define ISI_CHNL_MEM_RD_CTRL_RSVD0_MASK (0xFFFFFFEU) +#define ISI_CHNL_MEM_RD_CTRL_RSVD0_SHIFT (1U) +#define ISI_CHNL_MEM_RD_CTRL_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_MEM_RD_CTRL_RSVD0_SHIFT)) & ISI_CHNL_MEM_RD_CTRL_RSVD0_MASK) +#define ISI_CHNL_MEM_RD_CTRL_IMG_TYPE_MASK (0xF0000000U) +#define ISI_CHNL_MEM_RD_CTRL_IMG_TYPE_SHIFT (28U) +#define ISI_CHNL_MEM_RD_CTRL_IMG_TYPE(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_MEM_RD_CTRL_IMG_TYPE_SHIFT)) & ISI_CHNL_MEM_RD_CTRL_IMG_TYPE_MASK) + +/*! @name CHNL_OUT_BUF2_ADDR_Y - Channel RGB or Luma (Y) Output Buffer 2 Address */ +#define ISI_CHNL_OUT_BUF2_ADDR_Y_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF2_ADDR_Y_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF2_ADDR_Y_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF2_ADDR_Y_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF2_ADDR_Y_ADDR_MASK) + +/*! @name CHNL_OUT_BUF2_ADDR_U - Channel Chroma (U/Cb/UV/CbCr) Output Buffer 2 Address */ +#define ISI_CHNL_OUT_BUF2_ADDR_U_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF2_ADDR_U_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF2_ADDR_U_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF2_ADDR_U_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF2_ADDR_U_ADDR_MASK) + +/*! @name CHNL_OUT_BUF2_ADDR_V - Channel Chroma (V/Cr) Output Buffer 2 Address */ +#define ISI_CHNL_OUT_BUF2_ADDR_V_ADDR_MASK (0xFFFFFFFFU) +#define ISI_CHNL_OUT_BUF2_ADDR_V_ADDR_SHIFT (0U) +#define ISI_CHNL_OUT_BUF2_ADDR_V_ADDR(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_OUT_BUF2_ADDR_V_ADDR_SHIFT)) & ISI_CHNL_OUT_BUF2_ADDR_V_ADDR_MASK) + +/*! @name CHNL_SCL_IMG_CFG - Channel Scaled Image Configuration */ +#define ISI_CHNL_SCL_IMG_CFG_WIDTH_MASK (0x1FFFU) +#define ISI_CHNL_SCL_IMG_CFG_WIDTH_SHIFT (0U) +#define ISI_CHNL_SCL_IMG_CFG_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCL_IMG_CFG_WIDTH_SHIFT)) & ISI_CHNL_SCL_IMG_CFG_WIDTH_MASK) +#define ISI_CHNL_SCL_IMG_CFG_RSVD0_MASK (0xE000U) +#define ISI_CHNL_SCL_IMG_CFG_RSVD0_SHIFT (13U) +#define ISI_CHNL_SCL_IMG_CFG_RSVD0(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCL_IMG_CFG_RSVD0_SHIFT)) & ISI_CHNL_SCL_IMG_CFG_RSVD0_MASK) +#define ISI_CHNL_SCL_IMG_CFG_HEIGHT_MASK (0x1FFF0000U) +#define ISI_CHNL_SCL_IMG_CFG_HEIGHT_SHIFT (16U) +#define ISI_CHNL_SCL_IMG_CFG_HEIGHT(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCL_IMG_CFG_HEIGHT_SHIFT)) & ISI_CHNL_SCL_IMG_CFG_HEIGHT_MASK) +#define ISI_CHNL_SCL_IMG_CFG_RSVD1_MASK (0xE0000000U) +#define ISI_CHNL_SCL_IMG_CFG_RSVD1_SHIFT (29U) +#define ISI_CHNL_SCL_IMG_CFG_RSVD1(x) (((uint32_t)(((uint32_t)(x)) << ISI_CHNL_SCL_IMG_CFG_RSVD1_SHIFT)) & ISI_CHNL_SCL_IMG_CFG_RSVD1_MASK) + + +/*! + * @} + */ /* end of group ISI_Register_Masks */ + + +/** Peripheral ISI base pointers */ +#define ISI0 ((ISI_Type *)ISI0_BASE) +#define ISI1 ((ISI_Type *)ISI1_BASE) +#define ISI2 ((ISI_Type *)ISI2_BASE) +#define ISI3 ((ISI_Type *)ISI3_BASE) +#define ISI4 ((ISI_Type *)ISI4_BASE) +#define ISI5 ((ISI_Type *)ISI5_BASE) +#define ISI6 ((ISI_Type *)ISI6_BASE) +#define ISI7 ((ISI_Type *)ISI7_BASE) +#define ISI8 ((ISI_Type *)ISI8_BASE) +#define ISI9 ((ISI_Type *)ISI9_BASE) +#define ISI10 ((ISI_Type *)ISI10_BASE) +#define ISI11 ((ISI_Type *)ISI11_BASE) +#define ISI12 ((ISI_Type *)ISI12_BASE) +#define ISI13 ((ISI_Type *)ISI13_BASE) +#define ISI14 ((ISI_Type *)ISI14_BASE) +#define ISI15 ((ISI_Type *)ISI15_BASE) +#define ISI16 ((ISI_Type *)ISI16_BASE) +#define ISI17 ((ISI_Type *)ISI17_BASE) +#define ISI18 ((ISI_Type *)ISI18_BASE) +#define ISI19 ((ISI_Type *)ISI19_BASE) +#define ISI20 ((ISI_Type *)ISI20_BASE) +#define ISI21 ((ISI_Type *)ISI21_BASE) +#define ISI22 ((ISI_Type *)ISI22_BASE) +#define ISI23 ((ISI_Type *)ISI23_BASE) + +/** Array initializer of ISI peripheral base addresses */ +#define ISI_BASE_ADDRS { ISI0_BASE, ISI1_BASE, \ + ISI2_BASE, ISI3_BASE, \ + ISI4_BASE, ISI5_BASE, \ + ISI6_BASE, ISI7_BASE, \ + ISI8_BASE, ISI9_BASE, \ + ISI10_BASE, ISI11_BASE, \ + ISI12_BASE, ISI13_BASE, \ + ISI14_BASE, ISI15_BASE, \ + ISI16_BASE, ISI17_BASE, \ + ISI18_BASE, ISI19_BASE, \ + ISI20_BASE, ISI21_BASE, \ + ISI22_BASE, ISI23_BASE } + + +/** Array initializer of ISI peripheral base pointers */ +#define ISI_BASE_PTRS { ISI0, ISI1, ISI2, ISI3, \ + ISI4, ISI5, ISI6, ISI7, \ + ISI8, ISI9, ISI10, ISI11, \ + ISI12, ISI13, ISI14, ISI15, \ + ISI16, ISI17, ISI18, ISI19, \ + ISI20, ISI21, ISI22, ISI23 } + +/*! + * @} + */ /* end of group ISI_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +#endif /* ISI_H */ + diff --git a/platform/devices/MX8/MX8_jpgdec.h b/platform/devices/MX8/MX8_jpgdec.h new file mode 100755 index 0000000..c32a8c8 --- /dev/null +++ b/platform/devices/MX8/MX8_jpgdec.h @@ -0,0 +1,323 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8_jpegdec.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer JPGDEC + * + * CMSIS Peripheral Access Layer for JPGDEC + */ + +#ifndef JPGDEC_H +#define JPGDEC_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- JPGDEC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup JPGDEC_Peripheral_Access_Layer JPGDEC Peripheral Access Layer + * @{ + */ + +/** JPGDEC - Register Layout Typedef */ +typedef struct { + __IO uint32_t GLB_CTRL; /**< Global Control, offset: 0x0 */ + __I uint32_t COM_STATUS; /**< Common Status, offset: 0x4 */ + __I uint32_t RSVD_COM_IRQ_EN; /**< RSVD, offset: 0x8 */ + __I uint32_t RSVD_CUR_DESCPT_PTR; /**< RSVD, offset: 0xC */ + __I uint32_t RSVD_NXT_DESCPT_PTR; /**< RSVD, offset: 0x10 */ + __IO uint32_t OUT_BUF_BASE0; /**< Output Image Frame Buffer0 Base Address, offset: 0x14 */ + __IO uint32_t OUT_BUF_BASE1; /**< Output Image Frame Buffer1 Base Address, offset: 0x18 */ + __IO uint32_t OUT_PITCH; /**< Image Output Buffer Pitch, offset: 0x1C */ + __IO uint32_t STM_BUFBASE; /**< Input JPEG Stream Buffer Base Address, offset: 0x20 */ + __IO uint32_t STM_BUFSIZE; /**< Input JPEG Stream Buffer Size, offset: 0x24 */ + __IO uint32_t IMGSIZE; /**< Image Resolution, offset: 0x28 */ + __IO uint32_t STM_CTRL; /**< Bit Stream and Switching Control, offset: 0x2C */ + uint8_t RESERVED_0[65488]; + struct { /* offset: 0x10000, array step: 0x10000 */ + __IO uint32_t SLOT_STATUS; /**< Bitstream Status, array offset: 0x10000, array step: 0x10000 */ + __IO uint32_t SLOT_IRQ_EN; /**< Bitstream Interrupt Eanble, array offset: 0x10004, array step: 0x10000 */ + __I uint32_t SLOT_BUF_PTR; /**< Bitstream Buffer Pointer, array offset: 0x10008, array step: 0x10000 */ + __I uint32_t SLOT_CUR_DESCPT_PTR; /**< Current Descriptors, array offset: 0x1000C, array step: 0x10000 */ + __IO uint32_t SLOT_NXT_DESCPT_PTR; /**< Next Descriptors, array offset: 0x10010, array step: 0x10000 */ + uint8_t RESERVED_0[65516]; + } BITSTRM_SLOT_REGS[4]; +} JPGDEC_Type; + +/* ---------------------------------------------------------------------------- + -- JPGDEC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup JPGDEC_Register_Masks JPGDEC Register Masks + * @{ + */ + +/*! @name GLB_CTRL - Global Control */ +#define JPGDEC_GLB_CTRL_JPG_DEC_EN_MASK (0x1U) +#define JPGDEC_GLB_CTRL_JPG_DEC_EN_SHIFT (0U) +#define JPGDEC_GLB_CTRL_JPG_DEC_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_GLB_CTRL_JPG_DEC_EN_SHIFT)) & JPGDEC_GLB_CTRL_JPG_DEC_EN_MASK) +#define JPGDEC_GLB_CTRL_SFTRST_MASK (0x2U) +#define JPGDEC_GLB_CTRL_SFTRST_SHIFT (1U) +#define JPGDEC_GLB_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_GLB_CTRL_SFTRST_SHIFT)) & JPGDEC_GLB_CTRL_SFTRST_MASK) +#define JPGDEC_GLB_CTRL_DEC_GO_MASK (0x4U) +#define JPGDEC_GLB_CTRL_DEC_GO_SHIFT (2U) +#define JPGDEC_GLB_CTRL_DEC_GO(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_GLB_CTRL_DEC_GO_SHIFT)) & JPGDEC_GLB_CTRL_DEC_GO_MASK) +#define JPGDEC_GLB_CTRL_L_ENDIAN_MASK (0x8U) +#define JPGDEC_GLB_CTRL_L_ENDIAN_SHIFT (3U) +#define JPGDEC_GLB_CTRL_L_ENDIAN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_GLB_CTRL_L_ENDIAN_SHIFT)) & JPGDEC_GLB_CTRL_L_ENDIAN_MASK) +#define JPGDEC_GLB_CTRL_SLOT_EN_MASK (0xF0U) +#define JPGDEC_GLB_CTRL_SLOT_EN_SHIFT (4U) +#define JPGDEC_GLB_CTRL_SLOT_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_GLB_CTRL_SLOT_EN_SHIFT)) & JPGDEC_GLB_CTRL_SLOT_EN_MASK) + +/*! @name COM_STATUS - Common Status */ +#define JPGDEC_COM_STATUS_CUR_SLOT_MASK (0x60000000U) +#define JPGDEC_COM_STATUS_CUR_SLOT_SHIFT (29U) +#define JPGDEC_COM_STATUS_CUR_SLOT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_COM_STATUS_CUR_SLOT_SHIFT)) & JPGDEC_COM_STATUS_CUR_SLOT_MASK) +#define JPGDEC_COM_STATUS_DEC_ONGOING_MASK (0x80000000U) +#define JPGDEC_COM_STATUS_DEC_ONGOING_SHIFT (31U) +#define JPGDEC_COM_STATUS_DEC_ONGOING(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_COM_STATUS_DEC_ONGOING_SHIFT)) & JPGDEC_COM_STATUS_DEC_ONGOING_MASK) + +/*! @name OUT_BUF_BASE0 - Output Image Frame Buffer0 Base Address */ +#define JPGDEC_OUT_BUF_BASE0_OUT_BUF_BASE0_MASK (0xFFFFFFF0U) +#define JPGDEC_OUT_BUF_BASE0_OUT_BUF_BASE0_SHIFT (4U) +#define JPGDEC_OUT_BUF_BASE0_OUT_BUF_BASE0(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_OUT_BUF_BASE0_OUT_BUF_BASE0_SHIFT)) & JPGDEC_OUT_BUF_BASE0_OUT_BUF_BASE0_MASK) + +/*! @name OUT_BUF_BASE1 - Output Image Frame Buffer1 Base Address */ +#define JPGDEC_OUT_BUF_BASE1_OUT_BUF_BASE1_MASK (0xFFFFFFF0U) +#define JPGDEC_OUT_BUF_BASE1_OUT_BUF_BASE1_SHIFT (4U) +#define JPGDEC_OUT_BUF_BASE1_OUT_BUF_BASE1(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_OUT_BUF_BASE1_OUT_BUF_BASE1_SHIFT)) & JPGDEC_OUT_BUF_BASE1_OUT_BUF_BASE1_MASK) + +/*! @name OUT_PITCH - Image Output Buffer Pitch */ +#define JPGDEC_OUT_PITCH_OUT_PITCH_MASK (0xFFFFU) +#define JPGDEC_OUT_PITCH_OUT_PITCH_SHIFT (0U) +#define JPGDEC_OUT_PITCH_OUT_PITCH(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_OUT_PITCH_OUT_PITCH_SHIFT)) & JPGDEC_OUT_PITCH_OUT_PITCH_MASK) + +/*! @name STM_BUFBASE - Input JPEG Stream Buffer Base Address */ +#define JPGDEC_STM_BUFBASE_STM_BUFBASE_MASK (0xFFFFFFF0U) +#define JPGDEC_STM_BUFBASE_STM_BUFBASE_SHIFT (4U) +#define JPGDEC_STM_BUFBASE_STM_BUFBASE(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_BUFBASE_STM_BUFBASE_SHIFT)) & JPGDEC_STM_BUFBASE_STM_BUFBASE_MASK) + +/*! @name STM_BUFSIZE - Input JPEG Stream Buffer Size */ +#define JPGDEC_STM_BUFSIZE_STM_BUFSIZE_MASK (0xFFFFFC00U) +#define JPGDEC_STM_BUFSIZE_STM_BUFSIZE_SHIFT (10U) +#define JPGDEC_STM_BUFSIZE_STM_BUFSIZE(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_BUFSIZE_STM_BUFSIZE_SHIFT)) & JPGDEC_STM_BUFSIZE_STM_BUFSIZE_MASK) + +/*! @name IMGSIZE - Image Resolution */ +#define JPGDEC_IMGSIZE_IMG_HEIGHT_MASK (0x3FFFU) +#define JPGDEC_IMGSIZE_IMG_HEIGHT_SHIFT (0U) +#define JPGDEC_IMGSIZE_IMG_HEIGHT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_IMGSIZE_IMG_HEIGHT_SHIFT)) & JPGDEC_IMGSIZE_IMG_HEIGHT_MASK) +#define JPGDEC_IMGSIZE_IMG_WIDTH_MASK (0x3FFF0000U) +#define JPGDEC_IMGSIZE_IMG_WIDTH_SHIFT (16U) +#define JPGDEC_IMGSIZE_IMG_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_IMGSIZE_IMG_WIDTH_SHIFT)) & JPGDEC_IMGSIZE_IMG_WIDTH_MASK) + +/*! @name STM_CTRL - Bit Stream and Switching Control */ +#define JPGDEC_STM_CTRL_PIXEL_PRECISION_MASK (0x4U) +#define JPGDEC_STM_CTRL_PIXEL_PRECISION_SHIFT (2U) +#define JPGDEC_STM_CTRL_PIXEL_PRECISION(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_CTRL_PIXEL_PRECISION_SHIFT)) & JPGDEC_STM_CTRL_PIXEL_PRECISION_MASK) +#define JPGDEC_STM_CTRL_IMAGE_FORMAT_MASK (0x78U) +#define JPGDEC_STM_CTRL_IMAGE_FORMAT_SHIFT (3U) +#define JPGDEC_STM_CTRL_IMAGE_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_CTRL_IMAGE_FORMAT_SHIFT)) & JPGDEC_STM_CTRL_IMAGE_FORMAT_MASK) +#define JPGDEC_STM_CTRL_BITBUF_PTR_CLR_MASK (0x80U) +#define JPGDEC_STM_CTRL_BITBUF_PTR_CLR_SHIFT (7U) +#define JPGDEC_STM_CTRL_BITBUF_PTR_CLR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_CTRL_BITBUF_PTR_CLR_SHIFT)) & JPGDEC_STM_CTRL_BITBUF_PTR_CLR_MASK) +#define JPGDEC_STM_CTRL_AUTO_START_MASK (0x100U) +#define JPGDEC_STM_CTRL_AUTO_START_SHIFT (8U) +#define JPGDEC_STM_CTRL_AUTO_START(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_STM_CTRL_AUTO_START_SHIFT)) & JPGDEC_STM_CTRL_AUTO_START_MASK) + +/*! @name SLOT_STATUS - Bitstream Status */ +#define JPGDEC_SLOT_STATUS_STMBUF_HALF_MASK (0x1U) +#define JPGDEC_SLOT_STATUS_STMBUF_HALF_SHIFT (0U) +#define JPGDEC_SLOT_STATUS_STMBUF_HALF(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_STMBUF_HALF_SHIFT)) & JPGDEC_SLOT_STATUS_STMBUF_HALF_MASK) +#define JPGDEC_SLOT_STATUS_STMBUF_RTND_MASK (0x2U) +#define JPGDEC_SLOT_STATUS_STMBUF_RTND_SHIFT (1U) +#define JPGDEC_SLOT_STATUS_STMBUF_RTND(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_STMBUF_RTND_SHIFT)) & JPGDEC_SLOT_STATUS_STMBUF_RTND_MASK) +#define JPGDEC_SLOT_STATUS_SWITCHED_IN_MASK (0x4U) +#define JPGDEC_SLOT_STATUS_SWITCHED_IN_SHIFT (2U) +#define JPGDEC_SLOT_STATUS_SWITCHED_IN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_SWITCHED_IN_SHIFT)) & JPGDEC_SLOT_STATUS_SWITCHED_IN_MASK) +#define JPGDEC_SLOT_STATUS_FRMDONE_MASK (0x8U) +#define JPGDEC_SLOT_STATUS_FRMDONE_SHIFT (3U) +#define JPGDEC_SLOT_STATUS_FRMDONE(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_FRMDONE_SHIFT)) & JPGDEC_SLOT_STATUS_FRMDONE_MASK) +#define JPGDEC_SLOT_STATUS_DECERR_MASK (0x100U) +#define JPGDEC_SLOT_STATUS_DECERR_SHIFT (8U) +#define JPGDEC_SLOT_STATUS_DECERR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_DECERR_SHIFT)) & JPGDEC_SLOT_STATUS_DECERR_MASK) +#define JPGDEC_SLOT_STATUS_DES_RD_ERR_MASK (0x200U) +#define JPGDEC_SLOT_STATUS_DES_RD_ERR_SHIFT (9U) +#define JPGDEC_SLOT_STATUS_DES_RD_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_DES_RD_ERR_SHIFT)) & JPGDEC_SLOT_STATUS_DES_RD_ERR_MASK) +#define JPGDEC_SLOT_STATUS_BIT_RD_ERR_MASK (0x400U) +#define JPGDEC_SLOT_STATUS_BIT_RD_ERR_SHIFT (10U) +#define JPGDEC_SLOT_STATUS_BIT_RD_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_BIT_RD_ERR_SHIFT)) & JPGDEC_SLOT_STATUS_BIT_RD_ERR_MASK) +#define JPGDEC_SLOT_STATUS_PIXEL_WT_ERR_MASK (0x800U) +#define JPGDEC_SLOT_STATUS_PIXEL_WT_ERR_SHIFT (11U) +#define JPGDEC_SLOT_STATUS_PIXEL_WT_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_PIXEL_WT_ERR_SHIFT)) & JPGDEC_SLOT_STATUS_PIXEL_WT_ERR_MASK) +#define JPGDEC_SLOT_STATUS_CUR_SLOT_MASK (0x60000000U) +#define JPGDEC_SLOT_STATUS_CUR_SLOT_SHIFT (29U) +#define JPGDEC_SLOT_STATUS_CUR_SLOT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_CUR_SLOT_SHIFT)) & JPGDEC_SLOT_STATUS_CUR_SLOT_MASK) +#define JPGDEC_SLOT_STATUS_DEC_ONGOING_MASK (0x80000000U) +#define JPGDEC_SLOT_STATUS_DEC_ONGOING_SHIFT (31U) +#define JPGDEC_SLOT_STATUS_DEC_ONGOING(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_STATUS_DEC_ONGOING_SHIFT)) & JPGDEC_SLOT_STATUS_DEC_ONGOING_MASK) + +/* The count of JPGDEC_SLOT_STATUS */ +#define JPGDEC_SLOT_STATUS_COUNT (4U) + +/*! @name SLOT_IRQ_EN - Bitstream Interrupt Eanble */ +#define JPGDEC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_MASK (0x1U) +#define JPGDEC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_SHIFT (0U) +#define JPGDEC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_MASK (0x2U) +#define JPGDEC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_SHIFT (1U) +#define JPGDEC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_SWITCHED_IN_IRQ_EN_MASK (0x4U) +#define JPGDEC_SLOT_IRQ_EN_SWITCHED_IN_IRQ_EN_SHIFT (2U) +#define JPGDEC_SLOT_IRQ_EN_SWITCHED_IN_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_SWITCHED_IN_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_SWITCHED_IN_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_MASK (0x8U) +#define JPGDEC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_SHIFT (3U) +#define JPGDEC_SLOT_IRQ_EN_FRMDONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_DECERR_IRQ_EN_MASK (0x100U) +#define JPGDEC_SLOT_IRQ_EN_DECERR_IRQ_EN_SHIFT (8U) +#define JPGDEC_SLOT_IRQ_EN_DECERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_DECERR_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_DECERR_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_MASK (0x200U) +#define JPGDEC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_SHIFT (9U) +#define JPGDEC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_BIT_RD_ERR_IRQ_EN_MASK (0x400U) +#define JPGDEC_SLOT_IRQ_EN_BIT_RD_ERR_IRQ_EN_SHIFT (10U) +#define JPGDEC_SLOT_IRQ_EN_BIT_RD_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_BIT_RD_ERR_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_BIT_RD_ERR_IRQ_EN_MASK) +#define JPGDEC_SLOT_IRQ_EN_PIXEL_WT_ERR_IRQ_EN_MASK (0x800U) +#define JPGDEC_SLOT_IRQ_EN_PIXEL_WT_ERR_IRQ_EN_SHIFT (11U) +#define JPGDEC_SLOT_IRQ_EN_PIXEL_WT_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_IRQ_EN_PIXEL_WT_ERR_IRQ_EN_SHIFT)) & JPGDEC_SLOT_IRQ_EN_PIXEL_WT_ERR_IRQ_EN_MASK) + +/* The count of JPGDEC_SLOT_IRQ_EN */ +#define JPGDEC_SLOT_IRQ_EN_COUNT (4U) + +/*! @name SLOT_BUF_PTR - Bitstream Buffer Pointer */ +#define JPGDEC_SLOT_BUF_PTR_STMBUF_PTR_MASK (0xFFFFFFFFU) +#define JPGDEC_SLOT_BUF_PTR_STMBUF_PTR_SHIFT (0U) +#define JPGDEC_SLOT_BUF_PTR_STMBUF_PTR(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_BUF_PTR_STMBUF_PTR_SHIFT)) & JPGDEC_SLOT_BUF_PTR_STMBUF_PTR_MASK) + +/* The count of JPGDEC_SLOT_BUF_PTR */ +#define JPGDEC_SLOT_BUF_PTR_COUNT (4U) + +/*! @name SLOT_CUR_DESCPT_PTR - Current Descriptors */ +#define JPGDEC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_MASK (0xFFFFFFFCU) +#define JPGDEC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_SHIFT (2U) +#define JPGDEC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_SHIFT)) & JPGDEC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_MASK) + +/* The count of JPGDEC_SLOT_CUR_DESCPT_PTR */ +#define JPGDEC_SLOT_CUR_DESCPT_PTR_COUNT (4U) + +/*! @name SLOT_NXT_DESCPT_PTR - Next Descriptors */ +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_EN_MASK (0x1U) +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_EN_SHIFT (0U) +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_EN_SHIFT)) & JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_EN_MASK) +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_MASK (0xFFFFFFFCU) +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_SHIFT (2U) +#define JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT(x) (((uint32_t)(((uint32_t)(x)) << JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_SHIFT)) & JPGDEC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_MASK) + +/* The count of JPGDEC_SLOT_NXT_DESCPT_PTR */ +#define JPGDEC_SLOT_NXT_DESCPT_PTR_COUNT (4U) + + +/*! + * @} + */ /* end of group JPGDEC_Register_Masks */ + + +/* JPGDEC - Peripheral instance base addresses */ +/** Peripheral JPEG_DEC base address */ +#define JPEGDEC_BASE (0u) +/** Peripheral JPEG_DEC base pointer */ +#define JPEGDEC ((JPGDEC_Type *)JPEGDEC_BASE) +/** Array initializer of JPGDEC peripheral base addresses */ +#define JPGDEC_BASE_ADDRS { JPEGDEC_BASE } +/** Array initializer of JPGDEC peripheral base pointers */ +#define JPGDEC_BASE_PTRS { JPEGDEC } + +/*! + * @} + */ /* end of group JPGDEC_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +#endif /* JPGDEC_H */ + diff --git a/platform/devices/MX8/MX8_jpgenc.h b/platform/devices/MX8/MX8_jpgenc.h new file mode 100755 index 0000000..ce34bb5 --- /dev/null +++ b/platform/devices/MX8/MX8_jpgenc.h @@ -0,0 +1,325 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8_jpegenc.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for JPGENC + * + * CMSIS Peripheral Access Layer for JPGENC + */ + +#ifndef JPGENC_H +#define JPGENC_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- JPGENC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup JPGENC_Peripheral_Access_Layer JPGENC Peripheral Access Layer + * @{ + */ + +/** JPGENC - Register Layout Typedef */ +typedef struct { + __IO uint32_t GLB_CTRL; /**< Global Control, offset: 0x0 */ + __I uint32_t COM_STATUS; /**< Common Status, offset: 0x4 */ + __I uint32_t RSVD_COM_IRQ_EN; /**< RSVD, offset: 0x8 */ + __I uint32_t RSVD_CUR_DESCPT_PTR; /**< RSVD, offset: 0xC */ + __I uint32_t RSVD_NXT_DESCPT_PTR; /**< RSVD, offset: 0x10 */ + __IO uint32_t IN_BUF_BASE0; /**< Input Image Frame Buffer0 Base Address, offset: 0x14 */ + __IO uint32_t IN_BUF_BASE1; /**< Input Image Frame Buffer1 Base Address, offset: 0x18 */ + __IO uint32_t IN_LINE_PITCH; /**< Image Input Buffer Line Pitch, offset: 0x1C */ + __IO uint32_t STM_BUFBASE; /**< Output JPEG Stream Buffer Base Address, offset: 0x20 */ + __IO uint32_t STM_BUFSIZE; /**< Output JPEG Stream Buffer Size, offset: 0x24 */ + __IO uint32_t IMGSIZE; /**< Image Resolution, offset: 0x28 */ + __IO uint32_t STM_CTRL; /**< Bit Stream Switch and Control, offset: 0x2C */ + uint8_t RESERVED_0[65488]; + struct { /* offset: 0x10000, array step: 0x10000 */ + __IO uint32_t SLOT_STATUS; /**< Bit Stream SLOT Status, array offset: 0x10000, array step: 0x10000 */ + __IO uint32_t SLOT_IRQ_EN; /**< Bit Stream Interrupt Enable Register, array offset: 0x10004, array step: 0x10000 */ + __I uint32_t SLOT_BUF_PTR; /**< Bit Stream Buffer Pointer, array offset: 0x10008, array step: 0x10000 */ + __I uint32_t SLOT_CUR_DESCPT_PTR; /**< Current Encoding Descriptor Pointer, array offset: 0x1000C, array step: 0x10000 */ + __IO uint32_t SLOT_NXT_DESCPT_PTR; /**< Next Encoding Descriptor Pointer, array offset: 0x10010, array step: 0x10000 */ + uint8_t RESERVED_0[65516]; + } BITSTRM_SLOT_REGS[4]; +} JPGENC_Type; + +/* ---------------------------------------------------------------------------- + -- JPGENC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup JPGENC_Register_Masks JPGENC Register Masks + * @{ + */ + +/*! @name GLB_CTRL - Global Control */ +#define JPGENC_GLB_CTRL_JPG_ENC_EN_MASK (0x1U) +#define JPGENC_GLB_CTRL_JPG_ENC_EN_SHIFT (0U) +#define JPGENC_GLB_CTRL_JPG_ENC_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_GLB_CTRL_JPG_ENC_EN_SHIFT)) & JPGENC_GLB_CTRL_JPG_ENC_EN_MASK) +#define JPGENC_GLB_CTRL_SFTRST_MASK (0x2U) +#define JPGENC_GLB_CTRL_SFTRST_SHIFT (1U) +#define JPGENC_GLB_CTRL_SFTRST(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_GLB_CTRL_SFTRST_SHIFT)) & JPGENC_GLB_CTRL_SFTRST_MASK) +#define JPGENC_GLB_CTRL_ENC_GO_MASK (0x4U) +#define JPGENC_GLB_CTRL_ENC_GO_SHIFT (2U) +#define JPGENC_GLB_CTRL_ENC_GO(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_GLB_CTRL_ENC_GO_SHIFT)) & JPGENC_GLB_CTRL_ENC_GO_MASK) +#define JPGENC_GLB_CTRL_L_ENDIAN_MASK (0x8U) +#define JPGENC_GLB_CTRL_L_ENDIAN_SHIFT (3U) +#define JPGENC_GLB_CTRL_L_ENDIAN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_GLB_CTRL_L_ENDIAN_SHIFT)) & JPGENC_GLB_CTRL_L_ENDIAN_MASK) +#define JPGENC_GLB_CTRL_SLOT_EN_MASK (0xF0U) +#define JPGENC_GLB_CTRL_SLOT_EN_SHIFT (4U) +#define JPGENC_GLB_CTRL_SLOT_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_GLB_CTRL_SLOT_EN_SHIFT)) & JPGENC_GLB_CTRL_SLOT_EN_MASK) + +/*! @name COM_STATUS - Common Status */ +#define JPGENC_COM_STATUS_CUR_SLOT_MASK (0x60000000U) +#define JPGENC_COM_STATUS_CUR_SLOT_SHIFT (29U) +#define JPGENC_COM_STATUS_CUR_SLOT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_COM_STATUS_CUR_SLOT_SHIFT)) & JPGENC_COM_STATUS_CUR_SLOT_MASK) +#define JPGENC_COM_STATUS_ENC_ONGOING_MASK (0x80000000U) +#define JPGENC_COM_STATUS_ENC_ONGOING_SHIFT (31U) +#define JPGENC_COM_STATUS_ENC_ONGOING(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_COM_STATUS_ENC_ONGOING_SHIFT)) & JPGENC_COM_STATUS_ENC_ONGOING_MASK) + +/*! @name IN_BUF_BASE0 - Input Image Frame Buffer0 Base Address */ +#define JPGENC_IN_BUF_BASE0_IN_BUF_BASE0_MASK (0xFFFFFFF0U) +#define JPGENC_IN_BUF_BASE0_IN_BUF_BASE0_SHIFT (4U) +#define JPGENC_IN_BUF_BASE0_IN_BUF_BASE0(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_IN_BUF_BASE0_IN_BUF_BASE0_SHIFT)) & JPGENC_IN_BUF_BASE0_IN_BUF_BASE0_MASK) + +/*! @name IN_BUF_BASE1 - Input Image Frame Buffer1 Base Address */ +#define JPGENC_IN_BUF_BASE1_IN_BUF_BASE1_MASK (0xFFFFFFF0U) +#define JPGENC_IN_BUF_BASE1_IN_BUF_BASE1_SHIFT (4U) +#define JPGENC_IN_BUF_BASE1_IN_BUF_BASE1(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_IN_BUF_BASE1_IN_BUF_BASE1_SHIFT)) & JPGENC_IN_BUF_BASE1_IN_BUF_BASE1_MASK) + +/*! @name IN_LINE_PITCH - Image Input Buffer Line Pitch */ +#define JPGENC_IN_LINE_PITCH_IN_LINE_PITCH_MASK (0xFFFFU) +#define JPGENC_IN_LINE_PITCH_IN_LINE_PITCH_SHIFT (0U) +#define JPGENC_IN_LINE_PITCH_IN_LINE_PITCH(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_IN_LINE_PITCH_IN_LINE_PITCH_SHIFT)) & JPGENC_IN_LINE_PITCH_IN_LINE_PITCH_MASK) + +/*! @name STM_BUFBASE - Output JPEG Stream Buffer Base Address */ +#define JPGENC_STM_BUFBASE_STM_BUFBASE_MASK (0xFFFFFFF0U) +#define JPGENC_STM_BUFBASE_STM_BUFBASE_SHIFT (4U) +#define JPGENC_STM_BUFBASE_STM_BUFBASE(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_BUFBASE_STM_BUFBASE_SHIFT)) & JPGENC_STM_BUFBASE_STM_BUFBASE_MASK) + +/*! @name STM_BUFSIZE - Output JPEG Stream Buffer Size */ +#define JPGENC_STM_BUFSIZE_STM_BUFSIZE_MASK (0xFFFFFC00U) +#define JPGENC_STM_BUFSIZE_STM_BUFSIZE_SHIFT (10U) +#define JPGENC_STM_BUFSIZE_STM_BUFSIZE(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_BUFSIZE_STM_BUFSIZE_SHIFT)) & JPGENC_STM_BUFSIZE_STM_BUFSIZE_MASK) + +/*! @name IMGSIZE - Image Resolution */ +#define JPGENC_IMGSIZE_IMG_HEIGHT_MASK (0x3FFFU) +#define JPGENC_IMGSIZE_IMG_HEIGHT_SHIFT (0U) +#define JPGENC_IMGSIZE_IMG_HEIGHT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_IMGSIZE_IMG_HEIGHT_SHIFT)) & JPGENC_IMGSIZE_IMG_HEIGHT_MASK) +#define JPGENC_IMGSIZE_IMG_WIDTH_MASK (0x3FFF0000U) +#define JPGENC_IMGSIZE_IMG_WIDTH_SHIFT (16U) +#define JPGENC_IMGSIZE_IMG_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_IMGSIZE_IMG_WIDTH_SHIFT)) & JPGENC_IMGSIZE_IMG_WIDTH_MASK) + +/*! @name STM_CTRL - Bit Stream Switch and Control */ +#define JPGENC_STM_CTRL_PIXEL_PRECISION_MASK (0x4U) +#define JPGENC_STM_CTRL_PIXEL_PRECISION_SHIFT (2U) +#define JPGENC_STM_CTRL_PIXEL_PRECISION(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_CTRL_PIXEL_PRECISION_SHIFT)) & JPGENC_STM_CTRL_PIXEL_PRECISION_MASK) +#define JPGENC_STM_CTRL_IMAGE_FORMAT_MASK (0x78U) +#define JPGENC_STM_CTRL_IMAGE_FORMAT_SHIFT (3U) +#define JPGENC_STM_CTRL_IMAGE_FORMAT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_CTRL_IMAGE_FORMAT_SHIFT)) & JPGENC_STM_CTRL_IMAGE_FORMAT_MASK) +#define JPGENC_STM_CTRL_BITBUF_PTR_CLR_MASK (0x80U) +#define JPGENC_STM_CTRL_BITBUF_PTR_CLR_SHIFT (7U) +#define JPGENC_STM_CTRL_BITBUF_PTR_CLR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_CTRL_BITBUF_PTR_CLR_SHIFT)) & JPGENC_STM_CTRL_BITBUF_PTR_CLR_MASK) +#define JPGENC_STM_CTRL_AUTO_START_MASK (0x100U) +#define JPGENC_STM_CTRL_AUTO_START_SHIFT (8U) +#define JPGENC_STM_CTRL_AUTO_START(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_CTRL_AUTO_START_SHIFT)) & JPGENC_STM_CTRL_AUTO_START_MASK) +#define JPGENC_STM_CTRL_CONFIG_MOD_MASK (0x200U) +#define JPGENC_STM_CTRL_CONFIG_MOD_SHIFT (9U) +#define JPGENC_STM_CTRL_CONFIG_MOD(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_STM_CTRL_CONFIG_MOD_SHIFT)) & JPGENC_STM_CTRL_CONFIG_MOD_MASK) + +/*! @name SLOT_STATUS - Bit Stream SLOT Status */ +#define JPGENC_SLOT_STATUS_STMBUF_HALF_MASK (0x1U) +#define JPGENC_SLOT_STATUS_STMBUF_HALF_SHIFT (0U) +#define JPGENC_SLOT_STATUS_STMBUF_HALF(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_STMBUF_HALF_SHIFT)) & JPGENC_SLOT_STATUS_STMBUF_HALF_MASK) +#define JPGENC_SLOT_STATUS_STMBUF_RTND_MASK (0x2U) +#define JPGENC_SLOT_STATUS_STMBUF_RTND_SHIFT (1U) +#define JPGENC_SLOT_STATUS_STMBUF_RTND(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_STMBUF_RTND_SHIFT)) & JPGENC_SLOT_STATUS_STMBUF_RTND_MASK) +#define JPGENC_SLOT_STATUS_SWITCHED_IN_MASK (0x4U) +#define JPGENC_SLOT_STATUS_SWITCHED_IN_SHIFT (2U) +#define JPGENC_SLOT_STATUS_SWITCHED_IN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_SWITCHED_IN_SHIFT)) & JPGENC_SLOT_STATUS_SWITCHED_IN_MASK) +#define JPGENC_SLOT_STATUS_FRMDONE_MASK (0x8U) +#define JPGENC_SLOT_STATUS_FRMDONE_SHIFT (3U) +#define JPGENC_SLOT_STATUS_FRMDONE(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_FRMDONE_SHIFT)) & JPGENC_SLOT_STATUS_FRMDONE_MASK) +#define JPGENC_SLOT_STATUS_ENC_CONFG_ERR_MASK (0x100U) +#define JPGENC_SLOT_STATUS_ENC_CONFG_ERR_SHIFT (8U) +#define JPGENC_SLOT_STATUS_ENC_CONFG_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_ENC_CONFG_ERR_SHIFT)) & JPGENC_SLOT_STATUS_ENC_CONFG_ERR_MASK) +#define JPGENC_SLOT_STATUS_DES_RD_ERR_MASK (0x200U) +#define JPGENC_SLOT_STATUS_DES_RD_ERR_SHIFT (9U) +#define JPGENC_SLOT_STATUS_DES_RD_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_DES_RD_ERR_SHIFT)) & JPGENC_SLOT_STATUS_DES_RD_ERR_MASK) +#define JPGENC_SLOT_STATUS_BIT_WT_ERR_MASK (0x400U) +#define JPGENC_SLOT_STATUS_BIT_WT_ERR_SHIFT (10U) +#define JPGENC_SLOT_STATUS_BIT_WT_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_BIT_WT_ERR_SHIFT)) & JPGENC_SLOT_STATUS_BIT_WT_ERR_MASK) +#define JPGENC_SLOT_STATUS_IMG_RD_ERR_MASK (0x800U) +#define JPGENC_SLOT_STATUS_IMG_RD_ERR_SHIFT (11U) +#define JPGENC_SLOT_STATUS_IMG_RD_ERR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_IMG_RD_ERR_SHIFT)) & JPGENC_SLOT_STATUS_IMG_RD_ERR_MASK) +#define JPGENC_SLOT_STATUS_CUR_SLOT_MASK (0x60000000U) +#define JPGENC_SLOT_STATUS_CUR_SLOT_SHIFT (29U) +#define JPGENC_SLOT_STATUS_CUR_SLOT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_CUR_SLOT_SHIFT)) & JPGENC_SLOT_STATUS_CUR_SLOT_MASK) +#define JPGENC_SLOT_STATUS_ENC_ONGOING_MASK (0x80000000U) +#define JPGENC_SLOT_STATUS_ENC_ONGOING_SHIFT (31U) +#define JPGENC_SLOT_STATUS_ENC_ONGOING(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_STATUS_ENC_ONGOING_SHIFT)) & JPGENC_SLOT_STATUS_ENC_ONGOING_MASK) + +/* The count of JPGENC_SLOT_STATUS */ +#define JPGENC_SLOT_STATUS_COUNT (4U) + +/*! @name SLOT_IRQ_EN - Bit Stream Interrupt Enable Register */ +#define JPGENC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_MASK (0x1U) +#define JPGENC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_SHIFT (0U) +#define JPGENC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_STMBUF_HALF_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_MASK (0x2U) +#define JPGENC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_SHIFT (1U) +#define JPGENC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_STMBUF_RTND_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_SWITHCED_IN_IRQ_EN_MASK (0x4U) +#define JPGENC_SLOT_IRQ_EN_SWITHCED_IN_IRQ_EN_SHIFT (2U) +#define JPGENC_SLOT_IRQ_EN_SWITHCED_IN_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_SWITHCED_IN_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_SWITHCED_IN_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_MASK (0x8U) +#define JPGENC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_SHIFT (3U) +#define JPGENC_SLOT_IRQ_EN_FRMDONE_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_FRMDONE_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_ENC_CONFG_ERR_IRQ_EN_MASK (0x100U) +#define JPGENC_SLOT_IRQ_EN_ENC_CONFG_ERR_IRQ_EN_SHIFT (8U) +#define JPGENC_SLOT_IRQ_EN_ENC_CONFG_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_ENC_CONFG_ERR_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_ENC_CONFG_ERR_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_MASK (0x200U) +#define JPGENC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_SHIFT (9U) +#define JPGENC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_DES_RD_ERR_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_BIT_WT_ERR_IRQ_EN_MASK (0x400U) +#define JPGENC_SLOT_IRQ_EN_BIT_WT_ERR_IRQ_EN_SHIFT (10U) +#define JPGENC_SLOT_IRQ_EN_BIT_WT_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_BIT_WT_ERR_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_BIT_WT_ERR_IRQ_EN_MASK) +#define JPGENC_SLOT_IRQ_EN_IMG_RD_ERR_IRQ_EN_MASK (0x800U) +#define JPGENC_SLOT_IRQ_EN_IMG_RD_ERR_IRQ_EN_SHIFT (11U) +#define JPGENC_SLOT_IRQ_EN_IMG_RD_ERR_IRQ_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_IRQ_EN_IMG_RD_ERR_IRQ_EN_SHIFT)) & JPGENC_SLOT_IRQ_EN_IMG_RD_ERR_IRQ_EN_MASK) + +/* The count of JPGENC_SLOT_IRQ_EN */ +#define JPGENC_SLOT_IRQ_EN_COUNT (4U) + +/*! @name SLOT_BUF_PTR - Bit Stream Buffer Pointer */ +#define JPGENC_SLOT_BUF_PTR_STMBUF_PTR_MASK (0xFFFFFFFFU) +#define JPGENC_SLOT_BUF_PTR_STMBUF_PTR_SHIFT (0U) +#define JPGENC_SLOT_BUF_PTR_STMBUF_PTR(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_BUF_PTR_STMBUF_PTR_SHIFT)) & JPGENC_SLOT_BUF_PTR_STMBUF_PTR_MASK) + +/* The count of JPGENC_SLOT_BUF_PTR */ +#define JPGENC_SLOT_BUF_PTR_COUNT (4U) + +/*! @name SLOT_CUR_DESCPT_PTR - Current Encoding Descriptor Pointer */ +#define JPGENC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_MASK (0xFFFFFFFCU) +#define JPGENC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_SHIFT (2U) +#define JPGENC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_SHIFT)) & JPGENC_SLOT_CUR_DESCPT_PTR_CUR_DESCPT_PRT_MASK) + +/* The count of JPGENC_SLOT_CUR_DESCPT_PTR */ +#define JPGENC_SLOT_CUR_DESCPT_PTR_COUNT (4U) + +/*! @name SLOT_NXT_DESCPT_PTR - Next Encoding Descriptor Pointer */ +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PTR_EN_MASK (0x1U) +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PTR_EN_SHIFT (0U) +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PTR_EN(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PTR_EN_SHIFT)) & JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PTR_EN_MASK) +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_MASK (0xFFFFFFFCU) +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_SHIFT (2U) +#define JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT(x) (((uint32_t)(((uint32_t)(x)) << JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_SHIFT)) & JPGENC_SLOT_NXT_DESCPT_PTR_NXT_DESCPT_PRT_MASK) + +/* The count of JPGENC_SLOT_NXT_DESCPT_PTR */ +#define JPGENC_SLOT_NXT_DESCPT_PTR_COUNT (4U) + + +/*! + * @} + */ /* end of group JPGENC_Register_Masks */ + + +/* JPGENC - Peripheral instance base addresses */ +/** Peripheral JPGENCWRP base address */ +#define JPGENC_BASE (0u) +/** Peripheral JPGENCWRP base pointer */ +#define JPGENC ((JPGENC_Type *)JPGENC_BASE) +/** Array initializer of JPGENC peripheral base addresses */ +#define JPGENC_BASE_ADDRS { JPGENC_BASE } +/** Array initializer of JPGENC peripheral base pointers */ +#define JPGENC_BASE_PTRS { JPGENC } + +/*! + * @} + */ /* end of group JPGENC_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +#endif /* JPGENC_H */ + diff --git a/platform/devices/MX8/MX8_lmem_cache.h b/platform/devices/MX8/MX8_lmem_cache.h new file mode 100755 index 0000000..820b0ee --- /dev/null +++ b/platform/devices/MX8/MX8_lmem_cache.h @@ -0,0 +1,342 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LMEM_CACHE_REGISTERS_H +#define HW_LMEM_CACHE_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- LMEM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LMEM_Peripheral_Access_Layer LMEM Peripheral Access Layer + * @{ + */ + +/** LMEM - Register Layout Typedef */ +typedef struct { + __IO uint32_t PCCCR; /**< Cache control register, offset: 0x0 */ + __IO uint32_t PCCLCR; /**< Cache line control register, offset: 0x4 */ + __IO uint32_t PCCSAR; /**< Cache search address register, offset: 0x8 */ + __IO uint32_t PCCCVR; /**< Cache read/write value register, offset: 0xC */ + uint8_t RESERVED_0[16]; + __IO uint32_t PCCRMR; /**< Cache regions mode register, offset: 0x20 */ + uint8_t RESERVED_1[2012]; + __IO uint32_t PSCCR; /**< Cache control register, offset: 0x800 */ + __IO uint32_t PSCLCR; /**< Cache line control register, offset: 0x804 */ + __IO uint32_t PSCSAR; /**< Cache search address register, offset: 0x808 */ + __IO uint32_t PSCCVR; /**< Cache read/write value register, offset: 0x80C */ + uint8_t RESERVED_2[16]; + __IO uint32_t PSCRMR; /**< Cache regions mode register, offset: 0x820 */ +} LMEM_Type; + +/* ---------------------------------------------------------------------------- + -- LMEM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LMEM_Register_Masks LMEM Register Masks + * @{ + */ + +/*! @name PCCCR - Cache control register */ +#define LMEM_PCCCR_ENCACHE_MASK (0x1U) +#define LMEM_PCCCR_ENCACHE_SHIFT (0U) +#define LMEM_PCCCR_ENCACHE(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_ENCACHE_SHIFT)) & LMEM_PCCCR_ENCACHE_MASK) +#define LMEM_PCCCR_ENWRBUF_MASK (0x2U) +#define LMEM_PCCCR_ENWRBUF_SHIFT (1U) +#define LMEM_PCCCR_ENWRBUF(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_ENWRBUF_SHIFT)) & LMEM_PCCCR_ENWRBUF_MASK) +#define LMEM_PCCCR_INVW0_MASK (0x1000000U) +#define LMEM_PCCCR_INVW0_SHIFT (24U) +#define LMEM_PCCCR_INVW0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_INVW0_SHIFT)) & LMEM_PCCCR_INVW0_MASK) +#define LMEM_PCCCR_PUSHW0_MASK (0x2000000U) +#define LMEM_PCCCR_PUSHW0_SHIFT (25U) +#define LMEM_PCCCR_PUSHW0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_PUSHW0_SHIFT)) & LMEM_PCCCR_PUSHW0_MASK) +#define LMEM_PCCCR_INVW1_MASK (0x4000000U) +#define LMEM_PCCCR_INVW1_SHIFT (26U) +#define LMEM_PCCCR_INVW1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_INVW1_SHIFT)) & LMEM_PCCCR_INVW1_MASK) +#define LMEM_PCCCR_PUSHW1_MASK (0x8000000U) +#define LMEM_PCCCR_PUSHW1_SHIFT (27U) +#define LMEM_PCCCR_PUSHW1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_PUSHW1_SHIFT)) & LMEM_PCCCR_PUSHW1_MASK) +#define LMEM_PCCCR_GO_MASK (0x80000000U) +#define LMEM_PCCCR_GO_SHIFT (31U) +#define LMEM_PCCCR_GO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCR_GO_SHIFT)) & LMEM_PCCCR_GO_MASK) + +/*! @name PCCLCR - Cache line control register */ +#define LMEM_PCCLCR_LGO_MASK (0x1U) +#define LMEM_PCCLCR_LGO_SHIFT (0U) +#define LMEM_PCCLCR_LGO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LGO_SHIFT)) & LMEM_PCCLCR_LGO_MASK) +#define LMEM_PCCLCR_CACHEADDR_MASK (0xFFCU) +#define LMEM_PCCLCR_CACHEADDR_SHIFT (2U) +#define LMEM_PCCLCR_CACHEADDR(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_CACHEADDR_SHIFT)) & LMEM_PCCLCR_CACHEADDR_MASK) +#define LMEM_PCCLCR_WSEL_MASK (0x4000U) +#define LMEM_PCCLCR_WSEL_SHIFT (14U) +#define LMEM_PCCLCR_WSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_WSEL_SHIFT)) & LMEM_PCCLCR_WSEL_MASK) +#define LMEM_PCCLCR_TDSEL_MASK (0x10000U) +#define LMEM_PCCLCR_TDSEL_SHIFT (16U) +#define LMEM_PCCLCR_TDSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_TDSEL_SHIFT)) & LMEM_PCCLCR_TDSEL_MASK) +#define LMEM_PCCLCR_LCIVB_MASK (0x100000U) +#define LMEM_PCCLCR_LCIVB_SHIFT (20U) +#define LMEM_PCCLCR_LCIVB(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LCIVB_SHIFT)) & LMEM_PCCLCR_LCIVB_MASK) +#define LMEM_PCCLCR_LCIMB_MASK (0x200000U) +#define LMEM_PCCLCR_LCIMB_SHIFT (21U) +#define LMEM_PCCLCR_LCIMB(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LCIMB_SHIFT)) & LMEM_PCCLCR_LCIMB_MASK) +#define LMEM_PCCLCR_LCWAY_MASK (0x400000U) +#define LMEM_PCCLCR_LCWAY_SHIFT (22U) +#define LMEM_PCCLCR_LCWAY(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LCWAY_SHIFT)) & LMEM_PCCLCR_LCWAY_MASK) +#define LMEM_PCCLCR_LCMD_MASK (0x3000000U) +#define LMEM_PCCLCR_LCMD_SHIFT (24U) +#define LMEM_PCCLCR_LCMD(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LCMD_SHIFT)) & LMEM_PCCLCR_LCMD_MASK) +#define LMEM_PCCLCR_LADSEL_MASK (0x4000000U) +#define LMEM_PCCLCR_LADSEL_SHIFT (26U) +#define LMEM_PCCLCR_LADSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LADSEL_SHIFT)) & LMEM_PCCLCR_LADSEL_MASK) +#define LMEM_PCCLCR_LACC_MASK (0x8000000U) +#define LMEM_PCCLCR_LACC_SHIFT (27U) +#define LMEM_PCCLCR_LACC(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCLCR_LACC_SHIFT)) & LMEM_PCCLCR_LACC_MASK) + +/*! @name PCCSAR - Cache search address register */ +#define LMEM_PCCSAR_LGO_MASK (0x1U) +#define LMEM_PCCSAR_LGO_SHIFT (0U) +#define LMEM_PCCSAR_LGO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCSAR_LGO_SHIFT)) & LMEM_PCCSAR_LGO_MASK) +#define LMEM_PCCSAR_PHYADDR_MASK (0xFFFFFFFCU) +#define LMEM_PCCSAR_PHYADDR_SHIFT (2U) +#define LMEM_PCCSAR_PHYADDR(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCSAR_PHYADDR_SHIFT)) & LMEM_PCCSAR_PHYADDR_MASK) + +/*! @name PCCCVR - Cache read/write value register */ +#define LMEM_PCCCVR_DATA_MASK (0xFFFFFFFFU) +#define LMEM_PCCCVR_DATA_SHIFT (0U) +#define LMEM_PCCCVR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCCVR_DATA_SHIFT)) & LMEM_PCCCVR_DATA_MASK) + +/*! @name PCCRMR - Cache regions mode register */ +#define LMEM_PCCRMR_R15_MASK (0x3U) +#define LMEM_PCCRMR_R15_SHIFT (0U) +#define LMEM_PCCRMR_R15(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R15_SHIFT)) & LMEM_PCCRMR_R15_MASK) +#define LMEM_PCCRMR_R14_MASK (0xCU) +#define LMEM_PCCRMR_R14_SHIFT (2U) +#define LMEM_PCCRMR_R14(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R14_SHIFT)) & LMEM_PCCRMR_R14_MASK) +#define LMEM_PCCRMR_R13_MASK (0x30U) +#define LMEM_PCCRMR_R13_SHIFT (4U) +#define LMEM_PCCRMR_R13(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R13_SHIFT)) & LMEM_PCCRMR_R13_MASK) +#define LMEM_PCCRMR_R12_MASK (0xC0U) +#define LMEM_PCCRMR_R12_SHIFT (6U) +#define LMEM_PCCRMR_R12(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R12_SHIFT)) & LMEM_PCCRMR_R12_MASK) +#define LMEM_PCCRMR_R11_MASK (0x300U) +#define LMEM_PCCRMR_R11_SHIFT (8U) +#define LMEM_PCCRMR_R11(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R11_SHIFT)) & LMEM_PCCRMR_R11_MASK) +#define LMEM_PCCRMR_R10_MASK (0xC00U) +#define LMEM_PCCRMR_R10_SHIFT (10U) +#define LMEM_PCCRMR_R10(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R10_SHIFT)) & LMEM_PCCRMR_R10_MASK) +#define LMEM_PCCRMR_R9_MASK (0x3000U) +#define LMEM_PCCRMR_R9_SHIFT (12U) +#define LMEM_PCCRMR_R9(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R9_SHIFT)) & LMEM_PCCRMR_R9_MASK) +#define LMEM_PCCRMR_R8_MASK (0xC000U) +#define LMEM_PCCRMR_R8_SHIFT (14U) +#define LMEM_PCCRMR_R8(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R8_SHIFT)) & LMEM_PCCRMR_R8_MASK) +#define LMEM_PCCRMR_R7_MASK (0x30000U) +#define LMEM_PCCRMR_R7_SHIFT (16U) +#define LMEM_PCCRMR_R7(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R7_SHIFT)) & LMEM_PCCRMR_R7_MASK) +#define LMEM_PCCRMR_R6_MASK (0xC0000U) +#define LMEM_PCCRMR_R6_SHIFT (18U) +#define LMEM_PCCRMR_R6(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R6_SHIFT)) & LMEM_PCCRMR_R6_MASK) +#define LMEM_PCCRMR_R5_MASK (0x300000U) +#define LMEM_PCCRMR_R5_SHIFT (20U) +#define LMEM_PCCRMR_R5(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R5_SHIFT)) & LMEM_PCCRMR_R5_MASK) +#define LMEM_PCCRMR_R4_MASK (0xC00000U) +#define LMEM_PCCRMR_R4_SHIFT (22U) +#define LMEM_PCCRMR_R4(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R4_SHIFT)) & LMEM_PCCRMR_R4_MASK) +#define LMEM_PCCRMR_R3_MASK (0x3000000U) +#define LMEM_PCCRMR_R3_SHIFT (24U) +#define LMEM_PCCRMR_R3(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R3_SHIFT)) & LMEM_PCCRMR_R3_MASK) +#define LMEM_PCCRMR_R2_MASK (0xC000000U) +#define LMEM_PCCRMR_R2_SHIFT (26U) +#define LMEM_PCCRMR_R2(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R2_SHIFT)) & LMEM_PCCRMR_R2_MASK) +#define LMEM_PCCRMR_R1_MASK (0x30000000U) +#define LMEM_PCCRMR_R1_SHIFT (28U) +#define LMEM_PCCRMR_R1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R1_SHIFT)) & LMEM_PCCRMR_R1_MASK) +#define LMEM_PCCRMR_R0_MASK (0xC0000000U) +#define LMEM_PCCRMR_R0_SHIFT (30U) +#define LMEM_PCCRMR_R0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PCCRMR_R0_SHIFT)) & LMEM_PCCRMR_R0_MASK) + +/*! @name PSCCR - Cache control register */ +#define LMEM_PSCCR_ENCACHE_MASK (0x1U) +#define LMEM_PSCCR_ENCACHE_SHIFT (0U) +#define LMEM_PSCCR_ENCACHE(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_ENCACHE_SHIFT)) & LMEM_PSCCR_ENCACHE_MASK) +#define LMEM_PSCCR_ENWRBUF_MASK (0x2U) +#define LMEM_PSCCR_ENWRBUF_SHIFT (1U) +#define LMEM_PSCCR_ENWRBUF(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_ENWRBUF_SHIFT)) & LMEM_PSCCR_ENWRBUF_MASK) +#define LMEM_PSCCR_INVW0_MASK (0x1000000U) +#define LMEM_PSCCR_INVW0_SHIFT (24U) +#define LMEM_PSCCR_INVW0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_INVW0_SHIFT)) & LMEM_PSCCR_INVW0_MASK) +#define LMEM_PSCCR_PUSHW0_MASK (0x2000000U) +#define LMEM_PSCCR_PUSHW0_SHIFT (25U) +#define LMEM_PSCCR_PUSHW0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_PUSHW0_SHIFT)) & LMEM_PSCCR_PUSHW0_MASK) +#define LMEM_PSCCR_INVW1_MASK (0x4000000U) +#define LMEM_PSCCR_INVW1_SHIFT (26U) +#define LMEM_PSCCR_INVW1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_INVW1_SHIFT)) & LMEM_PSCCR_INVW1_MASK) +#define LMEM_PSCCR_PUSHW1_MASK (0x8000000U) +#define LMEM_PSCCR_PUSHW1_SHIFT (27U) +#define LMEM_PSCCR_PUSHW1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_PUSHW1_SHIFT)) & LMEM_PSCCR_PUSHW1_MASK) +#define LMEM_PSCCR_GO_MASK (0x80000000U) +#define LMEM_PSCCR_GO_SHIFT (31U) +#define LMEM_PSCCR_GO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCR_GO_SHIFT)) & LMEM_PSCCR_GO_MASK) + +/*! @name PSCLCR - Cache line control register */ +#define LMEM_PSCLCR_LGO_MASK (0x1U) +#define LMEM_PSCLCR_LGO_SHIFT (0U) +#define LMEM_PSCLCR_LGO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LGO_SHIFT)) & LMEM_PSCLCR_LGO_MASK) +#define LMEM_PSCLCR_CACHEADDR_MASK (0xFFCU) +#define LMEM_PSCLCR_CACHEADDR_SHIFT (2U) +#define LMEM_PSCLCR_CACHEADDR(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_CACHEADDR_SHIFT)) & LMEM_PSCLCR_CACHEADDR_MASK) +#define LMEM_PSCLCR_WSEL_MASK (0x4000U) +#define LMEM_PSCLCR_WSEL_SHIFT (14U) +#define LMEM_PSCLCR_WSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_WSEL_SHIFT)) & LMEM_PSCLCR_WSEL_MASK) +#define LMEM_PSCLCR_TDSEL_MASK (0x10000U) +#define LMEM_PSCLCR_TDSEL_SHIFT (16U) +#define LMEM_PSCLCR_TDSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_TDSEL_SHIFT)) & LMEM_PSCLCR_TDSEL_MASK) +#define LMEM_PSCLCR_LCIVB_MASK (0x100000U) +#define LMEM_PSCLCR_LCIVB_SHIFT (20U) +#define LMEM_PSCLCR_LCIVB(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LCIVB_SHIFT)) & LMEM_PSCLCR_LCIVB_MASK) +#define LMEM_PSCLCR_LCIMB_MASK (0x200000U) +#define LMEM_PSCLCR_LCIMB_SHIFT (21U) +#define LMEM_PSCLCR_LCIMB(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LCIMB_SHIFT)) & LMEM_PSCLCR_LCIMB_MASK) +#define LMEM_PSCLCR_LCWAY_MASK (0x400000U) +#define LMEM_PSCLCR_LCWAY_SHIFT (22U) +#define LMEM_PSCLCR_LCWAY(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LCWAY_SHIFT)) & LMEM_PSCLCR_LCWAY_MASK) +#define LMEM_PSCLCR_LCMD_MASK (0x3000000U) +#define LMEM_PSCLCR_LCMD_SHIFT (24U) +#define LMEM_PSCLCR_LCMD(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LCMD_SHIFT)) & LMEM_PSCLCR_LCMD_MASK) +#define LMEM_PSCLCR_LADSEL_MASK (0x4000000U) +#define LMEM_PSCLCR_LADSEL_SHIFT (26U) +#define LMEM_PSCLCR_LADSEL(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LADSEL_SHIFT)) & LMEM_PSCLCR_LADSEL_MASK) +#define LMEM_PSCLCR_LACC_MASK (0x8000000U) +#define LMEM_PSCLCR_LACC_SHIFT (27U) +#define LMEM_PSCLCR_LACC(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCLCR_LACC_SHIFT)) & LMEM_PSCLCR_LACC_MASK) + +/*! @name PSCSAR - Cache search address register */ +#define LMEM_PSCSAR_LGO_MASK (0x1U) +#define LMEM_PSCSAR_LGO_SHIFT (0U) +#define LMEM_PSCSAR_LGO(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCSAR_LGO_SHIFT)) & LMEM_PSCSAR_LGO_MASK) +#define LMEM_PSCSAR_PHYADDR_MASK (0xFFFFFFFCU) +#define LMEM_PSCSAR_PHYADDR_SHIFT (2U) +#define LMEM_PSCSAR_PHYADDR(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCSAR_PHYADDR_SHIFT)) & LMEM_PSCSAR_PHYADDR_MASK) + +/*! @name PSCCVR - Cache read/write value register */ +#define LMEM_PSCCVR_DATA_MASK (0xFFFFFFFFU) +#define LMEM_PSCCVR_DATA_SHIFT (0U) +#define LMEM_PSCCVR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCCVR_DATA_SHIFT)) & LMEM_PSCCVR_DATA_MASK) + +/*! @name PSCRMR - Cache regions mode register */ +#define LMEM_PSCRMR_R15_MASK (0x3U) +#define LMEM_PSCRMR_R15_SHIFT (0U) +#define LMEM_PSCRMR_R15(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R15_SHIFT)) & LMEM_PSCRMR_R15_MASK) +#define LMEM_PSCRMR_R14_MASK (0xCU) +#define LMEM_PSCRMR_R14_SHIFT (2U) +#define LMEM_PSCRMR_R14(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R14_SHIFT)) & LMEM_PSCRMR_R14_MASK) +#define LMEM_PSCRMR_R13_MASK (0x30U) +#define LMEM_PSCRMR_R13_SHIFT (4U) +#define LMEM_PSCRMR_R13(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R13_SHIFT)) & LMEM_PSCRMR_R13_MASK) +#define LMEM_PSCRMR_R12_MASK (0xC0U) +#define LMEM_PSCRMR_R12_SHIFT (6U) +#define LMEM_PSCRMR_R12(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R12_SHIFT)) & LMEM_PSCRMR_R12_MASK) +#define LMEM_PSCRMR_R11_MASK (0x300U) +#define LMEM_PSCRMR_R11_SHIFT (8U) +#define LMEM_PSCRMR_R11(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R11_SHIFT)) & LMEM_PSCRMR_R11_MASK) +#define LMEM_PSCRMR_R10_MASK (0xC00U) +#define LMEM_PSCRMR_R10_SHIFT (10U) +#define LMEM_PSCRMR_R10(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R10_SHIFT)) & LMEM_PSCRMR_R10_MASK) +#define LMEM_PSCRMR_R9_MASK (0x3000U) +#define LMEM_PSCRMR_R9_SHIFT (12U) +#define LMEM_PSCRMR_R9(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R9_SHIFT)) & LMEM_PSCRMR_R9_MASK) +#define LMEM_PSCRMR_R8_MASK (0xC000U) +#define LMEM_PSCRMR_R8_SHIFT (14U) +#define LMEM_PSCRMR_R8(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R8_SHIFT)) & LMEM_PSCRMR_R8_MASK) +#define LMEM_PSCRMR_R7_MASK (0x30000U) +#define LMEM_PSCRMR_R7_SHIFT (16U) +#define LMEM_PSCRMR_R7(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R7_SHIFT)) & LMEM_PSCRMR_R7_MASK) +#define LMEM_PSCRMR_R6_MASK (0xC0000U) +#define LMEM_PSCRMR_R6_SHIFT (18U) +#define LMEM_PSCRMR_R6(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R6_SHIFT)) & LMEM_PSCRMR_R6_MASK) +#define LMEM_PSCRMR_R5_MASK (0x300000U) +#define LMEM_PSCRMR_R5_SHIFT (20U) +#define LMEM_PSCRMR_R5(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R5_SHIFT)) & LMEM_PSCRMR_R5_MASK) +#define LMEM_PSCRMR_R4_MASK (0xC00000U) +#define LMEM_PSCRMR_R4_SHIFT (22U) +#define LMEM_PSCRMR_R4(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R4_SHIFT)) & LMEM_PSCRMR_R4_MASK) +#define LMEM_PSCRMR_R3_MASK (0x3000000U) +#define LMEM_PSCRMR_R3_SHIFT (24U) +#define LMEM_PSCRMR_R3(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R3_SHIFT)) & LMEM_PSCRMR_R3_MASK) +#define LMEM_PSCRMR_R2_MASK (0xC000000U) +#define LMEM_PSCRMR_R2_SHIFT (26U) +#define LMEM_PSCRMR_R2(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R2_SHIFT)) & LMEM_PSCRMR_R2_MASK) +#define LMEM_PSCRMR_R1_MASK (0x30000000U) +#define LMEM_PSCRMR_R1_SHIFT (28U) +#define LMEM_PSCRMR_R1(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R1_SHIFT)) & LMEM_PSCRMR_R1_MASK) +#define LMEM_PSCRMR_R0_MASK (0xC0000000U) +#define LMEM_PSCRMR_R0_SHIFT (30U) +#define LMEM_PSCRMR_R0(x) (((uint32_t)(((uint32_t)(x)) << LMEM_PSCRMR_R0_SHIFT)) & LMEM_PSCRMR_R0_MASK) + + +/*! + * @} + */ /* end of group LMEM_Register_Masks */ + + +/* LMEM - Peripheral instance base addresses */ +/** Peripheral LMEM base pointer */ +#define LMEM ((LMEM_Type *)LMEM_BASE) +/** Array initializer of LMEM peripheral base addresses */ +#define LMEM_BASE_ADDRS { LMEM_BASE } +/** Array initializer of LMEM peripheral base pointers */ +#define LMEM_BASE_PTRS { LMEM } + +/*! + * @} + */ /* end of group LMEM_Peripheral_Access_Layer */ + +#endif /* HW_LMEM_CACHE_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_lpc.h b/platform/devices/MX8/MX8_lpc.h new file mode 100755 index 0000000..2735a56 --- /dev/null +++ b/platform/devices/MX8/MX8_lpc.h @@ -0,0 +1,181 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LPC_REGISTERS_H +#define HW_LPC_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- LPC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +#define LPC_NUM_STAGES 7 + +/*! + * @addtogroup LPC_Peripheral_Access_Layer LPC Peripheral Access Layer + * @{ + */ + +/** LPC_CTRL - Register Layout Typedef */ +typedef struct { + __IO uint32_t LPC_PC[LPC_NUM_STAGES]; /**< Power Control Register N, offset: 0x0 */ + __IO uint32_t LPC_CR; /**< Configuration Register, offset: 0x1C */ + __IO uint32_t LPC_ED[LPC_NUM_STAGES]; /**< Entry Delay Register N, offset: 0x20 */ + uint32_t RESERVED_0[1]; + __IO uint32_t LPC_XD[LPC_NUM_STAGES]; /**< Exit Delay Register N, offset: 0x40 */ +} LPC_Type, *LPC_MemMapPtr; + + +/* ---------------------------------------------------------------------------- + -- LPC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPC_Register_Masks LPC Register Masks + * @{ + */ + +/* LPC_PC Bit Fields */ +/* LPC_CR Bit Fields */ +/* LPC_ED Bit Fields */ +/* LPC_XD Bit Fields */ + +#define LPC_LOW_FANOUT_BIT 0U +#define LPC_HIGH_FANOUT_BIT 1U +#define LPC_INPUT_ISO_BIT 2U +#define LPC_OUTPUT_ISO_BIT 3U +#define LPC_SW_RESETN_BIT 4U +#define LPC_PD_CONTROL_BIT 8U +#define LPC_MEM_LS_CONTROL_BIT 10U +#define LPC_MEM_HS_CONTROL_BIT 11U +#define LPC_RFF_BIT 12U +#define LPC_MEM_SLEEP_BIT 13U +#define LPC_MEM_STDBY_BIT 14U +#define LPC_MEM_IG_BIT 15U +#define LPC_TCM_SMALL_MA_BIT 16U +#define LPC_TCM_LARGE_MA_BIT 17U +#define LPC_CM4_SMALL_MA_BIT 18U +#define LPC_CM4_LARGE_MA_BIT 19U +#define LPC_NSR_SMALL_MA_BIT 20U +#define LPC_NSR_LARGE_MA_BIT 21U +#define LPC_CM0_RAM_SMALL_MA_BIT 22U +#define LPC_CM0_RAM_LARGE_MA_BIT 23U + +#define LPC_LOW_FANOUT BIT(LPC_LOW_FANOUT_BIT) +#define LPC_HIGH_FANOUT BIT(LPC_HIGH_FANOUT_BIT) +#define LPC_INPUT_ISO BIT(LPC_INPUT_ISO_BIT) +#define LPC_OUTPUT_ISO BIT(LPC_OUTPUT_ISO_BIT) +#define LPC_SW_RESETN BIT(LPC_SW_RESETN_BIT) +#define LPC_PD_CONTROL BIT(LPC_PD_CONTROL_BIT) +#define LPC_MEM_LS_CONTROL BIT(LPC_MEM_LS_CONTROL_BIT) +#define LPC_MEM_HS_CONTROL BIT(LPC_MEM_HS_CONTROL_BIT) +#define LPC_RFF BIT(LPC_RFF_BIT) +#define LPC_MEM_SLEEP BIT(LPC_MEM_SLEEP_BIT) +#define LPC_MEM_STDBY BIT(LPC_MEM_STDBY_BIT) +#define LPC_MEM_IG BIT(LPC_MEM_IG_BIT) +#define LPC_TCM_SMALL_MA BIT(LPC_TCM_SMALL_MA_BIT) +#define LPC_TCM_LARGE_MA BIT(LPC_TCM_LARGE_MA_BIT) +#define LPC_CM4_SMALL_MA BIT(LPC_CM4_SMALL_MA_BIT) +#define LPC_CM4_LARGE_MA BIT(LPC_CM4_LARGE_MA_BIT) +#define LPC_NSR_SMALL_MA BIT(LPC_NSR_SMALL_MA_BIT) +#define LPC_NSR_LARGE_MA BIT(LPC_NSR_LARGE_MA_BIT) +#define LPC_CM0_RAM_SMALL_MA BIT(LPC_CM0_RAM_SMALL_MA_BIT) +#define LPC_CM0_RAM_LARGE_MA BIT(LPC_CM0_RAM_LARGE_MA_BIT) + +#define LPC_CR__ROSC_DISABLE 0U +#define LPC_CR__PMIC_STBY 1U +#define LPC_CR__PWRCTRL_MUXSEL 2U +#define LPC_CR__LPC_CLOCK_SEL 4U +#define LPC_CR__LPC_CLOCK_STOP 6U +#define LPC_CR__LPC_CLOCK_GATE 7U + +#define LPC_CLK_25M 0U +#define LPC_CLK_1M 1U +#define LPC_CLK_32K 2U + +typedef uint8_t clk_sel_t; + +#define DSC_PWR_SEL 0U +#define LPC_PWR_SEL 1U + +typedef uint8_t pwr_ctrl_mux_sel_t; + +#define ROSC_EN 0U +#define ROSC_DIS 1U + +typedef uint8_t rosc_dis_t; + +#define PMIC_STDBY_NAST 0U +#define PMIC_STDBY_AST 1U + +typedef uint8_t pmic_stdby_t; + +/*! + * @} + */ /* end of group LPC_Register_Masks */ + + +/** Peripheral LPC base pointer */ +#define LPC ((LPC_Type *)LPC_BASE) + +/* ---------------------------------------------------------------------------- + -- LPC - Register accessor macros + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPC_Register_Accessor_Macros LPC - Register accessor macros + * @{ + */ + + + + +/*! + * @} + */ /* end of group LPC_Peripheral_Access_Layer */ + +#endif /* HW_LPC_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_lpcg.h b/platform/devices/MX8/MX8_lpcg.h new file mode 100755 index 0000000..b6f0c19 --- /dev/null +++ b/platform/devices/MX8/MX8_lpcg.h @@ -0,0 +1,96 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LPCG_REGISTERS_H +#define HW_LPCG_REGISTERS_H + +#include "lpcg.h" + +/* + * LPCG access macros + */ +#define HW_LPCG_ADDR(lpcg) ((lpcg##__BASE) + (lpcg##__REG)) +#define HW_LPCG_RD(lpcg) (*(volatile uint32_t *)(HW_LPCG_ADDR(lpcg))) +#define HW_LPCG_WR(lpcg, val) (*(volatile uint32_t *)(HW_LPCG_ADDR(lpcg)) = (val)) +#define HW_LPCG_BMSK(lpcg, bit) (1U << (lpcg##__##bit)) +#define HW_LPCG_BSET(lpcg, bit) (HW_LPCG_WR(lpcg, HW_LPCG_RD(lpcg) | HW_LPCG_BMSK(lpcg, bit))) +#define HW_LPCG_BCLR(lpcg, bit) (HW_LPCG_WR(lpcg, HW_LPCG_RD(lpcg) & (~(HW_LPCG_BMSK(lpcg, bit))))) + +/* + * LPCG base addresses + */ +#define LPCG__SS_SCU__CM4__TCMC_HCLK__BASE 0x415E0000U + +#define LPCG__SS_SCU__CM4__MMCAU_HCLK__BASE 0x415F0000U + +#define LPCG__SS_SCU__TPM1__IPG_CLK__BASE 0x41600000U +#define LPCG__SS_SCU__TPM1__LPTPM_CLK__BASE 0x41600000U + +#define LPCG__SS_SCU__LPIT1__IPG_CLK__BASE 0x41610000U +#define LPCG__SS_SCU__LPIT1__IPG_PER_CLK__BASE 0x41610000U +#define LPCG__SS_SCU__LPIT1__IPG_UNGATED_PER_CLK__BASE 0x41610000U + +#define LPCG__SS_SCU__LPUART1__IPG_CLK__BASE 0x41620000U +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_CLK__BASE 0x41620000U +#define LPCG__SS_SCU__LPUART1__LPUART_BAUD_GATED_CLK__BASE 0x41620000U + +#define LPCG__SS_SCU__LPI2C1__IPG_CLK__BASE 0x41630000U +#define LPCG__SS_SCU__LPI2C1__LPI2C_CLK__BASE 0x41630000U +#define LPCG__SS_SCU__LPI2C1__LPI2C_DIV_CLK__BASE 0x41630000U + +/* + * LPCG common bit definitions + */ +#define LPCG__SS_SCU__PER_CLK__HWEN 0U +#define LPCG__SS_SCU__PER_CLK__SWEN 1U +#define LPCG__SS_SCU__PER_CLK__STOP 3U + +#define LPCG__SS_SCU__IPG_CLK__HWEN 4U +#define LPCG__SS_SCU__IPG_CLK__SWEN 5U +#define LPCG__SS_SCU__IPG_CLK__STOP 7U + + +#endif /* HW_LPCG_REGISTERS_H */ + diff --git a/platform/devices/MX8/MX8_lpi2c.h b/platform/devices/MX8/MX8_lpi2c.h new file mode 100755 index 0000000..9b4b822 --- /dev/null +++ b/platform/devices/MX8/MX8_lpi2c.h @@ -0,0 +1,640 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LPI2C_REGISTERS_H +#define HW_LPI2C_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- LPI2C Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPI2C_Peripheral_Access_Layer LPI2C Peripheral Access Layer + * @{ + */ + +/** LPI2C - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ + uint8_t RESERVED_0[8]; + __IO uint32_t MCR; /**< Master Control Register, offset: 0x10 */ + __IO uint32_t MSR; /**< Master Status Register, offset: 0x14 */ + __IO uint32_t MIER; /**< Master Interrupt Enable Register, offset: 0x18 */ + __IO uint32_t MDER; /**< Master DMA Enable Register, offset: 0x1C */ + __IO uint32_t MCFGR0; /**< Master Configuration Register 0, offset: 0x20 */ + __IO uint32_t MCFGR1; /**< Master Configuration Register 1, offset: 0x24 */ + __IO uint32_t MCFGR2; /**< Master Configuration Register 2, offset: 0x28 */ + __IO uint32_t MCFGR3; /**< Master Configuration Register 3, offset: 0x2C */ + uint8_t RESERVED_1[16]; + __IO uint32_t MDMR; /**< Master Data Match Register, offset: 0x40 */ + uint8_t RESERVED_2[4]; + __IO uint32_t MCCR0; /**< Master Clock Configuration Register 0, offset: 0x48 */ + uint8_t RESERVED_3[4]; + __IO uint32_t MCCR1; /**< Master Clock Configuration Register 1, offset: 0x50 */ + uint8_t RESERVED_4[4]; + __IO uint32_t MFCR; /**< Master FIFO Control Register, offset: 0x58 */ + __I uint32_t MFSR; /**< Master FIFO Status Register, offset: 0x5C */ + __O uint32_t MTDR; /**< Master Transmit Data Register, offset: 0x60 */ + uint8_t RESERVED_5[12]; + __I uint32_t MRDR; /**< Master Receive Data Register, offset: 0x70 */ + uint8_t RESERVED_6[156]; + __IO uint32_t SCR; /**< Slave Control Register, offset: 0x110 */ + __IO uint32_t SSR; /**< Slave Status Register, offset: 0x114 */ + __IO uint32_t SIER; /**< Slave Interrupt Enable Register, offset: 0x118 */ + __IO uint32_t SDER; /**< Slave DMA Enable Register, offset: 0x11C */ + uint8_t RESERVED_7[4]; + __IO uint32_t SCFGR1; /**< Slave Configuration Register 1, offset: 0x124 */ + __IO uint32_t SCFGR2; /**< Slave Configuration Register 2, offset: 0x128 */ + uint8_t RESERVED_8[20]; + __IO uint32_t SAMR; /**< Slave Address Match Register, offset: 0x140 */ + uint8_t RESERVED_9[12]; + __I uint32_t SASR; /**< Slave Address Status Register, offset: 0x150 */ + __IO uint32_t STAR; /**< Slave Transmit ACK Register, offset: 0x154 */ + uint8_t RESERVED_10[8]; + __O uint32_t STDR; /**< Slave Transmit Data Register, offset: 0x160 */ + uint8_t RESERVED_11[12]; + __I uint32_t SRDR; /**< Slave Receive Data Register, offset: 0x170 */ +} LPI2C_Type; + +/* ---------------------------------------------------------------------------- + -- LPI2C Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPI2C_Register_Masks LPI2C Register Masks + * @{ + */ + +/*! @name VERID - Version ID Register */ +#define LPI2C_VERID_FEATURE_MASK (0xFFFFU) +#define LPI2C_VERID_FEATURE_SHIFT (0U) +#define LPI2C_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_FEATURE_SHIFT)) & LPI2C_VERID_FEATURE_MASK) +#define LPI2C_VERID_MINOR_MASK (0xFF0000U) +#define LPI2C_VERID_MINOR_SHIFT (16U) +#define LPI2C_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MINOR_SHIFT)) & LPI2C_VERID_MINOR_MASK) +#define LPI2C_VERID_MAJOR_MASK (0xFF000000U) +#define LPI2C_VERID_MAJOR_SHIFT (24U) +#define LPI2C_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MAJOR_SHIFT)) & LPI2C_VERID_MAJOR_MASK) + +/*! @name PARAM - Parameter Register */ +#define LPI2C_PARAM_MTXFIFO_MASK (0xFU) +#define LPI2C_PARAM_MTXFIFO_SHIFT (0U) +#define LPI2C_PARAM_MTXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MTXFIFO_SHIFT)) & LPI2C_PARAM_MTXFIFO_MASK) +#define LPI2C_PARAM_MRXFIFO_MASK (0xF00U) +#define LPI2C_PARAM_MRXFIFO_SHIFT (8U) +#define LPI2C_PARAM_MRXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MRXFIFO_SHIFT)) & LPI2C_PARAM_MRXFIFO_MASK) + +/*! @name MCR - Master Control Register */ +#define LPI2C_MCR_MEN_MASK (0x1U) +#define LPI2C_MCR_MEN_SHIFT (0U) +#define LPI2C_MCR_MEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_MEN_SHIFT)) & LPI2C_MCR_MEN_MASK) +#define LPI2C_MCR_RST_MASK (0x2U) +#define LPI2C_MCR_RST_SHIFT (1U) +#define LPI2C_MCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RST_SHIFT)) & LPI2C_MCR_RST_MASK) +#define LPI2C_MCR_DOZEN_MASK (0x4U) +#define LPI2C_MCR_DOZEN_SHIFT (2U) +#define LPI2C_MCR_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DOZEN_SHIFT)) & LPI2C_MCR_DOZEN_MASK) +#define LPI2C_MCR_DBGEN_MASK (0x8U) +#define LPI2C_MCR_DBGEN_SHIFT (3U) +#define LPI2C_MCR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DBGEN_SHIFT)) & LPI2C_MCR_DBGEN_MASK) +#define LPI2C_MCR_RTF_MASK (0x100U) +#define LPI2C_MCR_RTF_SHIFT (8U) +#define LPI2C_MCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RTF_SHIFT)) & LPI2C_MCR_RTF_MASK) +#define LPI2C_MCR_RRF_MASK (0x200U) +#define LPI2C_MCR_RRF_SHIFT (9U) +#define LPI2C_MCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RRF_SHIFT)) & LPI2C_MCR_RRF_MASK) + +/*! @name MSR - Master Status Register */ +#define LPI2C_MSR_TDF_MASK (0x1U) +#define LPI2C_MSR_TDF_SHIFT (0U) +#define LPI2C_MSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_TDF_SHIFT)) & LPI2C_MSR_TDF_MASK) +#define LPI2C_MSR_RDF_MASK (0x2U) +#define LPI2C_MSR_RDF_SHIFT (1U) +#define LPI2C_MSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_RDF_SHIFT)) & LPI2C_MSR_RDF_MASK) +#define LPI2C_MSR_EPF_MASK (0x100U) +#define LPI2C_MSR_EPF_SHIFT (8U) +#define LPI2C_MSR_EPF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_EPF_SHIFT)) & LPI2C_MSR_EPF_MASK) +#define LPI2C_MSR_SDF_MASK (0x200U) +#define LPI2C_MSR_SDF_SHIFT (9U) +#define LPI2C_MSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_SDF_SHIFT)) & LPI2C_MSR_SDF_MASK) +#define LPI2C_MSR_NDF_MASK (0x400U) +#define LPI2C_MSR_NDF_SHIFT (10U) +#define LPI2C_MSR_NDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_NDF_SHIFT)) & LPI2C_MSR_NDF_MASK) +#define LPI2C_MSR_ALF_MASK (0x800U) +#define LPI2C_MSR_ALF_SHIFT (11U) +#define LPI2C_MSR_ALF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_ALF_SHIFT)) & LPI2C_MSR_ALF_MASK) +#define LPI2C_MSR_FEF_MASK (0x1000U) +#define LPI2C_MSR_FEF_SHIFT (12U) +#define LPI2C_MSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_FEF_SHIFT)) & LPI2C_MSR_FEF_MASK) +#define LPI2C_MSR_PLTF_MASK (0x2000U) +#define LPI2C_MSR_PLTF_SHIFT (13U) +#define LPI2C_MSR_PLTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_PLTF_SHIFT)) & LPI2C_MSR_PLTF_MASK) +#define LPI2C_MSR_DMF_MASK (0x4000U) +#define LPI2C_MSR_DMF_SHIFT (14U) +#define LPI2C_MSR_DMF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_DMF_SHIFT)) & LPI2C_MSR_DMF_MASK) +#define LPI2C_MSR_MBF_MASK (0x1000000U) +#define LPI2C_MSR_MBF_SHIFT (24U) +#define LPI2C_MSR_MBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_MBF_SHIFT)) & LPI2C_MSR_MBF_MASK) +#define LPI2C_MSR_BBF_MASK (0x2000000U) +#define LPI2C_MSR_BBF_SHIFT (25U) +#define LPI2C_MSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_BBF_SHIFT)) & LPI2C_MSR_BBF_MASK) + +/*! @name MIER - Master Interrupt Enable Register */ +#define LPI2C_MIER_TDIE_MASK (0x1U) +#define LPI2C_MIER_TDIE_SHIFT (0U) +#define LPI2C_MIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_TDIE_SHIFT)) & LPI2C_MIER_TDIE_MASK) +#define LPI2C_MIER_RDIE_MASK (0x2U) +#define LPI2C_MIER_RDIE_SHIFT (1U) +#define LPI2C_MIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_RDIE_SHIFT)) & LPI2C_MIER_RDIE_MASK) +#define LPI2C_MIER_EPIE_MASK (0x100U) +#define LPI2C_MIER_EPIE_SHIFT (8U) +#define LPI2C_MIER_EPIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_EPIE_SHIFT)) & LPI2C_MIER_EPIE_MASK) +#define LPI2C_MIER_SDIE_MASK (0x200U) +#define LPI2C_MIER_SDIE_SHIFT (9U) +#define LPI2C_MIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_SDIE_SHIFT)) & LPI2C_MIER_SDIE_MASK) +#define LPI2C_MIER_NDIE_MASK (0x400U) +#define LPI2C_MIER_NDIE_SHIFT (10U) +#define LPI2C_MIER_NDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_NDIE_SHIFT)) & LPI2C_MIER_NDIE_MASK) +#define LPI2C_MIER_ALIE_MASK (0x800U) +#define LPI2C_MIER_ALIE_SHIFT (11U) +#define LPI2C_MIER_ALIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_ALIE_SHIFT)) & LPI2C_MIER_ALIE_MASK) +#define LPI2C_MIER_FEIE_MASK (0x1000U) +#define LPI2C_MIER_FEIE_SHIFT (12U) +#define LPI2C_MIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_FEIE_SHIFT)) & LPI2C_MIER_FEIE_MASK) +#define LPI2C_MIER_PLTIE_MASK (0x2000U) +#define LPI2C_MIER_PLTIE_SHIFT (13U) +#define LPI2C_MIER_PLTIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_PLTIE_SHIFT)) & LPI2C_MIER_PLTIE_MASK) +#define LPI2C_MIER_DMIE_MASK (0x4000U) +#define LPI2C_MIER_DMIE_SHIFT (14U) +#define LPI2C_MIER_DMIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_DMIE_SHIFT)) & LPI2C_MIER_DMIE_MASK) + +/*! @name MDER - Master DMA Enable Register */ +#define LPI2C_MDER_TDDE_MASK (0x1U) +#define LPI2C_MDER_TDDE_SHIFT (0U) +#define LPI2C_MDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_TDDE_SHIFT)) & LPI2C_MDER_TDDE_MASK) +#define LPI2C_MDER_RDDE_MASK (0x2U) +#define LPI2C_MDER_RDDE_SHIFT (1U) +#define LPI2C_MDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_RDDE_SHIFT)) & LPI2C_MDER_RDDE_MASK) + +/*! @name MCFGR0 - Master Configuration Register 0 */ +#define LPI2C_MCFGR0_HREN_MASK (0x1U) +#define LPI2C_MCFGR0_HREN_SHIFT (0U) +#define LPI2C_MCFGR0_HREN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HREN_SHIFT)) & LPI2C_MCFGR0_HREN_MASK) +#define LPI2C_MCFGR0_HRPOL_MASK (0x2U) +#define LPI2C_MCFGR0_HRPOL_SHIFT (1U) +#define LPI2C_MCFGR0_HRPOL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRPOL_SHIFT)) & LPI2C_MCFGR0_HRPOL_MASK) +#define LPI2C_MCFGR0_HRSEL_MASK (0x4U) +#define LPI2C_MCFGR0_HRSEL_SHIFT (2U) +#define LPI2C_MCFGR0_HRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRSEL_SHIFT)) & LPI2C_MCFGR0_HRSEL_MASK) +#define LPI2C_MCFGR0_CIRFIFO_MASK (0x100U) +#define LPI2C_MCFGR0_CIRFIFO_SHIFT (8U) +#define LPI2C_MCFGR0_CIRFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_CIRFIFO_SHIFT)) & LPI2C_MCFGR0_CIRFIFO_MASK) +#define LPI2C_MCFGR0_RDMO_MASK (0x200U) +#define LPI2C_MCFGR0_RDMO_SHIFT (9U) +#define LPI2C_MCFGR0_RDMO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_RDMO_SHIFT)) & LPI2C_MCFGR0_RDMO_MASK) + +/*! @name MCFGR1 - Master Configuration Register 1 */ +#define LPI2C_MCFGR1_PRESCALE_MASK (0x7U) +#define LPI2C_MCFGR1_PRESCALE_SHIFT (0U) +#define LPI2C_MCFGR1_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PRESCALE_SHIFT)) & LPI2C_MCFGR1_PRESCALE_MASK) +#define LPI2C_MCFGR1_AUTOSTOP_MASK (0x100U) +#define LPI2C_MCFGR1_AUTOSTOP_SHIFT (8U) +#define LPI2C_MCFGR1_AUTOSTOP(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_AUTOSTOP_SHIFT)) & LPI2C_MCFGR1_AUTOSTOP_MASK) +#define LPI2C_MCFGR1_IGNACK_MASK (0x200U) +#define LPI2C_MCFGR1_IGNACK_SHIFT (9U) +#define LPI2C_MCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_IGNACK_SHIFT)) & LPI2C_MCFGR1_IGNACK_MASK) +#define LPI2C_MCFGR1_TIMECFG_MASK (0x400U) +#define LPI2C_MCFGR1_TIMECFG_SHIFT (10U) +#define LPI2C_MCFGR1_TIMECFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_TIMECFG_SHIFT)) & LPI2C_MCFGR1_TIMECFG_MASK) +#define LPI2C_MCFGR1_MATCFG_MASK (0x70000U) +#define LPI2C_MCFGR1_MATCFG_SHIFT (16U) +#define LPI2C_MCFGR1_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_MATCFG_SHIFT)) & LPI2C_MCFGR1_MATCFG_MASK) +#define LPI2C_MCFGR1_PINCFG_MASK (0x7000000U) +#define LPI2C_MCFGR1_PINCFG_SHIFT (24U) +#define LPI2C_MCFGR1_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PINCFG_SHIFT)) & LPI2C_MCFGR1_PINCFG_MASK) + +/*! @name MCFGR2 - Master Configuration Register 2 */ +#define LPI2C_MCFGR2_BUSIDLE_MASK (0xFFFU) +#define LPI2C_MCFGR2_BUSIDLE_SHIFT (0U) +#define LPI2C_MCFGR2_BUSIDLE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_BUSIDLE_SHIFT)) & LPI2C_MCFGR2_BUSIDLE_MASK) +#define LPI2C_MCFGR2_FILTSCL_MASK (0xF0000U) +#define LPI2C_MCFGR2_FILTSCL_SHIFT (16U) +#define LPI2C_MCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSCL_SHIFT)) & LPI2C_MCFGR2_FILTSCL_MASK) +#define LPI2C_MCFGR2_FILTSDA_MASK (0xF000000U) +#define LPI2C_MCFGR2_FILTSDA_SHIFT (24U) +#define LPI2C_MCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSDA_SHIFT)) & LPI2C_MCFGR2_FILTSDA_MASK) + +/*! @name MCFGR3 - Master Configuration Register 3 */ +#define LPI2C_MCFGR3_PINLOW_MASK (0xFFF00U) +#define LPI2C_MCFGR3_PINLOW_SHIFT (8U) +#define LPI2C_MCFGR3_PINLOW(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR3_PINLOW_SHIFT)) & LPI2C_MCFGR3_PINLOW_MASK) + +/*! @name MDMR - Master Data Match Register */ +#define LPI2C_MDMR_MATCH0_MASK (0xFFU) +#define LPI2C_MDMR_MATCH0_SHIFT (0U) +#define LPI2C_MDMR_MATCH0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH0_SHIFT)) & LPI2C_MDMR_MATCH0_MASK) +#define LPI2C_MDMR_MATCH1_MASK (0xFF0000U) +#define LPI2C_MDMR_MATCH1_SHIFT (16U) +#define LPI2C_MDMR_MATCH1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH1_SHIFT)) & LPI2C_MDMR_MATCH1_MASK) + +/*! @name MCCR0 - Master Clock Configuration Register 0 */ +#define LPI2C_MCCR0_CLKLO_MASK (0x3FU) +#define LPI2C_MCCR0_CLKLO_SHIFT (0U) +#define LPI2C_MCCR0_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKLO_SHIFT)) & LPI2C_MCCR0_CLKLO_MASK) +#define LPI2C_MCCR0_CLKHI_MASK (0x3F00U) +#define LPI2C_MCCR0_CLKHI_SHIFT (8U) +#define LPI2C_MCCR0_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKHI_SHIFT)) & LPI2C_MCCR0_CLKHI_MASK) +#define LPI2C_MCCR0_SETHOLD_MASK (0x3F0000U) +#define LPI2C_MCCR0_SETHOLD_SHIFT (16U) +#define LPI2C_MCCR0_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_SETHOLD_SHIFT)) & LPI2C_MCCR0_SETHOLD_MASK) +#define LPI2C_MCCR0_DATAVD_MASK (0x3F000000U) +#define LPI2C_MCCR0_DATAVD_SHIFT (24U) +#define LPI2C_MCCR0_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_DATAVD_SHIFT)) & LPI2C_MCCR0_DATAVD_MASK) + +/*! @name MCCR1 - Master Clock Configuration Register 1 */ +#define LPI2C_MCCR1_CLKLO_MASK (0x3FU) +#define LPI2C_MCCR1_CLKLO_SHIFT (0U) +#define LPI2C_MCCR1_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKLO_SHIFT)) & LPI2C_MCCR1_CLKLO_MASK) +#define LPI2C_MCCR1_CLKHI_MASK (0x3F00U) +#define LPI2C_MCCR1_CLKHI_SHIFT (8U) +#define LPI2C_MCCR1_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKHI_SHIFT)) & LPI2C_MCCR1_CLKHI_MASK) +#define LPI2C_MCCR1_SETHOLD_MASK (0x3F0000U) +#define LPI2C_MCCR1_SETHOLD_SHIFT (16U) +#define LPI2C_MCCR1_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_SETHOLD_SHIFT)) & LPI2C_MCCR1_SETHOLD_MASK) +#define LPI2C_MCCR1_DATAVD_MASK (0x3F000000U) +#define LPI2C_MCCR1_DATAVD_SHIFT (24U) +#define LPI2C_MCCR1_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_DATAVD_SHIFT)) & LPI2C_MCCR1_DATAVD_MASK) + +/*! @name MFCR - Master FIFO Control Register */ +#define LPI2C_MFCR_TXWATER_MASK (0xFFU) +#define LPI2C_MFCR_TXWATER_SHIFT (0U) +#define LPI2C_MFCR_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_TXWATER_SHIFT)) & LPI2C_MFCR_TXWATER_MASK) +#define LPI2C_MFCR_RXWATER_MASK (0xFF0000U) +#define LPI2C_MFCR_RXWATER_SHIFT (16U) +#define LPI2C_MFCR_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_RXWATER_SHIFT)) & LPI2C_MFCR_RXWATER_MASK) + +/*! @name MFSR - Master FIFO Status Register */ +#define LPI2C_MFSR_TXCOUNT_MASK (0xFFU) +#define LPI2C_MFSR_TXCOUNT_SHIFT (0U) +#define LPI2C_MFSR_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_TXCOUNT_SHIFT)) & LPI2C_MFSR_TXCOUNT_MASK) +#define LPI2C_MFSR_RXCOUNT_MASK (0xFF0000U) +#define LPI2C_MFSR_RXCOUNT_SHIFT (16U) +#define LPI2C_MFSR_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_RXCOUNT_SHIFT)) & LPI2C_MFSR_RXCOUNT_MASK) + +/*! @name MTDR - Master Transmit Data Register */ +#define LPI2C_MTDR_DATA_MASK (0xFFU) +#define LPI2C_MTDR_DATA_SHIFT (0U) +#define LPI2C_MTDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_DATA_SHIFT)) & LPI2C_MTDR_DATA_MASK) +#define LPI2C_MTDR_CMD_MASK (0x700U) +#define LPI2C_MTDR_CMD_SHIFT (8U) +#define LPI2C_MTDR_CMD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_CMD_SHIFT)) & LPI2C_MTDR_CMD_MASK) + +/*! @name MRDR - Master Receive Data Register */ +#define LPI2C_MRDR_DATA_MASK (0xFFU) +#define LPI2C_MRDR_DATA_SHIFT (0U) +#define LPI2C_MRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_DATA_SHIFT)) & LPI2C_MRDR_DATA_MASK) +#define LPI2C_MRDR_RXEMPTY_MASK (0x4000U) +#define LPI2C_MRDR_RXEMPTY_SHIFT (14U) +#define LPI2C_MRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_RXEMPTY_SHIFT)) & LPI2C_MRDR_RXEMPTY_MASK) + +/*! @name SCR - Slave Control Register */ +#define LPI2C_SCR_SEN_MASK (0x1U) +#define LPI2C_SCR_SEN_SHIFT (0U) +#define LPI2C_SCR_SEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_SEN_SHIFT)) & LPI2C_SCR_SEN_MASK) +#define LPI2C_SCR_RST_MASK (0x2U) +#define LPI2C_SCR_RST_SHIFT (1U) +#define LPI2C_SCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RST_SHIFT)) & LPI2C_SCR_RST_MASK) +#define LPI2C_SCR_FILTEN_MASK (0x10U) +#define LPI2C_SCR_FILTEN_SHIFT (4U) +#define LPI2C_SCR_FILTEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTEN_SHIFT)) & LPI2C_SCR_FILTEN_MASK) +#define LPI2C_SCR_FILTDZ_MASK (0x20U) +#define LPI2C_SCR_FILTDZ_SHIFT (5U) +#define LPI2C_SCR_FILTDZ(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTDZ_SHIFT)) & LPI2C_SCR_FILTDZ_MASK) +#define LPI2C_SCR_RTF_MASK (0x100U) +#define LPI2C_SCR_RTF_SHIFT (8U) +#define LPI2C_SCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RTF_SHIFT)) & LPI2C_SCR_RTF_MASK) +#define LPI2C_SCR_RRF_MASK (0x200U) +#define LPI2C_SCR_RRF_SHIFT (9U) +#define LPI2C_SCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RRF_SHIFT)) & LPI2C_SCR_RRF_MASK) + +/*! @name SSR - Slave Status Register */ +#define LPI2C_SSR_TDF_MASK (0x1U) +#define LPI2C_SSR_TDF_SHIFT (0U) +#define LPI2C_SSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TDF_SHIFT)) & LPI2C_SSR_TDF_MASK) +#define LPI2C_SSR_RDF_MASK (0x2U) +#define LPI2C_SSR_RDF_SHIFT (1U) +#define LPI2C_SSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RDF_SHIFT)) & LPI2C_SSR_RDF_MASK) +#define LPI2C_SSR_AVF_MASK (0x4U) +#define LPI2C_SSR_AVF_SHIFT (2U) +#define LPI2C_SSR_AVF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AVF_SHIFT)) & LPI2C_SSR_AVF_MASK) +#define LPI2C_SSR_TAF_MASK (0x8U) +#define LPI2C_SSR_TAF_SHIFT (3U) +#define LPI2C_SSR_TAF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TAF_SHIFT)) & LPI2C_SSR_TAF_MASK) +#define LPI2C_SSR_RSF_MASK (0x100U) +#define LPI2C_SSR_RSF_SHIFT (8U) +#define LPI2C_SSR_RSF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RSF_SHIFT)) & LPI2C_SSR_RSF_MASK) +#define LPI2C_SSR_SDF_MASK (0x200U) +#define LPI2C_SSR_SDF_SHIFT (9U) +#define LPI2C_SSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SDF_SHIFT)) & LPI2C_SSR_SDF_MASK) +#define LPI2C_SSR_BEF_MASK (0x400U) +#define LPI2C_SSR_BEF_SHIFT (10U) +#define LPI2C_SSR_BEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BEF_SHIFT)) & LPI2C_SSR_BEF_MASK) +#define LPI2C_SSR_FEF_MASK (0x800U) +#define LPI2C_SSR_FEF_SHIFT (11U) +#define LPI2C_SSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_FEF_SHIFT)) & LPI2C_SSR_FEF_MASK) +#define LPI2C_SSR_AM0F_MASK (0x1000U) +#define LPI2C_SSR_AM0F_SHIFT (12U) +#define LPI2C_SSR_AM0F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM0F_SHIFT)) & LPI2C_SSR_AM0F_MASK) +#define LPI2C_SSR_AM1F_MASK (0x2000U) +#define LPI2C_SSR_AM1F_SHIFT (13U) +#define LPI2C_SSR_AM1F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM1F_SHIFT)) & LPI2C_SSR_AM1F_MASK) +#define LPI2C_SSR_GCF_MASK (0x4000U) +#define LPI2C_SSR_GCF_SHIFT (14U) +#define LPI2C_SSR_GCF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_GCF_SHIFT)) & LPI2C_SSR_GCF_MASK) +#define LPI2C_SSR_SARF_MASK (0x8000U) +#define LPI2C_SSR_SARF_SHIFT (15U) +#define LPI2C_SSR_SARF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SARF_SHIFT)) & LPI2C_SSR_SARF_MASK) +#define LPI2C_SSR_SBF_MASK (0x1000000U) +#define LPI2C_SSR_SBF_SHIFT (24U) +#define LPI2C_SSR_SBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SBF_SHIFT)) & LPI2C_SSR_SBF_MASK) +#define LPI2C_SSR_BBF_MASK (0x2000000U) +#define LPI2C_SSR_BBF_SHIFT (25U) +#define LPI2C_SSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BBF_SHIFT)) & LPI2C_SSR_BBF_MASK) + +/*! @name SIER - Slave Interrupt Enable Register */ +#define LPI2C_SIER_TDIE_MASK (0x1U) +#define LPI2C_SIER_TDIE_SHIFT (0U) +#define LPI2C_SIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TDIE_SHIFT)) & LPI2C_SIER_TDIE_MASK) +#define LPI2C_SIER_RDIE_MASK (0x2U) +#define LPI2C_SIER_RDIE_SHIFT (1U) +#define LPI2C_SIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RDIE_SHIFT)) & LPI2C_SIER_RDIE_MASK) +#define LPI2C_SIER_AVIE_MASK (0x4U) +#define LPI2C_SIER_AVIE_SHIFT (2U) +#define LPI2C_SIER_AVIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AVIE_SHIFT)) & LPI2C_SIER_AVIE_MASK) +#define LPI2C_SIER_TAIE_MASK (0x8U) +#define LPI2C_SIER_TAIE_SHIFT (3U) +#define LPI2C_SIER_TAIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TAIE_SHIFT)) & LPI2C_SIER_TAIE_MASK) +#define LPI2C_SIER_RSIE_MASK (0x100U) +#define LPI2C_SIER_RSIE_SHIFT (8U) +#define LPI2C_SIER_RSIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RSIE_SHIFT)) & LPI2C_SIER_RSIE_MASK) +#define LPI2C_SIER_SDIE_MASK (0x200U) +#define LPI2C_SIER_SDIE_SHIFT (9U) +#define LPI2C_SIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SDIE_SHIFT)) & LPI2C_SIER_SDIE_MASK) +#define LPI2C_SIER_BEIE_MASK (0x400U) +#define LPI2C_SIER_BEIE_SHIFT (10U) +#define LPI2C_SIER_BEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_BEIE_SHIFT)) & LPI2C_SIER_BEIE_MASK) +#define LPI2C_SIER_FEIE_MASK (0x800U) +#define LPI2C_SIER_FEIE_SHIFT (11U) +#define LPI2C_SIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_FEIE_SHIFT)) & LPI2C_SIER_FEIE_MASK) +#define LPI2C_SIER_AM0IE_MASK (0x1000U) +#define LPI2C_SIER_AM0IE_SHIFT (12U) +#define LPI2C_SIER_AM0IE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM0IE_SHIFT)) & LPI2C_SIER_AM0IE_MASK) +#define LPI2C_SIER_AM1F_MASK (0x2000U) +#define LPI2C_SIER_AM1F_SHIFT (13U) +#define LPI2C_SIER_AM1F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM1F_SHIFT)) & LPI2C_SIER_AM1F_MASK) +#define LPI2C_SIER_GCIE_MASK (0x4000U) +#define LPI2C_SIER_GCIE_SHIFT (14U) +#define LPI2C_SIER_GCIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_GCIE_SHIFT)) & LPI2C_SIER_GCIE_MASK) +#define LPI2C_SIER_SARIE_MASK (0x8000U) +#define LPI2C_SIER_SARIE_SHIFT (15U) +#define LPI2C_SIER_SARIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SARIE_SHIFT)) & LPI2C_SIER_SARIE_MASK) + +/*! @name SDER - Slave DMA Enable Register */ +#define LPI2C_SDER_TDDE_MASK (0x1U) +#define LPI2C_SDER_TDDE_SHIFT (0U) +#define LPI2C_SDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_TDDE_SHIFT)) & LPI2C_SDER_TDDE_MASK) +#define LPI2C_SDER_RDDE_MASK (0x2U) +#define LPI2C_SDER_RDDE_SHIFT (1U) +#define LPI2C_SDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_RDDE_SHIFT)) & LPI2C_SDER_RDDE_MASK) +#define LPI2C_SDER_AVDE_MASK (0x4U) +#define LPI2C_SDER_AVDE_SHIFT (2U) +#define LPI2C_SDER_AVDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_AVDE_SHIFT)) & LPI2C_SDER_AVDE_MASK) + +/*! @name SCFGR1 - Slave Configuration Register 1 */ +#define LPI2C_SCFGR1_ADRSTALL_MASK (0x1U) +#define LPI2C_SCFGR1_ADRSTALL_SHIFT (0U) +#define LPI2C_SCFGR1_ADRSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADRSTALL_SHIFT)) & LPI2C_SCFGR1_ADRSTALL_MASK) +#define LPI2C_SCFGR1_RXSTALL_MASK (0x2U) +#define LPI2C_SCFGR1_RXSTALL_SHIFT (1U) +#define LPI2C_SCFGR1_RXSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXSTALL_SHIFT)) & LPI2C_SCFGR1_RXSTALL_MASK) +#define LPI2C_SCFGR1_TXDSTALL_MASK (0x4U) +#define LPI2C_SCFGR1_TXDSTALL_SHIFT (2U) +#define LPI2C_SCFGR1_TXDSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXDSTALL_SHIFT)) & LPI2C_SCFGR1_TXDSTALL_MASK) +#define LPI2C_SCFGR1_ACKSTALL_MASK (0x8U) +#define LPI2C_SCFGR1_ACKSTALL_SHIFT (3U) +#define LPI2C_SCFGR1_ACKSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ACKSTALL_SHIFT)) & LPI2C_SCFGR1_ACKSTALL_MASK) +#define LPI2C_SCFGR1_GCEN_MASK (0x100U) +#define LPI2C_SCFGR1_GCEN_SHIFT (8U) +#define LPI2C_SCFGR1_GCEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_GCEN_SHIFT)) & LPI2C_SCFGR1_GCEN_MASK) +#define LPI2C_SCFGR1_SAEN_MASK (0x200U) +#define LPI2C_SCFGR1_SAEN_SHIFT (9U) +#define LPI2C_SCFGR1_SAEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_SAEN_SHIFT)) & LPI2C_SCFGR1_SAEN_MASK) +#define LPI2C_SCFGR1_TXCFG_MASK (0x400U) +#define LPI2C_SCFGR1_TXCFG_SHIFT (10U) +#define LPI2C_SCFGR1_TXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXCFG_SHIFT)) & LPI2C_SCFGR1_TXCFG_MASK) +#define LPI2C_SCFGR1_RXCFG_MASK (0x800U) +#define LPI2C_SCFGR1_RXCFG_SHIFT (11U) +#define LPI2C_SCFGR1_RXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXCFG_SHIFT)) & LPI2C_SCFGR1_RXCFG_MASK) +#define LPI2C_SCFGR1_IGNACK_MASK (0x1000U) +#define LPI2C_SCFGR1_IGNACK_SHIFT (12U) +#define LPI2C_SCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_IGNACK_SHIFT)) & LPI2C_SCFGR1_IGNACK_MASK) +#define LPI2C_SCFGR1_HSMEN_MASK (0x2000U) +#define LPI2C_SCFGR1_HSMEN_SHIFT (13U) +#define LPI2C_SCFGR1_HSMEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_HSMEN_SHIFT)) & LPI2C_SCFGR1_HSMEN_MASK) +#define LPI2C_SCFGR1_ADDRCFG_MASK (0x70000U) +#define LPI2C_SCFGR1_ADDRCFG_SHIFT (16U) +#define LPI2C_SCFGR1_ADDRCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADDRCFG_SHIFT)) & LPI2C_SCFGR1_ADDRCFG_MASK) + +/*! @name SCFGR2 - Slave Configuration Register 2 */ +#define LPI2C_SCFGR2_CLKHOLD_MASK (0xFU) +#define LPI2C_SCFGR2_CLKHOLD_SHIFT (0U) +#define LPI2C_SCFGR2_CLKHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_CLKHOLD_SHIFT)) & LPI2C_SCFGR2_CLKHOLD_MASK) +#define LPI2C_SCFGR2_DATAVD_MASK (0x3F00U) +#define LPI2C_SCFGR2_DATAVD_SHIFT (8U) +#define LPI2C_SCFGR2_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_DATAVD_SHIFT)) & LPI2C_SCFGR2_DATAVD_MASK) +#define LPI2C_SCFGR2_FILTSCL_MASK (0xF0000U) +#define LPI2C_SCFGR2_FILTSCL_SHIFT (16U) +#define LPI2C_SCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSCL_SHIFT)) & LPI2C_SCFGR2_FILTSCL_MASK) +#define LPI2C_SCFGR2_FILTSDA_MASK (0xF000000U) +#define LPI2C_SCFGR2_FILTSDA_SHIFT (24U) +#define LPI2C_SCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSDA_SHIFT)) & LPI2C_SCFGR2_FILTSDA_MASK) + +/*! @name SAMR - Slave Address Match Register */ +#define LPI2C_SAMR_ADDR0_MASK (0x7FEU) +#define LPI2C_SAMR_ADDR0_SHIFT (1U) +#define LPI2C_SAMR_ADDR0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR0_SHIFT)) & LPI2C_SAMR_ADDR0_MASK) +#define LPI2C_SAMR_ADDR1_MASK (0x7FE0000U) +#define LPI2C_SAMR_ADDR1_SHIFT (17U) +#define LPI2C_SAMR_ADDR1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR1_SHIFT)) & LPI2C_SAMR_ADDR1_MASK) + +/*! @name SASR - Slave Address Status Register */ +#define LPI2C_SASR_RADDR_MASK (0x7FFU) +#define LPI2C_SASR_RADDR_SHIFT (0U) +#define LPI2C_SASR_RADDR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_RADDR_SHIFT)) & LPI2C_SASR_RADDR_MASK) +#define LPI2C_SASR_ANV_MASK (0x4000U) +#define LPI2C_SASR_ANV_SHIFT (14U) +#define LPI2C_SASR_ANV(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_ANV_SHIFT)) & LPI2C_SASR_ANV_MASK) + +/*! @name STAR - Slave Transmit ACK Register */ +#define LPI2C_STAR_TXNACK_MASK (0x1U) +#define LPI2C_STAR_TXNACK_SHIFT (0U) +#define LPI2C_STAR_TXNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STAR_TXNACK_SHIFT)) & LPI2C_STAR_TXNACK_MASK) + +/*! @name STDR - Slave Transmit Data Register */ +#define LPI2C_STDR_DATA_MASK (0xFFU) +#define LPI2C_STDR_DATA_SHIFT (0U) +#define LPI2C_STDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STDR_DATA_SHIFT)) & LPI2C_STDR_DATA_MASK) + +/*! @name SRDR - Slave Receive Data Register */ +#define LPI2C_SRDR_DATA_MASK (0xFFU) +#define LPI2C_SRDR_DATA_SHIFT (0U) +#define LPI2C_SRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_DATA_SHIFT)) & LPI2C_SRDR_DATA_MASK) +#define LPI2C_SRDR_RXEMPTY_MASK (0x4000U) +#define LPI2C_SRDR_RXEMPTY_SHIFT (14U) +#define LPI2C_SRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_RXEMPTY_SHIFT)) & LPI2C_SRDR_RXEMPTY_MASK) +#define LPI2C_SRDR_SOF_MASK (0x8000U) +#define LPI2C_SRDR_SOF_SHIFT (15U) +#define LPI2C_SRDR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_SOF_SHIFT)) & LPI2C_SRDR_SOF_MASK) + + +/*! + * @} + */ /* end of group LPI2C_Register_Masks */ + + +/* LPI2C - Peripheral instance base addresses */ +/** Peripheral LPI2C0 base pointer */ +#define LPI2C0 ((LPI2C_Type *)LPI2C0_BASE) +/** Peripheral LPI2C1 base pointer */ +#define LPI2C1 ((LPI2C_Type *)LPI2C1_BASE) +/** Peripheral LPI2C2 base pointer */ +#define LPI2C2 ((LPI2C_Type *)LPI2C2_BASE) +/** Peripheral LPI2C3 base pointer */ +#define LPI2C3 ((LPI2C_Type *)LPI2C3_BASE) +/** Peripheral LPI2C4 base pointer */ +#define LPI2C4 ((LPI2C_Type *)LPI2C4_BASE) +/** Peripheral LPI2C5 base pointer */ +#define LPI2C5 ((LPI2C_Type *)LPI2C5_BASE) +/** Peripheral LPI2C6 base pointer */ +#define LPI2C6 ((LPI2C_Type *)LPI2C6_BASE) +/** Peripheral LPI2C7 base pointer */ +#define LPI2C7 ((LPI2C_Type *)LPI2C7_BASE) +/** Peripheral LPI2C8 base pointer */ +#define LPI2C8 ((LPI2C_Type *)LPI2C8_BASE) +/** Peripheral LPI2C9 base pointer */ +#define LPI2C9 ((LPI2C_Type *)LPI2C9_BASE) +/** Peripheral LPI2C10 base pointer */ +#define LPI2C10 ((LPI2C_Type *)LPI2C10_BASE) +/** Peripheral LPI2C11 base pointer */ +#define LPI2C11 ((LPI2C_Type *)LPI2C11_BASE) +/** Peripheral LPI2C12 base pointer */ +#define LPI2C12 ((LPI2C_Type *)LPI2C12_BASE) +/** Peripheral LPI2C13 base pointer */ +#define LPI2C13 ((LPI2C_Type *)LPI2C13_BASE) +/** Peripheral LPI2C14 base pointer */ +#define LPI2C14 ((LPI2C_Type *)LPI2C14_BASE) +/** Peripheral LPI2C15 base pointer */ +#define LPI2C15 ((LPI2C_Type *)LPI2C15_BASE) +/** Peripheral LPI2C16 base pointer */ +#define LPI2C16 ((LPI2C_Type *)LPI2C16_BASE) +/** Peripheral LPI2C17 base pointer */ +#define LPI2C17 ((LPI2C_Type *)LPI2C17_BASE) +/** Peripheral LPI2C18 base pointer */ +#define LPI2C18 ((LPI2C_Type *)LPI2C18_BASE) +/** Peripheral LPI2C19 base pointer */ +#define LPI2C19 ((LPI2C_Type *)LPI2C19_BASE) +/** Peripheral LPI2C20 base pointer */ +#define LPI2C20 ((LPI2C_Type *)LPI2C20_BASE) +/** Peripheral LPI2C21 base pointer */ +#define LPI2C21 ((LPI2C_Type *)LPI2C21_BASE) +/** Peripheral LPI2C22 base pointer */ +#define LPI2C22 ((LPI2C_Type *)LPI2C22_BASE) +/** Peripheral LPI2C23 base pointer */ +#define LPI2C23 ((LPI2C_Type *)LPI2C23_BASE) +/** Peripheral LPI2C24 base pointer */ +#define LPI2C24 ((LPI2C_Type *)LPI2C24_BASE) +/** Peripheral LPI2C25 base pointer */ +#define LPI2C25 ((LPI2C_Type *)LPI2C25_BASE) + +/** Array initializer of LPI2C peripheral base addresses */ +#define LPI2C_BASE_ADDRS { LPI2C0_BASE, LPI2C1_BASE, \ + LPI2C2_BASE, LPI2C3_BASE, \ + LPI2C4_BASE, LPI2C5_BASE, \ + LPI2C6_BASE, LPI2C7_BASE, \ + LPI2C8_BASE, LPI2C9_BASE, \ + LPI2C10_BASE, LPI2C11_BASE, \ + LPI2C12_BASE, LPI2C13_BASE, \ + LPI2C14_BASE, LPI2C15_BASE, \ + LPI2C16_BASE, LPI2C17_BASE, \ + LPI2C18_BASE, LPI2C19_BASE, \ + LPI2C20_BASE, LPI2C21_BASE, \ + LPI2C22_BASE, LPI2C23_BASE, \ + LPI2C24_BASE, LPI2C25_BASE} +/** Array initializer of LPI2C peripheral base pointers */ +#define LPI2C_BASE_PTRS { LPI2C0, LPI2C1, \ + LPI2C2, LPI2C3, \ + LPI2C4, LPI2C5, \ + LPI2C6, LPI2C7, \ + LPI2C8, LPI2C9, \ + LPI2C10, LPI2C11, \ + LPI2C12, LPI2C13, \ + LPI2C14, LPI2C15, \ + LPI2C16, LPI2C17, \ + LPI2C18, LPI2C19, \ + LPI2C20, LPI2C21, \ + LPI2C22, LPI2C23, \ + LPI2C24, LPI2C25} +/** Interrupt vectors for the LPI2C peripheral type */ +#define LPI2C_IRQS { LPI2C0_IRQn } + +/*! + * @} + */ /* end of group LPI2C_Peripheral_Access_Layer */ + +#endif /* HW_LPI2C_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_lpit.h b/platform/devices/MX8/MX8_lpit.h new file mode 100755 index 0000000..063110e --- /dev/null +++ b/platform/devices/MX8/MX8_lpit.h @@ -0,0 +1,244 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LPIT_REGISTERS_H +#define HW_LPIT_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- LPIT Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPIT_Peripheral_Access_Layer LPIT Peripheral Access Layer + * @{ + */ + +/** LPIT - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ + __IO uint32_t MCR; /**< Module Control Register, offset: 0x8 */ + __IO uint32_t MSR; /**< Module Status Register, offset: 0xC */ + __IO uint32_t MIER; /**< Module Interrupt Enable Register, offset: 0x10 */ + __IO uint32_t SETTEN; /**< Set Timer Enable Register, offset: 0x14 */ + __IO uint32_t CLRTEN; /**< Clear Timer Enable Register, offset: 0x18 */ + uint8_t RESERVED_0[4]; + struct { /* offset: 0x20, array step: 0x10 */ + __IO uint32_t TVAL; /**< Timer Value Register, array offset: 0x20, array step: 0x10 */ + __I uint32_t CVAL; /**< Current Timer Value, array offset: 0x24, array step: 0x10 */ + __IO uint32_t TCTRL; /**< Timer Control Register, array offset: 0x28, array step: 0x10 */ + uint8_t RESERVED_0[4]; + } CHANNEL[4]; +} LPIT_Type; + +/* ---------------------------------------------------------------------------- + -- LPIT Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPIT_Register_Masks LPIT Register Masks + * @{ + */ + +/*! @name VERID - Version ID Register */ +#define LPIT_VERID_FEATURE_MASK (0xFFFFU) +#define LPIT_VERID_FEATURE_SHIFT (0U) +#define LPIT_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPIT_VERID_FEATURE_SHIFT)) & LPIT_VERID_FEATURE_MASK) +#define LPIT_VERID_MINOR_MASK (0xFF0000U) +#define LPIT_VERID_MINOR_SHIFT (16U) +#define LPIT_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPIT_VERID_MINOR_SHIFT)) & LPIT_VERID_MINOR_MASK) +#define LPIT_VERID_MAJOR_MASK (0xFF000000U) +#define LPIT_VERID_MAJOR_SHIFT (24U) +#define LPIT_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPIT_VERID_MAJOR_SHIFT)) & LPIT_VERID_MAJOR_MASK) + +/*! @name PARAM - Parameter Register */ +#define LPIT_PARAM_CHANNEL_MASK (0xFFU) +#define LPIT_PARAM_CHANNEL_SHIFT (0U) +#define LPIT_PARAM_CHANNEL(x) (((uint32_t)(((uint32_t)(x)) << LPIT_PARAM_CHANNEL_SHIFT)) & LPIT_PARAM_CHANNEL_MASK) +#define LPIT_PARAM_EXT_TRIG_MASK (0xFF00U) +#define LPIT_PARAM_EXT_TRIG_SHIFT (8U) +#define LPIT_PARAM_EXT_TRIG(x) (((uint32_t)(((uint32_t)(x)) << LPIT_PARAM_EXT_TRIG_SHIFT)) & LPIT_PARAM_EXT_TRIG_MASK) + +/*! @name MCR - Module Control Register */ +#define LPIT_MCR_M_CEN_MASK (0x1U) +#define LPIT_MCR_M_CEN_SHIFT (0U) +#define LPIT_MCR_M_CEN(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MCR_M_CEN_SHIFT)) & LPIT_MCR_M_CEN_MASK) +#define LPIT_MCR_SW_RST_MASK (0x2U) +#define LPIT_MCR_SW_RST_SHIFT (1U) +#define LPIT_MCR_SW_RST(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MCR_SW_RST_SHIFT)) & LPIT_MCR_SW_RST_MASK) +#define LPIT_MCR_DOZE_EN_MASK (0x4U) +#define LPIT_MCR_DOZE_EN_SHIFT (2U) +#define LPIT_MCR_DOZE_EN(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MCR_DOZE_EN_SHIFT)) & LPIT_MCR_DOZE_EN_MASK) +#define LPIT_MCR_DBG_EN_MASK (0x8U) +#define LPIT_MCR_DBG_EN_SHIFT (3U) +#define LPIT_MCR_DBG_EN(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MCR_DBG_EN_SHIFT)) & LPIT_MCR_DBG_EN_MASK) + +/*! @name MSR - Module Status Register */ +#define LPIT_MSR_TIF0_MASK (0x1U) +#define LPIT_MSR_TIF0_SHIFT (0U) +#define LPIT_MSR_TIF0(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MSR_TIF0_SHIFT)) & LPIT_MSR_TIF0_MASK) +#define LPIT_MSR_TIF1_MASK (0x2U) +#define LPIT_MSR_TIF1_SHIFT (1U) +#define LPIT_MSR_TIF1(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MSR_TIF1_SHIFT)) & LPIT_MSR_TIF1_MASK) +#define LPIT_MSR_TIF2_MASK (0x4U) +#define LPIT_MSR_TIF2_SHIFT (2U) +#define LPIT_MSR_TIF2(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MSR_TIF2_SHIFT)) & LPIT_MSR_TIF2_MASK) +#define LPIT_MSR_TIF3_MASK (0x8U) +#define LPIT_MSR_TIF3_SHIFT (3U) +#define LPIT_MSR_TIF3(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MSR_TIF3_SHIFT)) & LPIT_MSR_TIF3_MASK) + +/*! @name MIER - Module Interrupt Enable Register */ +#define LPIT_MIER_TIE0_MASK (0x1U) +#define LPIT_MIER_TIE0_SHIFT (0U) +#define LPIT_MIER_TIE0(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MIER_TIE0_SHIFT)) & LPIT_MIER_TIE0_MASK) +#define LPIT_MIER_TIE1_MASK (0x2U) +#define LPIT_MIER_TIE1_SHIFT (1U) +#define LPIT_MIER_TIE1(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MIER_TIE1_SHIFT)) & LPIT_MIER_TIE1_MASK) +#define LPIT_MIER_TIE2_MASK (0x4U) +#define LPIT_MIER_TIE2_SHIFT (2U) +#define LPIT_MIER_TIE2(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MIER_TIE2_SHIFT)) & LPIT_MIER_TIE2_MASK) +#define LPIT_MIER_TIE3_MASK (0x8U) +#define LPIT_MIER_TIE3_SHIFT (3U) +#define LPIT_MIER_TIE3(x) (((uint32_t)(((uint32_t)(x)) << LPIT_MIER_TIE3_SHIFT)) & LPIT_MIER_TIE3_MASK) + +/*! @name SETTEN - Set Timer Enable Register */ +#define LPIT_SETTEN_SET_T_EN_0_MASK (0x1U) +#define LPIT_SETTEN_SET_T_EN_0_SHIFT (0U) +#define LPIT_SETTEN_SET_T_EN_0(x) (((uint32_t)(((uint32_t)(x)) << LPIT_SETTEN_SET_T_EN_0_SHIFT)) & LPIT_SETTEN_SET_T_EN_0_MASK) +#define LPIT_SETTEN_SET_T_EN_1_MASK (0x2U) +#define LPIT_SETTEN_SET_T_EN_1_SHIFT (1U) +#define LPIT_SETTEN_SET_T_EN_1(x) (((uint32_t)(((uint32_t)(x)) << LPIT_SETTEN_SET_T_EN_1_SHIFT)) & LPIT_SETTEN_SET_T_EN_1_MASK) +#define LPIT_SETTEN_SET_T_EN_2_MASK (0x4U) +#define LPIT_SETTEN_SET_T_EN_2_SHIFT (2U) +#define LPIT_SETTEN_SET_T_EN_2(x) (((uint32_t)(((uint32_t)(x)) << LPIT_SETTEN_SET_T_EN_2_SHIFT)) & LPIT_SETTEN_SET_T_EN_2_MASK) +#define LPIT_SETTEN_SET_T_EN_3_MASK (0x8U) +#define LPIT_SETTEN_SET_T_EN_3_SHIFT (3U) +#define LPIT_SETTEN_SET_T_EN_3(x) (((uint32_t)(((uint32_t)(x)) << LPIT_SETTEN_SET_T_EN_3_SHIFT)) & LPIT_SETTEN_SET_T_EN_3_MASK) + +/*! @name CLRTEN - Clear Timer Enable Register */ +#define LPIT_CLRTEN_CLR_T_EN_0_MASK (0x1U) +#define LPIT_CLRTEN_CLR_T_EN_0_SHIFT (0U) +#define LPIT_CLRTEN_CLR_T_EN_0(x) (((uint32_t)(((uint32_t)(x)) << LPIT_CLRTEN_CLR_T_EN_0_SHIFT)) & LPIT_CLRTEN_CLR_T_EN_0_MASK) +#define LPIT_CLRTEN_CLR_T_EN_1_MASK (0x2U) +#define LPIT_CLRTEN_CLR_T_EN_1_SHIFT (1U) +#define LPIT_CLRTEN_CLR_T_EN_1(x) (((uint32_t)(((uint32_t)(x)) << LPIT_CLRTEN_CLR_T_EN_1_SHIFT)) & LPIT_CLRTEN_CLR_T_EN_1_MASK) +#define LPIT_CLRTEN_CLR_T_EN_2_MASK (0x4U) +#define LPIT_CLRTEN_CLR_T_EN_2_SHIFT (2U) +#define LPIT_CLRTEN_CLR_T_EN_2(x) (((uint32_t)(((uint32_t)(x)) << LPIT_CLRTEN_CLR_T_EN_2_SHIFT)) & LPIT_CLRTEN_CLR_T_EN_2_MASK) +#define LPIT_CLRTEN_CLR_T_EN_3_MASK (0x8U) +#define LPIT_CLRTEN_CLR_T_EN_3_SHIFT (3U) +#define LPIT_CLRTEN_CLR_T_EN_3(x) (((uint32_t)(((uint32_t)(x)) << LPIT_CLRTEN_CLR_T_EN_3_SHIFT)) & LPIT_CLRTEN_CLR_T_EN_3_MASK) + +/*! @name TVAL - Timer Value Register */ +#define LPIT_TVAL_TMR_VAL_MASK (0xFFFFFFFFU) +#define LPIT_TVAL_TMR_VAL_SHIFT (0U) +#define LPIT_TVAL_TMR_VAL(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TVAL_TMR_VAL_SHIFT)) & LPIT_TVAL_TMR_VAL_MASK) + +/* The count of LPIT_TVAL */ +#define LPIT_TVAL_COUNT (4U) + +/*! @name CVAL - Current Timer Value */ +#define LPIT_CVAL_TMR_CUR_VAL_MASK (0xFFFFFFFFU) +#define LPIT_CVAL_TMR_CUR_VAL_SHIFT (0U) +#define LPIT_CVAL_TMR_CUR_VAL(x) (((uint32_t)(((uint32_t)(x)) << LPIT_CVAL_TMR_CUR_VAL_SHIFT)) & LPIT_CVAL_TMR_CUR_VAL_MASK) + +/* The count of LPIT_CVAL */ +#define LPIT_CVAL_COUNT (4U) + +/*! @name TCTRL - Timer Control Register */ +#define LPIT_TCTRL_T_EN_MASK (0x1U) +#define LPIT_TCTRL_T_EN_SHIFT (0U) +#define LPIT_TCTRL_T_EN(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_T_EN_SHIFT)) & LPIT_TCTRL_T_EN_MASK) +#define LPIT_TCTRL_CHAIN_MASK (0x2U) +#define LPIT_TCTRL_CHAIN_SHIFT (1U) +#define LPIT_TCTRL_CHAIN(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_CHAIN_SHIFT)) & LPIT_TCTRL_CHAIN_MASK) +#define LPIT_TCTRL_MODE_MASK (0xCU) +#define LPIT_TCTRL_MODE_SHIFT (2U) +#define LPIT_TCTRL_MODE(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_MODE_SHIFT)) & LPIT_TCTRL_MODE_MASK) +#define LPIT_TCTRL_TSOT_MASK (0x10000U) +#define LPIT_TCTRL_TSOT_SHIFT (16U) +#define LPIT_TCTRL_TSOT(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_TSOT_SHIFT)) & LPIT_TCTRL_TSOT_MASK) +#define LPIT_TCTRL_TSOI_MASK (0x20000U) +#define LPIT_TCTRL_TSOI_SHIFT (17U) +#define LPIT_TCTRL_TSOI(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_TSOI_SHIFT)) & LPIT_TCTRL_TSOI_MASK) +#define LPIT_TCTRL_TROT_MASK (0x40000U) +#define LPIT_TCTRL_TROT_SHIFT (18U) +#define LPIT_TCTRL_TROT(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_TROT_SHIFT)) & LPIT_TCTRL_TROT_MASK) +#define LPIT_TCTRL_TRG_SRC_MASK (0x800000U) +#define LPIT_TCTRL_TRG_SRC_SHIFT (23U) +#define LPIT_TCTRL_TRG_SRC(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_TRG_SRC_SHIFT)) & LPIT_TCTRL_TRG_SRC_MASK) +#define LPIT_TCTRL_TRG_SEL_MASK (0xF000000U) +#define LPIT_TCTRL_TRG_SEL_SHIFT (24U) +#define LPIT_TCTRL_TRG_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPIT_TCTRL_TRG_SEL_SHIFT)) & LPIT_TCTRL_TRG_SEL_MASK) + +/* The count of LPIT_TCTRL */ +#define LPIT_TCTRL_COUNT (4U) + + +/*! + * @} + */ /* end of group LPIT_Register_Masks */ + + +/* LPIT - Peripheral instance base addresses */ +/** Peripheral LPIT0 base pointer */ +#define LPIT0 ((LPIT_Type *)LPIT0_BASE) +/** Array initializer of LPIT peripheral base addresses */ +#define LPIT_BASE_ADDRS { LPIT0_BASE } +/** Array initializer of LPIT peripheral base pointers */ +#define LPIT_BASE_PTRS { LPIT0 } +/** Interrupt vectors for the LPIT peripheral type */ +#define LPIT_IRQS { LPIT0_IRQn } +/** Clocks for the LPIT peripheral type */ +#define LPIT_CLOCKS { kCLOCK_LPIT_SC } + +/*! + * @} + */ /* end of group LPIT_Peripheral_Access_Layer */ + +#endif /* HW_LPIT_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_lpuart.h b/platform/devices/MX8/MX8_lpuart.h new file mode 100755 index 0000000..b4f7737 --- /dev/null +++ b/platform/devices/MX8/MX8_lpuart.h @@ -0,0 +1,479 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_LPUART_REGISTERS_H +#define HW_LPUART_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- LPUART Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPUART_Peripheral_Access_Layer LPUART Peripheral Access Layer + * @{ + */ + +/** LPUART - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ + __IO uint32_t GLOBAL; /**< LPUART Global Register, offset: 0x8 */ + __IO uint32_t PINCFG; /**< LPUART Pin Configuration Register, offset: 0xC */ + __IO uint32_t BAUD; /**< LPUART Baud Rate Register, offset: 0x10 */ + __IO uint32_t STAT; /**< LPUART Status Register, offset: 0x14 */ + __IO uint32_t CTRL; /**< LPUART Control Register, offset: 0x18 */ + __IO uint32_t DATA; /**< LPUART Data Register, offset: 0x1C */ + __IO uint32_t MATCH; /**< LPUART Match Address Register, offset: 0x20 */ + __IO uint32_t MODIR; /**< LPUART Modem IrDA Register, offset: 0x24 */ + __IO uint32_t FIFO; /**< LPUART FIFO Register, offset: 0x28 */ + __IO uint32_t WATER; /**< LPUART Watermark Register, offset: 0x2C */ +} LPUART_Type; + +/* ---------------------------------------------------------------------------- + -- LPUART Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPUART_Register_Masks LPUART Register Masks + * @{ + */ + +/*! @name VERID - Version ID Register */ +#define LPUART_VERID_FEATURE_MASK (0xFFFFU) +#define LPUART_VERID_FEATURE_SHIFT (0U) +#define LPUART_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_FEATURE_SHIFT)) & LPUART_VERID_FEATURE_MASK) +#define LPUART_VERID_MINOR_MASK (0xFF0000U) +#define LPUART_VERID_MINOR_SHIFT (16U) +#define LPUART_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MINOR_SHIFT)) & LPUART_VERID_MINOR_MASK) +#define LPUART_VERID_MAJOR_MASK (0xFF000000U) +#define LPUART_VERID_MAJOR_SHIFT (24U) +#define LPUART_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MAJOR_SHIFT)) & LPUART_VERID_MAJOR_MASK) + +/*! @name PARAM - Parameter Register */ +#define LPUART_PARAM_TXFIFO_MASK (0xFFU) +#define LPUART_PARAM_TXFIFO_SHIFT (0U) +#define LPUART_PARAM_TXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_TXFIFO_SHIFT)) & LPUART_PARAM_TXFIFO_MASK) +#define LPUART_PARAM_RXFIFO_MASK (0xFF00U) +#define LPUART_PARAM_RXFIFO_SHIFT (8U) +#define LPUART_PARAM_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_RXFIFO_SHIFT)) & LPUART_PARAM_RXFIFO_MASK) + +/*! @name GLOBAL - LPUART Global Register */ +#define LPUART_GLOBAL_RST_MASK (0x2U) +#define LPUART_GLOBAL_RST_SHIFT (1U) +#define LPUART_GLOBAL_RST(x) (((uint32_t)(((uint32_t)(x)) << LPUART_GLOBAL_RST_SHIFT)) & LPUART_GLOBAL_RST_MASK) + +/*! @name PINCFG - LPUART Pin Configuration Register */ +#define LPUART_PINCFG_TRGSEL_MASK (0x3U) +#define LPUART_PINCFG_TRGSEL_SHIFT (0U) +#define LPUART_PINCFG_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PINCFG_TRGSEL_SHIFT)) & LPUART_PINCFG_TRGSEL_MASK) + +/*! @name BAUD - LPUART Baud Rate Register */ +#define LPUART_BAUD_SBR_MASK (0x1FFFU) +#define LPUART_BAUD_SBR_SHIFT (0U) +#define LPUART_BAUD_SBR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBR_SHIFT)) & LPUART_BAUD_SBR_MASK) +#define LPUART_BAUD_SBNS_MASK (0x2000U) +#define LPUART_BAUD_SBNS_SHIFT (13U) +#define LPUART_BAUD_SBNS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBNS_SHIFT)) & LPUART_BAUD_SBNS_MASK) +#define LPUART_BAUD_RXEDGIE_MASK (0x4000U) +#define LPUART_BAUD_RXEDGIE_SHIFT (14U) +#define LPUART_BAUD_RXEDGIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RXEDGIE_SHIFT)) & LPUART_BAUD_RXEDGIE_MASK) +#define LPUART_BAUD_LBKDIE_MASK (0x8000U) +#define LPUART_BAUD_LBKDIE_SHIFT (15U) +#define LPUART_BAUD_LBKDIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_LBKDIE_SHIFT)) & LPUART_BAUD_LBKDIE_MASK) +#define LPUART_BAUD_RESYNCDIS_MASK (0x10000U) +#define LPUART_BAUD_RESYNCDIS_SHIFT (16U) +#define LPUART_BAUD_RESYNCDIS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RESYNCDIS_SHIFT)) & LPUART_BAUD_RESYNCDIS_MASK) +#define LPUART_BAUD_BOTHEDGE_MASK (0x20000U) +#define LPUART_BAUD_BOTHEDGE_SHIFT (17U) +#define LPUART_BAUD_BOTHEDGE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_BOTHEDGE_SHIFT)) & LPUART_BAUD_BOTHEDGE_MASK) +#define LPUART_BAUD_MATCFG_MASK (0xC0000U) +#define LPUART_BAUD_MATCFG_SHIFT (18U) +#define LPUART_BAUD_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MATCFG_SHIFT)) & LPUART_BAUD_MATCFG_MASK) +#define LPUART_BAUD_RDMAE_MASK (0x200000U) +#define LPUART_BAUD_RDMAE_SHIFT (21U) +#define LPUART_BAUD_RDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RDMAE_SHIFT)) & LPUART_BAUD_RDMAE_MASK) +#define LPUART_BAUD_TDMAE_MASK (0x800000U) +#define LPUART_BAUD_TDMAE_SHIFT (23U) +#define LPUART_BAUD_TDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_TDMAE_SHIFT)) & LPUART_BAUD_TDMAE_MASK) +#define LPUART_BAUD_OSR_MASK (0x1F000000U) +#define LPUART_BAUD_OSR_SHIFT (24U) +#define LPUART_BAUD_OSR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_OSR_SHIFT)) & LPUART_BAUD_OSR_MASK) +#define LPUART_BAUD_M10_MASK (0x20000000U) +#define LPUART_BAUD_M10_SHIFT (29U) +#define LPUART_BAUD_M10(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_M10_SHIFT)) & LPUART_BAUD_M10_MASK) +#define LPUART_BAUD_MAEN2_MASK (0x40000000U) +#define LPUART_BAUD_MAEN2_SHIFT (30U) +#define LPUART_BAUD_MAEN2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN2_SHIFT)) & LPUART_BAUD_MAEN2_MASK) +#define LPUART_BAUD_MAEN1_MASK (0x80000000U) +#define LPUART_BAUD_MAEN1_SHIFT (31U) +#define LPUART_BAUD_MAEN1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN1_SHIFT)) & LPUART_BAUD_MAEN1_MASK) + +/*! @name STAT - LPUART Status Register */ +#define LPUART_STAT_MA2F_MASK (0x4000U) +#define LPUART_STAT_MA2F_SHIFT (14U) +#define LPUART_STAT_MA2F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA2F_SHIFT)) & LPUART_STAT_MA2F_MASK) +#define LPUART_STAT_MA1F_MASK (0x8000U) +#define LPUART_STAT_MA1F_SHIFT (15U) +#define LPUART_STAT_MA1F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA1F_SHIFT)) & LPUART_STAT_MA1F_MASK) +#define LPUART_STAT_PF_MASK (0x10000U) +#define LPUART_STAT_PF_SHIFT (16U) +#define LPUART_STAT_PF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_PF_SHIFT)) & LPUART_STAT_PF_MASK) +#define LPUART_STAT_FE_MASK (0x20000U) +#define LPUART_STAT_FE_SHIFT (17U) +#define LPUART_STAT_FE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_FE_SHIFT)) & LPUART_STAT_FE_MASK) +#define LPUART_STAT_NF_MASK (0x40000U) +#define LPUART_STAT_NF_SHIFT (18U) +#define LPUART_STAT_NF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_NF_SHIFT)) & LPUART_STAT_NF_MASK) +#define LPUART_STAT_OR_MASK (0x80000U) +#define LPUART_STAT_OR_SHIFT (19U) +#define LPUART_STAT_OR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_OR_SHIFT)) & LPUART_STAT_OR_MASK) +#define LPUART_STAT_IDLE_MASK (0x100000U) +#define LPUART_STAT_IDLE_SHIFT (20U) +#define LPUART_STAT_IDLE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_IDLE_SHIFT)) & LPUART_STAT_IDLE_MASK) +#define LPUART_STAT_RDRF_MASK (0x200000U) +#define LPUART_STAT_RDRF_SHIFT (21U) +#define LPUART_STAT_RDRF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RDRF_SHIFT)) & LPUART_STAT_RDRF_MASK) +#define LPUART_STAT_TC_MASK (0x400000U) +#define LPUART_STAT_TC_SHIFT (22U) +#define LPUART_STAT_TC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TC_SHIFT)) & LPUART_STAT_TC_MASK) +#define LPUART_STAT_TDRE_MASK (0x800000U) +#define LPUART_STAT_TDRE_SHIFT (23U) +#define LPUART_STAT_TDRE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TDRE_SHIFT)) & LPUART_STAT_TDRE_MASK) +#define LPUART_STAT_RAF_MASK (0x1000000U) +#define LPUART_STAT_RAF_SHIFT (24U) +#define LPUART_STAT_RAF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RAF_SHIFT)) & LPUART_STAT_RAF_MASK) +#define LPUART_STAT_LBKDE_MASK (0x2000000U) +#define LPUART_STAT_LBKDE_SHIFT (25U) +#define LPUART_STAT_LBKDE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDE_SHIFT)) & LPUART_STAT_LBKDE_MASK) +#define LPUART_STAT_BRK13_MASK (0x4000000U) +#define LPUART_STAT_BRK13_SHIFT (26U) +#define LPUART_STAT_BRK13(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_BRK13_SHIFT)) & LPUART_STAT_BRK13_MASK) +#define LPUART_STAT_RWUID_MASK (0x8000000U) +#define LPUART_STAT_RWUID_SHIFT (27U) +#define LPUART_STAT_RWUID(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RWUID_SHIFT)) & LPUART_STAT_RWUID_MASK) +#define LPUART_STAT_RXINV_MASK (0x10000000U) +#define LPUART_STAT_RXINV_SHIFT (28U) +#define LPUART_STAT_RXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXINV_SHIFT)) & LPUART_STAT_RXINV_MASK) +#define LPUART_STAT_MSBF_MASK (0x20000000U) +#define LPUART_STAT_MSBF_SHIFT (29U) +#define LPUART_STAT_MSBF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MSBF_SHIFT)) & LPUART_STAT_MSBF_MASK) +#define LPUART_STAT_RXEDGIF_MASK (0x40000000U) +#define LPUART_STAT_RXEDGIF_SHIFT (30U) +#define LPUART_STAT_RXEDGIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXEDGIF_SHIFT)) & LPUART_STAT_RXEDGIF_MASK) +#define LPUART_STAT_LBKDIF_MASK (0x80000000U) +#define LPUART_STAT_LBKDIF_SHIFT (31U) +#define LPUART_STAT_LBKDIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDIF_SHIFT)) & LPUART_STAT_LBKDIF_MASK) + +/*! @name CTRL - LPUART Control Register */ +#define LPUART_CTRL_PT_MASK (0x1U) +#define LPUART_CTRL_PT_SHIFT (0U) +#define LPUART_CTRL_PT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PT_SHIFT)) & LPUART_CTRL_PT_MASK) +#define LPUART_CTRL_PE_MASK (0x2U) +#define LPUART_CTRL_PE_SHIFT (1U) +#define LPUART_CTRL_PE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PE_SHIFT)) & LPUART_CTRL_PE_MASK) +#define LPUART_CTRL_ILT_MASK (0x4U) +#define LPUART_CTRL_ILT_SHIFT (2U) +#define LPUART_CTRL_ILT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILT_SHIFT)) & LPUART_CTRL_ILT_MASK) +#define LPUART_CTRL_WAKE_MASK (0x8U) +#define LPUART_CTRL_WAKE_SHIFT (3U) +#define LPUART_CTRL_WAKE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_WAKE_SHIFT)) & LPUART_CTRL_WAKE_MASK) +#define LPUART_CTRL_M_MASK (0x10U) +#define LPUART_CTRL_M_SHIFT (4U) +#define LPUART_CTRL_M(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_M_SHIFT)) & LPUART_CTRL_M_MASK) +#define LPUART_CTRL_RSRC_MASK (0x20U) +#define LPUART_CTRL_RSRC_SHIFT (5U) +#define LPUART_CTRL_RSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RSRC_SHIFT)) & LPUART_CTRL_RSRC_MASK) +#define LPUART_CTRL_DOZEEN_MASK (0x40U) +#define LPUART_CTRL_DOZEEN_SHIFT (6U) +#define LPUART_CTRL_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_DOZEEN_SHIFT)) & LPUART_CTRL_DOZEEN_MASK) +#define LPUART_CTRL_LOOPS_MASK (0x80U) +#define LPUART_CTRL_LOOPS_SHIFT (7U) +#define LPUART_CTRL_LOOPS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_LOOPS_SHIFT)) & LPUART_CTRL_LOOPS_MASK) +#define LPUART_CTRL_IDLECFG_MASK (0x700U) +#define LPUART_CTRL_IDLECFG_SHIFT (8U) +#define LPUART_CTRL_IDLECFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_IDLECFG_SHIFT)) & LPUART_CTRL_IDLECFG_MASK) +#define LPUART_CTRL_MA2IE_MASK (0x4000U) +#define LPUART_CTRL_MA2IE_SHIFT (14U) +#define LPUART_CTRL_MA2IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA2IE_SHIFT)) & LPUART_CTRL_MA2IE_MASK) +#define LPUART_CTRL_MA1IE_MASK (0x8000U) +#define LPUART_CTRL_MA1IE_SHIFT (15U) +#define LPUART_CTRL_MA1IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA1IE_SHIFT)) & LPUART_CTRL_MA1IE_MASK) +#define LPUART_CTRL_SBK_MASK (0x10000U) +#define LPUART_CTRL_SBK_SHIFT (16U) +#define LPUART_CTRL_SBK(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_SBK_SHIFT)) & LPUART_CTRL_SBK_MASK) +#define LPUART_CTRL_RWU_MASK (0x20000U) +#define LPUART_CTRL_RWU_SHIFT (17U) +#define LPUART_CTRL_RWU(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RWU_SHIFT)) & LPUART_CTRL_RWU_MASK) +#define LPUART_CTRL_RE_MASK (0x40000U) +#define LPUART_CTRL_RE_SHIFT (18U) +#define LPUART_CTRL_RE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RE_SHIFT)) & LPUART_CTRL_RE_MASK) +#define LPUART_CTRL_TE_MASK (0x80000U) +#define LPUART_CTRL_TE_SHIFT (19U) +#define LPUART_CTRL_TE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TE_SHIFT)) & LPUART_CTRL_TE_MASK) +#define LPUART_CTRL_ILIE_MASK (0x100000U) +#define LPUART_CTRL_ILIE_SHIFT (20U) +#define LPUART_CTRL_ILIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILIE_SHIFT)) & LPUART_CTRL_ILIE_MASK) +#define LPUART_CTRL_RIE_MASK (0x200000U) +#define LPUART_CTRL_RIE_SHIFT (21U) +#define LPUART_CTRL_RIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RIE_SHIFT)) & LPUART_CTRL_RIE_MASK) +#define LPUART_CTRL_TCIE_MASK (0x400000U) +#define LPUART_CTRL_TCIE_SHIFT (22U) +#define LPUART_CTRL_TCIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TCIE_SHIFT)) & LPUART_CTRL_TCIE_MASK) +#define LPUART_CTRL_TIE_MASK (0x800000U) +#define LPUART_CTRL_TIE_SHIFT (23U) +#define LPUART_CTRL_TIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TIE_SHIFT)) & LPUART_CTRL_TIE_MASK) +#define LPUART_CTRL_PEIE_MASK (0x1000000U) +#define LPUART_CTRL_PEIE_SHIFT (24U) +#define LPUART_CTRL_PEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PEIE_SHIFT)) & LPUART_CTRL_PEIE_MASK) +#define LPUART_CTRL_FEIE_MASK (0x2000000U) +#define LPUART_CTRL_FEIE_SHIFT (25U) +#define LPUART_CTRL_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_FEIE_SHIFT)) & LPUART_CTRL_FEIE_MASK) +#define LPUART_CTRL_NEIE_MASK (0x4000000U) +#define LPUART_CTRL_NEIE_SHIFT (26U) +#define LPUART_CTRL_NEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_NEIE_SHIFT)) & LPUART_CTRL_NEIE_MASK) +#define LPUART_CTRL_ORIE_MASK (0x8000000U) +#define LPUART_CTRL_ORIE_SHIFT (27U) +#define LPUART_CTRL_ORIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ORIE_SHIFT)) & LPUART_CTRL_ORIE_MASK) +#define LPUART_CTRL_TXINV_MASK (0x10000000U) +#define LPUART_CTRL_TXINV_SHIFT (28U) +#define LPUART_CTRL_TXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXINV_SHIFT)) & LPUART_CTRL_TXINV_MASK) +#define LPUART_CTRL_TXDIR_MASK (0x20000000U) +#define LPUART_CTRL_TXDIR_SHIFT (29U) +#define LPUART_CTRL_TXDIR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXDIR_SHIFT)) & LPUART_CTRL_TXDIR_MASK) +#define LPUART_CTRL_R9T8_MASK (0x40000000U) +#define LPUART_CTRL_R9T8_SHIFT (30U) +#define LPUART_CTRL_R9T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R9T8_SHIFT)) & LPUART_CTRL_R9T8_MASK) +#define LPUART_CTRL_R8T9_MASK (0x80000000U) +#define LPUART_CTRL_R8T9_SHIFT (31U) +#define LPUART_CTRL_R8T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R8T9_SHIFT)) & LPUART_CTRL_R8T9_MASK) + +/*! @name DATA - LPUART Data Register */ +#define LPUART_DATA_R0T0_MASK (0x1U) +#define LPUART_DATA_R0T0_SHIFT (0U) +#define LPUART_DATA_R0T0(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R0T0_SHIFT)) & LPUART_DATA_R0T0_MASK) +#define LPUART_DATA_R1T1_MASK (0x2U) +#define LPUART_DATA_R1T1_SHIFT (1U) +#define LPUART_DATA_R1T1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R1T1_SHIFT)) & LPUART_DATA_R1T1_MASK) +#define LPUART_DATA_R2T2_MASK (0x4U) +#define LPUART_DATA_R2T2_SHIFT (2U) +#define LPUART_DATA_R2T2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R2T2_SHIFT)) & LPUART_DATA_R2T2_MASK) +#define LPUART_DATA_R3T3_MASK (0x8U) +#define LPUART_DATA_R3T3_SHIFT (3U) +#define LPUART_DATA_R3T3(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R3T3_SHIFT)) & LPUART_DATA_R3T3_MASK) +#define LPUART_DATA_R4T4_MASK (0x10U) +#define LPUART_DATA_R4T4_SHIFT (4U) +#define LPUART_DATA_R4T4(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R4T4_SHIFT)) & LPUART_DATA_R4T4_MASK) +#define LPUART_DATA_R5T5_MASK (0x20U) +#define LPUART_DATA_R5T5_SHIFT (5U) +#define LPUART_DATA_R5T5(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R5T5_SHIFT)) & LPUART_DATA_R5T5_MASK) +#define LPUART_DATA_R6T6_MASK (0x40U) +#define LPUART_DATA_R6T6_SHIFT (6U) +#define LPUART_DATA_R6T6(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R6T6_SHIFT)) & LPUART_DATA_R6T6_MASK) +#define LPUART_DATA_R7T7_MASK (0x80U) +#define LPUART_DATA_R7T7_SHIFT (7U) +#define LPUART_DATA_R7T7(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R7T7_SHIFT)) & LPUART_DATA_R7T7_MASK) +#define LPUART_DATA_R8T8_MASK (0x100U) +#define LPUART_DATA_R8T8_SHIFT (8U) +#define LPUART_DATA_R8T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R8T8_SHIFT)) & LPUART_DATA_R8T8_MASK) +#define LPUART_DATA_R9T9_MASK (0x200U) +#define LPUART_DATA_R9T9_SHIFT (9U) +#define LPUART_DATA_R9T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R9T9_SHIFT)) & LPUART_DATA_R9T9_MASK) +#define LPUART_DATA_IDLINE_MASK (0x800U) +#define LPUART_DATA_IDLINE_SHIFT (11U) +#define LPUART_DATA_IDLINE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_IDLINE_SHIFT)) & LPUART_DATA_IDLINE_MASK) +#define LPUART_DATA_RXEMPT_MASK (0x1000U) +#define LPUART_DATA_RXEMPT_SHIFT (12U) +#define LPUART_DATA_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_RXEMPT_SHIFT)) & LPUART_DATA_RXEMPT_MASK) +#define LPUART_DATA_FRETSC_MASK (0x2000U) +#define LPUART_DATA_FRETSC_SHIFT (13U) +#define LPUART_DATA_FRETSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_FRETSC_SHIFT)) & LPUART_DATA_FRETSC_MASK) +#define LPUART_DATA_PARITYE_MASK (0x4000U) +#define LPUART_DATA_PARITYE_SHIFT (14U) +#define LPUART_DATA_PARITYE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_PARITYE_SHIFT)) & LPUART_DATA_PARITYE_MASK) +#define LPUART_DATA_NOISY_MASK (0x8000U) +#define LPUART_DATA_NOISY_SHIFT (15U) +#define LPUART_DATA_NOISY(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_NOISY_SHIFT)) & LPUART_DATA_NOISY_MASK) + +/*! @name MATCH - LPUART Match Address Register */ +#define LPUART_MATCH_MA1_MASK (0x3FFU) +#define LPUART_MATCH_MA1_SHIFT (0U) +#define LPUART_MATCH_MA1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA1_SHIFT)) & LPUART_MATCH_MA1_MASK) +#define LPUART_MATCH_MA2_MASK (0x3FF0000U) +#define LPUART_MATCH_MA2_SHIFT (16U) +#define LPUART_MATCH_MA2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA2_SHIFT)) & LPUART_MATCH_MA2_MASK) + +/*! @name MODIR - LPUART Modem IrDA Register */ +#define LPUART_MODIR_TXCTSE_MASK (0x1U) +#define LPUART_MODIR_TXCTSE_SHIFT (0U) +#define LPUART_MODIR_TXCTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSE_SHIFT)) & LPUART_MODIR_TXCTSE_MASK) +#define LPUART_MODIR_TXRTSE_MASK (0x2U) +#define LPUART_MODIR_TXRTSE_SHIFT (1U) +#define LPUART_MODIR_TXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSE_SHIFT)) & LPUART_MODIR_TXRTSE_MASK) +#define LPUART_MODIR_TXRTSPOL_MASK (0x4U) +#define LPUART_MODIR_TXRTSPOL_SHIFT (2U) +#define LPUART_MODIR_TXRTSPOL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSPOL_SHIFT)) & LPUART_MODIR_TXRTSPOL_MASK) +#define LPUART_MODIR_RXRTSE_MASK (0x8U) +#define LPUART_MODIR_RXRTSE_SHIFT (3U) +#define LPUART_MODIR_RXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RXRTSE_SHIFT)) & LPUART_MODIR_RXRTSE_MASK) +#define LPUART_MODIR_TXCTSC_MASK (0x10U) +#define LPUART_MODIR_TXCTSC_SHIFT (4U) +#define LPUART_MODIR_TXCTSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSC_SHIFT)) & LPUART_MODIR_TXCTSC_MASK) +#define LPUART_MODIR_TXCTSSRC_MASK (0x20U) +#define LPUART_MODIR_TXCTSSRC_SHIFT (5U) +#define LPUART_MODIR_TXCTSSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSSRC_SHIFT)) & LPUART_MODIR_TXCTSSRC_MASK) +#define LPUART_MODIR_RTSWATER_MASK (0xFF00U) +#define LPUART_MODIR_RTSWATER_SHIFT (8U) +#define LPUART_MODIR_RTSWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RTSWATER_SHIFT)) & LPUART_MODIR_RTSWATER_MASK) +#define LPUART_MODIR_TNP_MASK (0x30000U) +#define LPUART_MODIR_TNP_SHIFT (16U) +#define LPUART_MODIR_TNP(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TNP_SHIFT)) & LPUART_MODIR_TNP_MASK) +#define LPUART_MODIR_IREN_MASK (0x40000U) +#define LPUART_MODIR_IREN_SHIFT (18U) +#define LPUART_MODIR_IREN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_IREN_SHIFT)) & LPUART_MODIR_IREN_MASK) + +/*! @name FIFO - LPUART FIFO Register */ +#define LPUART_FIFO_RXFIFOSIZE_MASK (0x7U) +#define LPUART_FIFO_RXFIFOSIZE_SHIFT (0U) +#define LPUART_FIFO_RXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFIFOSIZE_SHIFT)) & LPUART_FIFO_RXFIFOSIZE_MASK) +#define LPUART_FIFO_RXFE_MASK (0x8U) +#define LPUART_FIFO_RXFE_SHIFT (3U) +#define LPUART_FIFO_RXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFE_SHIFT)) & LPUART_FIFO_RXFE_MASK) +#define LPUART_FIFO_TXFIFOSIZE_MASK (0x70U) +#define LPUART_FIFO_TXFIFOSIZE_SHIFT (4U) +#define LPUART_FIFO_TXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFIFOSIZE_SHIFT)) & LPUART_FIFO_TXFIFOSIZE_MASK) +#define LPUART_FIFO_TXFE_MASK (0x80U) +#define LPUART_FIFO_TXFE_SHIFT (7U) +#define LPUART_FIFO_TXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFE_SHIFT)) & LPUART_FIFO_TXFE_MASK) +#define LPUART_FIFO_RXUFE_MASK (0x100U) +#define LPUART_FIFO_RXUFE_SHIFT (8U) +#define LPUART_FIFO_RXUFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUFE_SHIFT)) & LPUART_FIFO_RXUFE_MASK) +#define LPUART_FIFO_TXOFE_MASK (0x200U) +#define LPUART_FIFO_TXOFE_SHIFT (9U) +#define LPUART_FIFO_TXOFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOFE_SHIFT)) & LPUART_FIFO_TXOFE_MASK) +#define LPUART_FIFO_RXIDEN_MASK (0x1C00U) +#define LPUART_FIFO_RXIDEN_SHIFT (10U) +#define LPUART_FIFO_RXIDEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXIDEN_SHIFT)) & LPUART_FIFO_RXIDEN_MASK) +#define LPUART_FIFO_RXFLUSH_MASK (0x4000U) +#define LPUART_FIFO_RXFLUSH_SHIFT (14U) +#define LPUART_FIFO_RXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFLUSH_SHIFT)) & LPUART_FIFO_RXFLUSH_MASK) +#define LPUART_FIFO_TXFLUSH_MASK (0x8000U) +#define LPUART_FIFO_TXFLUSH_SHIFT (15U) +#define LPUART_FIFO_TXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFLUSH_SHIFT)) & LPUART_FIFO_TXFLUSH_MASK) +#define LPUART_FIFO_RXUF_MASK (0x10000U) +#define LPUART_FIFO_RXUF_SHIFT (16U) +#define LPUART_FIFO_RXUF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUF_SHIFT)) & LPUART_FIFO_RXUF_MASK) +#define LPUART_FIFO_TXOF_MASK (0x20000U) +#define LPUART_FIFO_TXOF_SHIFT (17U) +#define LPUART_FIFO_TXOF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOF_SHIFT)) & LPUART_FIFO_TXOF_MASK) +#define LPUART_FIFO_RXEMPT_MASK (0x400000U) +#define LPUART_FIFO_RXEMPT_SHIFT (22U) +#define LPUART_FIFO_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXEMPT_SHIFT)) & LPUART_FIFO_RXEMPT_MASK) +#define LPUART_FIFO_TXEMPT_MASK (0x800000U) +#define LPUART_FIFO_TXEMPT_SHIFT (23U) +#define LPUART_FIFO_TXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXEMPT_SHIFT)) & LPUART_FIFO_TXEMPT_MASK) + +/*! @name WATER - LPUART Watermark Register */ +#define LPUART_WATER_TXWATER_MASK (0xFFU) +#define LPUART_WATER_TXWATER_SHIFT (0U) +#define LPUART_WATER_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXWATER_SHIFT)) & LPUART_WATER_TXWATER_MASK) +#define LPUART_WATER_TXCOUNT_MASK (0xFF00U) +#define LPUART_WATER_TXCOUNT_SHIFT (8U) +#define LPUART_WATER_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXCOUNT_SHIFT)) & LPUART_WATER_TXCOUNT_MASK) +#define LPUART_WATER_RXWATER_MASK (0xFF0000U) +#define LPUART_WATER_RXWATER_SHIFT (16U) +#define LPUART_WATER_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXWATER_SHIFT)) & LPUART_WATER_RXWATER_MASK) +#define LPUART_WATER_RXCOUNT_MASK (0xFF000000U) +#define LPUART_WATER_RXCOUNT_SHIFT (24U) +#define LPUART_WATER_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXCOUNT_SHIFT)) & LPUART_WATER_RXCOUNT_MASK) + + +/*! + * @} + */ /* end of group LPUART_Register_Masks */ + + +/* LPUART - Peripheral instance base addresses */ +/** Peripheral LPUART0 base pointer */ +#define LPUART0 ((LPUART_Type *)LPUART0_BASE) +/** Peripheral LPUART1 base pointer */ +#define LPUART1 ((LPUART_Type *)LPUART1_BASE) +/** Peripheral LPUART2 base pointer */ +#define LPUART2 ((LPUART_Type *)LPUART2_BASE) +/** Peripheral LPUART3 base pointer */ +#define LPUART3 ((LPUART_Type *)LPUART3_BASE) +/** Peripheral LPUART4 base pointer */ +#define LPUART4 ((LPUART_Type *)LPUART4_BASE) +/** Peripheral LPUART5 base pointer */ +#define LPUART5 ((LPUART_Type *)LPUART5_BASE) +/** Peripheral LPUART6 base pointer */ +#define LPUART6 ((LPUART_Type *)LPUART6_BASE) +/** Peripheral LPUART7 base pointer */ +#define LPUART7 ((LPUART_Type *)LPUART7_BASE) +/** Peripheral LPUART8 base pointer */ +#define LPUART8 ((LPUART_Type *)LPUART8_BASE) +/** Array initializer of LPUART peripheral base addresses */ +#define LPUART_BASE_ADDRS { LPUART0_BASE, LPUART1_BASE, \ + LPUART2_BASE, LPUART3_BASE, \ + LPUART4_BASE, LPUART5_BASE, \ + LPUART6_BASE, LPUART7_BASE, \ + LPUART8_BASE } +/** Array initializer of LPUART peripheral base pointers */ +#define LPUART_BASE_PTRS { LPUART0, LPUART1, \ + LPUART2, LPUART3, \ + LPUART4, LPUART5, \ + LPUART6, LPUART7, \ + LPUART8 } +/** Interrupt vectors for the LPUART peripheral type */ +#define LPUART_RX_TX_IRQS { LPUART0_IRQn } +#define LPUART_ERR_IRQS { LPUART0_IRQn } + +/*! + * @} + */ /* end of group LPUART_Peripheral_Access_Layer */ + +#endif /* HW_LPUART_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_mbist.h b/platform/devices/MX8/MX8_mbist.h new file mode 100755 index 0000000..4e33254 --- /dev/null +++ b/platform/devices/MX8/MX8_mbist.h @@ -0,0 +1,2086 @@ +/* +** ################################################################### +** Processor: mbist +** Compiler: Keil ARM C/C++ Compiler +** Build: b181128 +** +** Abstract: +** CMSIS Peripheral Access Layer for mbist +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2018 NXP +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_mbist.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for MX8_mbist + * + * CMSIS Peripheral Access Layer for MX8_mbist + */ + +#ifndef MX8_MBIST_H +#define MX8_MBIST_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- MBIST Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MBIST_Peripheral_Access_Layer MBIST Peripheral Access Layer + * @{ + */ + +/** MBIST - Register Layout Typedef */ +typedef struct { + __IO uint32_t IOR; /**< Internal Offset Register, offset: 0x0 */ + __IO uint32_t IAR; /**< Indirect Access Register, offset: 0x4 */ + __O uint32_t DBA; /**< Direct BIST Access Register (Write), offset: 0x8 */ + __IO uint16_t GCR; /**< General Configuration, offset: 0xC */ + uint8_t RESERVED_0[2]; + __IO uint8_t ACSTA; /**< Address Configuration Start, offset: 0x10 */ + uint8_t RESERVED_1[3]; + __IO uint8_t ACEND; /**< Address Configuration End, offset: 0x14 */ + uint8_t RESERVED_2[3]; + __IO uint16_t ALG1; /**< Algorithm Reg1, offset: 0x18 */ + uint8_t RESERVED_3[2]; + __IO uint32_t ALG2; /**< Algorithm Reg2, offset: 0x1C */ + __IO uint32_t ALG3; /**< Algorithm Reg3, offset: 0x20 */ + __IO uint32_t ALG4; /**< Algorithm Reg4, offset: 0x24 */ + __IO uint32_t ALG5; /**< Algorithm Reg5, offset: 0x28 */ + uint8_t RESERVED_4[16]; + __IO uint8_t BGCR; /**< Background Configuration, offset: 0x3C */ + uint8_t RESERVED_5[3]; + __IO uint8_t MSEL; /**< Memory Selection 1, offset: 0x40 */ + uint8_t RESERVED_6[31]; + __IO uint16_t UDPR; /**< User Defined Port Control, offset: 0x60 */ + uint8_t RESERVED_7[66]; + __IO uint8_t BSTART; /**< BIST Start, offset: 0xA4 */ + uint8_t RESERVED_8[3]; +} MBIST_Type; + +/* ---------------------------------------------------------------------------- + -- MBIST Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MBIST_Register_Masks MBIST Register Masks + * @{ + */ + +/*! @name IOR - Internal Offset Register */ +/*! @{ */ +#define MBIST_IOR_OFFSET_MASK (0xFFFFFFFFU) +#define MBIST_IOR_OFFSET_SHIFT (0U) +#define MBIST_IOR_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << MBIST_IOR_OFFSET_SHIFT)) & MBIST_IOR_OFFSET_MASK) +/*! @} */ + +/*! @name IAR - Indirect Access Register */ +/*! @{ */ +#define MBIST_IAR_VALUE_MASK (0xFFFFFFFFU) +#define MBIST_IAR_VALUE_SHIFT (0U) +#define MBIST_IAR_VALUE(x) (((uint32_t)(((uint32_t)(x)) << MBIST_IAR_VALUE_SHIFT)) & MBIST_IAR_VALUE_MASK) +/*! @} */ + +/*! @name DBA - Direct BIST Access Register (Write) */ +/*! @{ */ +#define MBIST_DBA_BSTART_MASK (0x3U) +#define MBIST_DBA_BSTART_SHIFT (0U) +#define MBIST_DBA_BSTART(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_BSTART_SHIFT)) & MBIST_DBA_BSTART_MASK) +#define MBIST_DBA_BRST_MASK (0x4U) +#define MBIST_DBA_BRST_SHIFT (2U) +/*! BRST - Bist Reset + * 0b1..FSLBIST3/ARMport general soft reset. + */ +#define MBIST_DBA_BRST(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_BRST_SHIFT)) & MBIST_DBA_BRST_MASK) +#define MBIST_DBA_SRST_MASK (0x8U) +#define MBIST_DBA_SRST_SHIFT (3U) +/*! SRST - Status Reset + * 0b1..FSLBIST3/ARMport Status reset. This resets: DSMs; BSMs; ipt_bist_status. + */ +#define MBIST_DBA_SRST(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_SRST_SHIFT)) & MBIST_DBA_SRST_MASK) +#define MBIST_DBA_ALGOSEL_MASK (0x1F0U) +#define MBIST_DBA_ALGOSEL_SHIFT (4U) +#define MBIST_DBA_ALGOSEL(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_ALGOSEL_SHIFT)) & MBIST_DBA_ALGOSEL_MASK) +#define MBIST_DBA_DB0_MASK (0x200U) +#define MBIST_DBA_DB0_SHIFT (9U) +#define MBIST_DBA_DB0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_DB0_SHIFT)) & MBIST_DBA_DB0_MASK) +#define MBIST_DBA_DB1_MASK (0x400U) +#define MBIST_DBA_DB1_SHIFT (10U) +#define MBIST_DBA_DB1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_DB1_SHIFT)) & MBIST_DBA_DB1_MASK) +#define MBIST_DBA_DB2_MASK (0x800U) +#define MBIST_DBA_DB2_SHIFT (11U) +#define MBIST_DBA_DB2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_DB2_SHIFT)) & MBIST_DBA_DB2_MASK) +#define MBIST_DBA_BISRLAT_MASK (0x8000U) +#define MBIST_DBA_BISRLAT_SHIFT (15U) +#define MBIST_DBA_BISRLAT(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_BISRLAT_SHIFT)) & MBIST_DBA_BISRLAT_MASK) +#define MBIST_DBA_UDPR_MASK (0xFFFF0000U) +#define MBIST_DBA_UDPR_SHIFT (16U) +#define MBIST_DBA_UDPR(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBA_UDPR_SHIFT)) & MBIST_DBA_UDPR_MASK) +/*! @} */ + +/*! @name GCR - General Configuration */ +/*! @{ */ +#define MBIST_GCR_OPM_MASK (0x7U) +#define MBIST_GCR_OPM_SHIFT (0U) +/*! OPM - Operation Mode + * 0b000..Normal Sticky Mode - Test runs from start to end and then stops (The fail signal will be asserted as soon as an error is detected and stays asserted until reset at the end of the test). + * 0b001..RESERVED + * 0b010..Run-Forever Sticky Mode - Test repeats forever. The fail bit will be asserted as soon as an error is detected and it stays asserted. + * 0b011..RESERVED + * 0b100..Stop-On-Fail Mode - Test stops when a fail is detected and can then be resumed under user command (manual fail data upload). + * 0b101..RESERVED + * 0b110..Stop-On-Read Mode (just for ROM test) - Test stops on each read and can then be resumed (manual fail data uploaded) + * 0b111..RESERVED + */ +#define MBIST_GCR_OPM(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_OPM_SHIFT)) & MBIST_GCR_OPM_MASK) +#define MBIST_GCR_AMODE_MASK (0x38U) +#define MBIST_GCR_AMODE_SHIFT (3U) +/*! AMODE - Address Mode + * 0b000..Natural (or Normal) Addressing - Addresses are incremented from first memory position to up. + * 0b001..Block fast - Block address are incremented first, the other addresses are incremented as address bits were rotated making the block-bits the LSBs. + * 0b010..Column Fast - Column address are incremented first, the other addresses are incremented as the address bits were rotated making the column-bits the LSBs. + * 0b011..Row Fast - Row addresses are incremented first, then column; the other addresses are incremented as the address bits were rotated making the row-bits the LSBs. + * 0b100..Gang Fast - The gang addresses are incremented first, the other addresses are incremented as the address bits were rotated making the gang-bits the LSBs. + * 0b101..Reserved (if selected it falls back to default -Natural Addressing) + * 0b110..Reserved (if selected it falls back to default -Natural Addressing) + * 0b111..Anybit Fast - In this mode, the test will be run multiple times one for each address bit being the fast bit of the run. Attention! Running this mode takes a long time. + */ +#define MBIST_GCR_AMODE(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_AMODE_SHIFT)) & MBIST_GCR_AMODE_MASK) +#define MBIST_GCR_MAM_MASK (0x1C0U) +#define MBIST_GCR_MAM_SHIFT (6U) +/*! MAM - Dual Port Test Configuration + * 0b000..Disable both Automatic (A/B) and Dual Port stress Tests + * 0b001..Automatic A/B Test with same address + * 0b010..Automatic A/B Test but disable Dual Port stress Test + * 0b011..Automatic A/B Test with adjacent address + * 0b100..Regular Test with same address and port A as primary + * 0b101..Regular Test with same address and port B as primary + * 0b110..Regular Test with adjacent address and port A as primary + * 0b111..Regular Test with adjacent address and port B as primary + */ +#define MBIST_GCR_MAM(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_MAM_SHIFT)) & MBIST_GCR_MAM_MASK) +#define MBIST_GCR_CEN_MASK (0x200U) +#define MBIST_GCR_CEN_SHIFT (9U) +/*! CEN - Continuous Enabled + * 0b0..Continuous Enable mode de-active. + * 0b1..Continuous Enable mode active. + */ +#define MBIST_GCR_CEN(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_CEN_SHIFT)) & MBIST_GCR_CEN_MASK) +#define MBIST_GCR_NOCOMP_MASK (0x400U) +#define MBIST_GCR_NOCOMP_SHIFT (10U) +/*! NOCOMP - No Compare + * 0b0..Normal compare is performed in RAM tests. + * 0b1..No compare is performed in RAM tests. + */ +#define MBIST_GCR_NOCOMP(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_NOCOMP_SHIFT)) & MBIST_GCR_NOCOMP_MASK) +#define MBIST_GCR_IWEN_MASK (0x800U) +#define MBIST_GCR_IWEN_SHIFT (11U) +/*! IWEN - Bit Write Enable Test Mode + * 0b0..Disable bit/word write enable test mode. + * 0b1..Enable bit/word write enable test mode. + */ +#define MBIST_GCR_IWEN(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_IWEN_SHIFT)) & MBIST_GCR_IWEN_MASK) +#define MBIST_GCR_MC_RST_MASK (0x1000U) +#define MBIST_GCR_MC_RST_SHIFT (12U) +/*! MC_RST - Memory Configuration Reset + * 0b1..Reset memory configuration. + */ +#define MBIST_GCR_MC_RST(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_MC_RST_SHIFT)) & MBIST_GCR_MC_RST_MASK) +#define MBIST_GCR_RDHLD_MASK (0x4000U) +#define MBIST_GCR_RDHLD_SHIFT (14U) +#define MBIST_GCR_RDHLD(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_RDHLD_SHIFT)) & MBIST_GCR_RDHLD_MASK) +#define MBIST_GCR_BURNIN_MASK (0x8000U) +#define MBIST_GCR_BURNIN_SHIFT (15U) +#define MBIST_GCR_BURNIN(x) (((uint16_t)(((uint16_t)(x)) << MBIST_GCR_BURNIN_SHIFT)) & MBIST_GCR_BURNIN_MASK) +/*! @} */ + +/*! @name ACSTA - Address Configuration Start */ +/*! @{ */ +#define MBIST_ACSTA_STARTA_MASK (0x7FFU) +#define MBIST_ACSTA_STARTA_SHIFT (0U) +#define MBIST_ACSTA_STARTA(x) (((uint8_t)(((uint8_t)(x)) << MBIST_ACSTA_STARTA_SHIFT)) & MBIST_ACSTA_STARTA_MASK) +/*! @} */ + +/*! @name ACEND - Address Configuration End */ +/*! @{ */ +#define MBIST_ACEND_ENDA_MASK (0x7FFU) +#define MBIST_ACEND_ENDA_SHIFT (0U) +#define MBIST_ACEND_ENDA(x) (((uint8_t)(((uint8_t)(x)) << MBIST_ACEND_ENDA_SHIFT)) & MBIST_ACEND_ENDA_MASK) +/*! @} */ + +/*! @name ALG1 - Algorithm Reg1 */ +/*! @{ */ +#define MBIST_ALG1_VME_MASK (0x7U) +#define MBIST_ALG1_VME_SHIFT (0U) +/*! VME - Valid March Elements + * 0b000..ME0 + * 0b001..ME0 Through ME1 + * 0b010..ME0 Through ME2 + * 0b011..ME0 Through ME3 + * 0b100..ME0 Through ME4 + * 0b101..ME0 Through ME5 + * 0b110..ME0 Through ME6 + * 0b111..ME0 Through ME7 + */ +#define MBIST_ALG1_VME(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_VME_SHIFT)) & MBIST_ALG1_VME_MASK) +#define MBIST_ALG1_PAUSE_0_MASK (0x8U) +#define MBIST_ALG1_PAUSE_0_SHIFT (3U) +#define MBIST_ALG1_PAUSE_0(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_0_SHIFT)) & MBIST_ALG1_PAUSE_0_MASK) +#define MBIST_ALG1_PAUSE_1_MASK (0x10U) +#define MBIST_ALG1_PAUSE_1_SHIFT (4U) +#define MBIST_ALG1_PAUSE_1(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_1_SHIFT)) & MBIST_ALG1_PAUSE_1_MASK) +#define MBIST_ALG1_PAUSE_2_MASK (0x20U) +#define MBIST_ALG1_PAUSE_2_SHIFT (5U) +#define MBIST_ALG1_PAUSE_2(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_2_SHIFT)) & MBIST_ALG1_PAUSE_2_MASK) +#define MBIST_ALG1_PAUSE_3_MASK (0x40U) +#define MBIST_ALG1_PAUSE_3_SHIFT (6U) +#define MBIST_ALG1_PAUSE_3(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_3_SHIFT)) & MBIST_ALG1_PAUSE_3_MASK) +#define MBIST_ALG1_PAUSE_4_MASK (0x80U) +#define MBIST_ALG1_PAUSE_4_SHIFT (7U) +#define MBIST_ALG1_PAUSE_4(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_4_SHIFT)) & MBIST_ALG1_PAUSE_4_MASK) +#define MBIST_ALG1_PAUSE_5_MASK (0x100U) +#define MBIST_ALG1_PAUSE_5_SHIFT (8U) +#define MBIST_ALG1_PAUSE_5(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_5_SHIFT)) & MBIST_ALG1_PAUSE_5_MASK) +#define MBIST_ALG1_PAUSE_6_MASK (0x200U) +#define MBIST_ALG1_PAUSE_6_SHIFT (9U) +#define MBIST_ALG1_PAUSE_6(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_6_SHIFT)) & MBIST_ALG1_PAUSE_6_MASK) +#define MBIST_ALG1_PAUSE_7_MASK (0x400U) +#define MBIST_ALG1_PAUSE_7_SHIFT (10U) +#define MBIST_ALG1_PAUSE_7(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_PAUSE_7_SHIFT)) & MBIST_ALG1_PAUSE_7_MASK) +#define MBIST_ALG1_MP_REP_MASK (0xF800U) +#define MBIST_ALG1_MP_REP_SHIFT (11U) +#define MBIST_ALG1_MP_REP(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_MP_REP_SHIFT)) & MBIST_ALG1_MP_REP_MASK) +#define MBIST_ALG1_ALGSEL_MASK (0x1F0000U) +#define MBIST_ALG1_ALGSEL_SHIFT (16U) +#define MBIST_ALG1_ALGSEL(x) (((uint16_t)(((uint16_t)(x)) << MBIST_ALG1_ALGSEL_SHIFT)) & MBIST_ALG1_ALGSEL_MASK) +/*! @} */ + +/*! @name ALG2 - Algorithm Reg2 */ +/*! @{ */ +#define MBIST_ALG2_ME0_D_MASK (0x1U) +#define MBIST_ALG2_ME0_D_SHIFT (0U) +/*! ME0_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG2_ME0_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_D_SHIFT)) & MBIST_ALG2_ME0_D_MASK) +#define MBIST_ALG2_ME0_VMP_MASK (0xEU) +#define MBIST_ALG2_ME0_VMP_SHIFT (1U) +/*! ME0_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG2_ME0_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_VMP_SHIFT)) & MBIST_ALG2_ME0_VMP_MASK) +#define MBIST_ALG2_ME0_MP0_MASK (0x30U) +#define MBIST_ALG2_ME0_MP0_SHIFT (4U) +/*! ME0_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP0_SHIFT)) & MBIST_ALG2_ME0_MP0_MASK) +#define MBIST_ALG2_ME0_MP1_MASK (0xC0U) +#define MBIST_ALG2_ME0_MP1_SHIFT (6U) +/*! ME0_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP1_SHIFT)) & MBIST_ALG2_ME0_MP1_MASK) +#define MBIST_ALG2_ME0_MP2_MASK (0x300U) +#define MBIST_ALG2_ME0_MP2_SHIFT (8U) +/*! ME0_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP2_SHIFT)) & MBIST_ALG2_ME0_MP2_MASK) +#define MBIST_ALG2_ME0_MP3_MASK (0xC00U) +#define MBIST_ALG2_ME0_MP3_SHIFT (10U) +/*! ME0_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP3_SHIFT)) & MBIST_ALG2_ME0_MP3_MASK) +#define MBIST_ALG2_ME0_MP4_MASK (0x3000U) +#define MBIST_ALG2_ME0_MP4_SHIFT (12U) +/*! ME0_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP4_SHIFT)) & MBIST_ALG2_ME0_MP4_MASK) +#define MBIST_ALG2_ME0_MP5_MASK (0xC000U) +#define MBIST_ALG2_ME0_MP5_SHIFT (14U) +/*! ME0_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME0_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME0_MP5_SHIFT)) & MBIST_ALG2_ME0_MP5_MASK) +#define MBIST_ALG2_ME1_D_MASK (0x10000U) +#define MBIST_ALG2_ME1_D_SHIFT (16U) +/*! ME1_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG2_ME1_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_D_SHIFT)) & MBIST_ALG2_ME1_D_MASK) +#define MBIST_ALG2_ME1_VMP_MASK (0xE0000U) +#define MBIST_ALG2_ME1_VMP_SHIFT (17U) +/*! ME1_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG2_ME1_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_VMP_SHIFT)) & MBIST_ALG2_ME1_VMP_MASK) +#define MBIST_ALG2_ME1_MP0_MASK (0x300000U) +#define MBIST_ALG2_ME1_MP0_SHIFT (20U) +/*! ME1_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP0_SHIFT)) & MBIST_ALG2_ME1_MP0_MASK) +#define MBIST_ALG2_ME1_MP1_MASK (0xC00000U) +#define MBIST_ALG2_ME1_MP1_SHIFT (22U) +/*! ME1_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP1_SHIFT)) & MBIST_ALG2_ME1_MP1_MASK) +#define MBIST_ALG2_ME1_MP2_MASK (0x3000000U) +#define MBIST_ALG2_ME1_MP2_SHIFT (24U) +/*! ME1_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP2_SHIFT)) & MBIST_ALG2_ME1_MP2_MASK) +#define MBIST_ALG2_ME1_MP3_MASK (0xC000000U) +#define MBIST_ALG2_ME1_MP3_SHIFT (26U) +/*! ME1_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP3_SHIFT)) & MBIST_ALG2_ME1_MP3_MASK) +#define MBIST_ALG2_ME1_MP4_MASK (0x30000000U) +#define MBIST_ALG2_ME1_MP4_SHIFT (28U) +/*! ME1_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP4_SHIFT)) & MBIST_ALG2_ME1_MP4_MASK) +#define MBIST_ALG2_ME1_MP5_MASK (0xC0000000U) +#define MBIST_ALG2_ME1_MP5_SHIFT (30U) +/*! ME1_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG2_ME1_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG2_ME1_MP5_SHIFT)) & MBIST_ALG2_ME1_MP5_MASK) +/*! @} */ + +/*! @name ALG3 - Algorithm Reg3 */ +/*! @{ */ +#define MBIST_ALG3_ME2_D_MASK (0x1U) +#define MBIST_ALG3_ME2_D_SHIFT (0U) +/*! ME2_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG3_ME2_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_D_SHIFT)) & MBIST_ALG3_ME2_D_MASK) +#define MBIST_ALG3_ME2_VMP_MASK (0xEU) +#define MBIST_ALG3_ME2_VMP_SHIFT (1U) +/*! ME2_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG3_ME2_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_VMP_SHIFT)) & MBIST_ALG3_ME2_VMP_MASK) +#define MBIST_ALG3_ME2_MP0_MASK (0x30U) +#define MBIST_ALG3_ME2_MP0_SHIFT (4U) +/*! ME2_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP0_SHIFT)) & MBIST_ALG3_ME2_MP0_MASK) +#define MBIST_ALG3_ME2_MP1_MASK (0xC0U) +#define MBIST_ALG3_ME2_MP1_SHIFT (6U) +/*! ME2_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP1_SHIFT)) & MBIST_ALG3_ME2_MP1_MASK) +#define MBIST_ALG3_ME2_MP2_MASK (0x300U) +#define MBIST_ALG3_ME2_MP2_SHIFT (8U) +/*! ME2_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP2_SHIFT)) & MBIST_ALG3_ME2_MP2_MASK) +#define MBIST_ALG3_ME2_MP3_MASK (0xC00U) +#define MBIST_ALG3_ME2_MP3_SHIFT (10U) +/*! ME2_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP3_SHIFT)) & MBIST_ALG3_ME2_MP3_MASK) +#define MBIST_ALG3_ME2_MP4_MASK (0x3000U) +#define MBIST_ALG3_ME2_MP4_SHIFT (12U) +/*! ME2_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP4_SHIFT)) & MBIST_ALG3_ME2_MP4_MASK) +#define MBIST_ALG3_ME2_MP5_MASK (0xC000U) +#define MBIST_ALG3_ME2_MP5_SHIFT (14U) +/*! ME2_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME2_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME2_MP5_SHIFT)) & MBIST_ALG3_ME2_MP5_MASK) +#define MBIST_ALG3_ME3_D_MASK (0x10000U) +#define MBIST_ALG3_ME3_D_SHIFT (16U) +/*! ME3_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG3_ME3_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_D_SHIFT)) & MBIST_ALG3_ME3_D_MASK) +#define MBIST_ALG3_ME3_VMP_MASK (0xE0000U) +#define MBIST_ALG3_ME3_VMP_SHIFT (17U) +/*! ME3_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG3_ME3_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_VMP_SHIFT)) & MBIST_ALG3_ME3_VMP_MASK) +#define MBIST_ALG3_ME3_MP0_MASK (0x300000U) +#define MBIST_ALG3_ME3_MP0_SHIFT (20U) +/*! ME3_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP0_SHIFT)) & MBIST_ALG3_ME3_MP0_MASK) +#define MBIST_ALG3_ME3_MP1_MASK (0xC00000U) +#define MBIST_ALG3_ME3_MP1_SHIFT (22U) +/*! ME3_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP1_SHIFT)) & MBIST_ALG3_ME3_MP1_MASK) +#define MBIST_ALG3_ME3_MP2_MASK (0x3000000U) +#define MBIST_ALG3_ME3_MP2_SHIFT (24U) +/*! ME3_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP2_SHIFT)) & MBIST_ALG3_ME3_MP2_MASK) +#define MBIST_ALG3_ME3_MP3_MASK (0xC000000U) +#define MBIST_ALG3_ME3_MP3_SHIFT (26U) +/*! ME3_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP3_SHIFT)) & MBIST_ALG3_ME3_MP3_MASK) +#define MBIST_ALG3_ME3_MP4_MASK (0x30000000U) +#define MBIST_ALG3_ME3_MP4_SHIFT (28U) +/*! ME3_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP4_SHIFT)) & MBIST_ALG3_ME3_MP4_MASK) +#define MBIST_ALG3_ME3_MP5_MASK (0xC0000000U) +#define MBIST_ALG3_ME3_MP5_SHIFT (30U) +/*! ME3_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG3_ME3_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG3_ME3_MP5_SHIFT)) & MBIST_ALG3_ME3_MP5_MASK) +/*! @} */ + +/*! @name ALG4 - Algorithm Reg4 */ +/*! @{ */ +#define MBIST_ALG4_ME4_D_MASK (0x1U) +#define MBIST_ALG4_ME4_D_SHIFT (0U) +/*! ME4_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG4_ME4_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_D_SHIFT)) & MBIST_ALG4_ME4_D_MASK) +#define MBIST_ALG4_ME4_VMP_MASK (0xEU) +#define MBIST_ALG4_ME4_VMP_SHIFT (1U) +/*! ME4_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG4_ME4_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_VMP_SHIFT)) & MBIST_ALG4_ME4_VMP_MASK) +#define MBIST_ALG4_ME4_MP0_MASK (0x30U) +#define MBIST_ALG4_ME4_MP0_SHIFT (4U) +/*! ME4_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP0_SHIFT)) & MBIST_ALG4_ME4_MP0_MASK) +#define MBIST_ALG4_ME4_MP1_MASK (0xC0U) +#define MBIST_ALG4_ME4_MP1_SHIFT (6U) +/*! ME4_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP1_SHIFT)) & MBIST_ALG4_ME4_MP1_MASK) +#define MBIST_ALG4_ME4_MP2_MASK (0x300U) +#define MBIST_ALG4_ME4_MP2_SHIFT (8U) +/*! ME4_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP2_SHIFT)) & MBIST_ALG4_ME4_MP2_MASK) +#define MBIST_ALG4_ME4_MP3_MASK (0xC00U) +#define MBIST_ALG4_ME4_MP3_SHIFT (10U) +/*! ME4_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP3_SHIFT)) & MBIST_ALG4_ME4_MP3_MASK) +#define MBIST_ALG4_ME4_MP4_MASK (0x3000U) +#define MBIST_ALG4_ME4_MP4_SHIFT (12U) +/*! ME4_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP4_SHIFT)) & MBIST_ALG4_ME4_MP4_MASK) +#define MBIST_ALG4_ME4_MP5_MASK (0xC000U) +#define MBIST_ALG4_ME4_MP5_SHIFT (14U) +/*! ME4_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME4_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME4_MP5_SHIFT)) & MBIST_ALG4_ME4_MP5_MASK) +#define MBIST_ALG4_ME5_D_MASK (0x10000U) +#define MBIST_ALG4_ME5_D_SHIFT (16U) +/*! ME5_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG4_ME5_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_D_SHIFT)) & MBIST_ALG4_ME5_D_MASK) +#define MBIST_ALG4_ME5_VMP_MASK (0xE0000U) +#define MBIST_ALG4_ME5_VMP_SHIFT (17U) +/*! ME5_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG4_ME5_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_VMP_SHIFT)) & MBIST_ALG4_ME5_VMP_MASK) +#define MBIST_ALG4_ME5_MP0_MASK (0x300000U) +#define MBIST_ALG4_ME5_MP0_SHIFT (20U) +/*! ME5_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP0_SHIFT)) & MBIST_ALG4_ME5_MP0_MASK) +#define MBIST_ALG4_ME5_MP1_MASK (0xC00000U) +#define MBIST_ALG4_ME5_MP1_SHIFT (22U) +/*! ME5_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP1_SHIFT)) & MBIST_ALG4_ME5_MP1_MASK) +#define MBIST_ALG4_ME5_MP2_MASK (0x3000000U) +#define MBIST_ALG4_ME5_MP2_SHIFT (24U) +/*! ME5_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP2_SHIFT)) & MBIST_ALG4_ME5_MP2_MASK) +#define MBIST_ALG4_ME5_MP3_MASK (0xC000000U) +#define MBIST_ALG4_ME5_MP3_SHIFT (26U) +/*! ME5_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP3_SHIFT)) & MBIST_ALG4_ME5_MP3_MASK) +#define MBIST_ALG4_ME5_MP4_MASK (0x30000000U) +#define MBIST_ALG4_ME5_MP4_SHIFT (28U) +/*! ME5_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP4_SHIFT)) & MBIST_ALG4_ME5_MP4_MASK) +#define MBIST_ALG4_ME5_MP5_MASK (0xC0000000U) +#define MBIST_ALG4_ME5_MP5_SHIFT (30U) +/*! ME5_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG4_ME5_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG4_ME5_MP5_SHIFT)) & MBIST_ALG4_ME5_MP5_MASK) +/*! @} */ + +/*! @name ALG5 - Algorithm Reg5 */ +/*! @{ */ +#define MBIST_ALG5_ME6_D_MASK (0x1U) +#define MBIST_ALG5_ME6_D_SHIFT (0U) +/*! ME6_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG5_ME6_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_D_SHIFT)) & MBIST_ALG5_ME6_D_MASK) +#define MBIST_ALG5_ME6_VMP_MASK (0xEU) +#define MBIST_ALG5_ME6_VMP_SHIFT (1U) +/*! ME6_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG5_ME6_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_VMP_SHIFT)) & MBIST_ALG5_ME6_VMP_MASK) +#define MBIST_ALG5_ME6_MP0_MASK (0x30U) +#define MBIST_ALG5_ME6_MP0_SHIFT (4U) +/*! ME6_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP0_SHIFT)) & MBIST_ALG5_ME6_MP0_MASK) +#define MBIST_ALG5_ME6_MP1_MASK (0xC0U) +#define MBIST_ALG5_ME6_MP1_SHIFT (6U) +/*! ME6_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP1_SHIFT)) & MBIST_ALG5_ME6_MP1_MASK) +#define MBIST_ALG5_ME6_MP2_MASK (0x300U) +#define MBIST_ALG5_ME6_MP2_SHIFT (8U) +/*! ME6_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP2_SHIFT)) & MBIST_ALG5_ME6_MP2_MASK) +#define MBIST_ALG5_ME6_MP3_MASK (0xC00U) +#define MBIST_ALG5_ME6_MP3_SHIFT (10U) +/*! ME6_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP3_SHIFT)) & MBIST_ALG5_ME6_MP3_MASK) +#define MBIST_ALG5_ME6_MP4_MASK (0x3000U) +#define MBIST_ALG5_ME6_MP4_SHIFT (12U) +/*! ME6_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP4_SHIFT)) & MBIST_ALG5_ME6_MP4_MASK) +#define MBIST_ALG5_ME6_MP5_MASK (0xC000U) +#define MBIST_ALG5_ME6_MP5_SHIFT (14U) +/*! ME6_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME6_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME6_MP5_SHIFT)) & MBIST_ALG5_ME6_MP5_MASK) +#define MBIST_ALG5_ME7_D_MASK (0x10000U) +#define MBIST_ALG5_ME7_D_SHIFT (16U) +/*! ME7_D - Address Direction + * 0b0..Address generator is decremented from ENDA to STARTA. + * 0b1..Address generator is incremented from STARTA to ENDA. + */ +#define MBIST_ALG5_ME7_D(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_D_SHIFT)) & MBIST_ALG5_ME7_D_MASK) +#define MBIST_ALG5_ME7_VMP_MASK (0xE0000U) +#define MBIST_ALG5_ME7_VMP_SHIFT (17U) +/*! ME7_VMP - Valid March Phases + * 0b000..MP0 + * 0b001..MP0 through MP1 + * 0b010..MP0 through MP2 + * 0b011..MP0 through MP3 + * 0b100..MP0 through MP4 + * 0b101..MP0 through MP5 + * 0b110..Illegal value + * 0b111..March Phase Replication + */ +#define MBIST_ALG5_ME7_VMP(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_VMP_SHIFT)) & MBIST_ALG5_ME7_VMP_MASK) +#define MBIST_ALG5_ME7_MP0_MASK (0x300000U) +#define MBIST_ALG5_ME7_MP0_SHIFT (20U) +/*! ME7_MP0 - March Phase 0 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP0_SHIFT)) & MBIST_ALG5_ME7_MP0_MASK) +#define MBIST_ALG5_ME7_MP1_MASK (0xC00000U) +#define MBIST_ALG5_ME7_MP1_SHIFT (22U) +/*! ME7_MP1 - March Phase 1 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP1_SHIFT)) & MBIST_ALG5_ME7_MP1_MASK) +#define MBIST_ALG5_ME7_MP2_MASK (0x3000000U) +#define MBIST_ALG5_ME7_MP2_SHIFT (24U) +/*! ME7_MP2 - March Phase 2 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP2_SHIFT)) & MBIST_ALG5_ME7_MP2_MASK) +#define MBIST_ALG5_ME7_MP3_MASK (0xC000000U) +#define MBIST_ALG5_ME7_MP3_SHIFT (26U) +/*! ME7_MP3 - March Phase 3 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP3_SHIFT)) & MBIST_ALG5_ME7_MP3_MASK) +#define MBIST_ALG5_ME7_MP4_MASK (0x30000000U) +#define MBIST_ALG5_ME7_MP4_SHIFT (28U) +/*! ME7_MP4 - March Phase 4 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP4_SHIFT)) & MBIST_ALG5_ME7_MP4_MASK) +#define MBIST_ALG5_ME7_MP5_MASK (0xC0000000U) +#define MBIST_ALG5_ME7_MP5_SHIFT (30U) +/*! ME7_MP5 - March Phase 5 + * 0b00..R0 - Read data background. + * 0b01..R1 - Read inverted data background. + * 0b10..W0 - Write data background. + * 0b11..W1 -Write inverted data background. + */ +#define MBIST_ALG5_ME7_MP5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_ALG5_ME7_MP5_SHIFT)) & MBIST_ALG5_ME7_MP5_MASK) +/*! @} */ + +/*! @name BGCR - Background Configuration */ +/*! @{ */ +#define MBIST_BGCR_DB0_MASK (0x1U) +#define MBIST_BGCR_DB0_SHIFT (0U) +/*! DB0 - Data Background 0 + * 0b0..No checkerboard data background will be used. + * 0b1..The checkerboard data background will be used. + */ +#define MBIST_BGCR_DB0(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB0_SHIFT)) & MBIST_BGCR_DB0_MASK) +#define MBIST_BGCR_DB1_MASK (0x2U) +#define MBIST_BGCR_DB1_SHIFT (1U) +/*! DB1 - Data Background 1 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB1(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB1_SHIFT)) & MBIST_BGCR_DB1_MASK) +#define MBIST_BGCR_DB2_MASK (0x4U) +#define MBIST_BGCR_DB2_SHIFT (2U) +/*! DB2 - Data Background 2 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB2(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB2_SHIFT)) & MBIST_BGCR_DB2_MASK) +#define MBIST_BGCR_DB3_MASK (0x8U) +#define MBIST_BGCR_DB3_SHIFT (3U) +/*! DB3 - Data Background 3 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB3(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB3_SHIFT)) & MBIST_BGCR_DB3_MASK) +#define MBIST_BGCR_DB4_MASK (0x10U) +#define MBIST_BGCR_DB4_SHIFT (4U) +/*! DB4 - Data Background 4 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB4(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB4_SHIFT)) & MBIST_BGCR_DB4_MASK) +#define MBIST_BGCR_DB5_MASK (0x20U) +#define MBIST_BGCR_DB5_SHIFT (5U) +/*! DB5 - Data Background 5 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB5(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB5_SHIFT)) & MBIST_BGCR_DB5_MASK) +#define MBIST_BGCR_DB6_MASK (0x40U) +#define MBIST_BGCR_DB6_SHIFT (6U) +/*! DB6 - Data Background 6 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB6(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB6_SHIFT)) & MBIST_BGCR_DB6_MASK) +#define MBIST_BGCR_DB7_MASK (0x80U) +#define MBIST_BGCR_DB7_SHIFT (7U) +/*! DB7 - Data Background 7 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB7(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB7_SHIFT)) & MBIST_BGCR_DB7_MASK) +#define MBIST_BGCR_DB8_MASK (0x100U) +#define MBIST_BGCR_DB8_SHIFT (8U) +/*! DB8 - Data Background 8 + * 0b0..This data background will not be used + * 0b1..This data background will be used + */ +#define MBIST_BGCR_DB8(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BGCR_DB8_SHIFT)) & MBIST_BGCR_DB8_MASK) +/*! @} */ + +/*! @name MSEL - Memory Selection 1 */ +/*! @{ */ +#define MBIST_MSEL_MSEL0_MASK (0x1U) +#define MBIST_MSEL_MSEL0_SHIFT (0U) +/*! MSEL0 - Memory Selection 0 + * 0b0..Ram 0 is not selected for the test. + * 0b1..Ram 0 is selected for the test. + */ +#define MBIST_MSEL_MSEL0(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL0_SHIFT)) & MBIST_MSEL_MSEL0_MASK) +#define MBIST_MSEL_MSEL1_MASK (0x2U) +#define MBIST_MSEL_MSEL1_SHIFT (1U) +/*! MSEL1 - Memory Selection 1 + * 0b0..Ram 1 is not selected for the test. + * 0b1..Ram 1 is selected for the test. + */ +#define MBIST_MSEL_MSEL1(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL1_SHIFT)) & MBIST_MSEL_MSEL1_MASK) +#define MBIST_MSEL_MSEL2_MASK (0x4U) +#define MBIST_MSEL_MSEL2_SHIFT (2U) +/*! MSEL2 - Memory Selection 2 + * 0b0..Ram 2 is not selected for the test. + * 0b1..Ram 2 is selected for the test. + */ +#define MBIST_MSEL_MSEL2(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL2_SHIFT)) & MBIST_MSEL_MSEL2_MASK) +#define MBIST_MSEL_MSEL3_MASK (0x8U) +#define MBIST_MSEL_MSEL3_SHIFT (3U) +/*! MSEL3 - Memory Selection 3 + * 0b0..Ram 3 is not selected for the test. + * 0b1..Ram 3 is selected for the test. + */ +#define MBIST_MSEL_MSEL3(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL3_SHIFT)) & MBIST_MSEL_MSEL3_MASK) +#define MBIST_MSEL_MSEL4_MASK (0x10U) +#define MBIST_MSEL_MSEL4_SHIFT (4U) +/*! MSEL4 - Memory Selection 4 + * 0b0..Ram 4 is not selected for the test. + * 0b1..Ram 4 is selected for the test. + */ +#define MBIST_MSEL_MSEL4(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL4_SHIFT)) & MBIST_MSEL_MSEL4_MASK) +#define MBIST_MSEL_MSEL5_MASK (0x20U) +#define MBIST_MSEL_MSEL5_SHIFT (5U) +/*! MSEL5 - Memory Selection 5 + * 0b0..Ram 5 is not selected for the test. + * 0b1..Ram 5 is selected for the test. + */ +#define MBIST_MSEL_MSEL5(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL5_SHIFT)) & MBIST_MSEL_MSEL5_MASK) +#define MBIST_MSEL_MSEL6_MASK (0x40U) +#define MBIST_MSEL_MSEL6_SHIFT (6U) +/*! MSEL6 - Memory Selection 6 + * 0b0..Ram 6 is not selected for the test. + * 0b1..Ram 6 is selected for the test. + */ +#define MBIST_MSEL_MSEL6(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL6_SHIFT)) & MBIST_MSEL_MSEL6_MASK) +#define MBIST_MSEL_MSEL7_MASK (0x80U) +#define MBIST_MSEL_MSEL7_SHIFT (7U) +/*! MSEL7 - Memory Selection 7 + * 0b0..Ram 7 is not selected for the test. + * 0b1..Ram 7 is selected for the test. + */ +#define MBIST_MSEL_MSEL7(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL7_SHIFT)) & MBIST_MSEL_MSEL7_MASK) +#define MBIST_MSEL_MSEL8_MASK (0x100U) +#define MBIST_MSEL_MSEL8_SHIFT (8U) +/*! MSEL8 - Memory Selection 8 + * 0b0..Ram 8 is not selected for the test. + * 0b1..Ram 8 is selected for the test. + */ +#define MBIST_MSEL_MSEL8(x) (((uint8_t)(((uint8_t)(x)) << MBIST_MSEL_MSEL8_SHIFT)) & MBIST_MSEL_MSEL8_MASK) +/*! @} */ + +/*! @name UDPR - User Defined Port Control */ +/*! @{ */ +#define MBIST_UDPR_UDPR0_MASK (0x1U) +#define MBIST_UDPR_UDPR0_SHIFT (0U) +#define MBIST_UDPR_UDPR0(x) (((uint16_t)(((uint16_t)(x)) << MBIST_UDPR_UDPR0_SHIFT)) & MBIST_UDPR_UDPR0_MASK) +#define MBIST_UDPR_UDPR1_MASK (0x2U) +#define MBIST_UDPR_UDPR1_SHIFT (1U) +#define MBIST_UDPR_UDPR1(x) (((uint16_t)(((uint16_t)(x)) << MBIST_UDPR_UDPR1_SHIFT)) & MBIST_UDPR_UDPR1_MASK) +#define MBIST_UDPR_UDPR12_MASK (0x1000U) +#define MBIST_UDPR_UDPR12_SHIFT (12U) +#define MBIST_UDPR_UDPR12(x) (((uint16_t)(((uint16_t)(x)) << MBIST_UDPR_UDPR12_SHIFT)) & MBIST_UDPR_UDPR12_MASK) +/*! @} */ + +/*! @name BSTART - BIST Start */ +/*! @{ */ +#define MBIST_BSTART_BSTART_MASK (0x3U) +#define MBIST_BSTART_BSTART_SHIFT (0U) +/*! BSTART - Start Command + * 0b00..No Operation + */ +#define MBIST_BSTART_BSTART(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTART_BSTART_SHIFT)) & MBIST_BSTART_BSTART_MASK) +#define MBIST_BSTART_DEAD_MASK (0x10U) +#define MBIST_BSTART_DEAD_SHIFT (4U) +#define MBIST_BSTART_DEAD(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTART_DEAD_SHIFT)) & MBIST_BSTART_DEAD_MASK) +#define MBIST_BSTART_LOOP_MASK (0xF00U) +#define MBIST_BSTART_LOOP_SHIFT (8U) +#define MBIST_BSTART_LOOP(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTART_LOOP_SHIFT)) & MBIST_BSTART_LOOP_MASK) +/*! @} */ + +/*! @name BRST - BIST Reset */ +/*! @{ */ +#define MBIST_BRST_BRST_MASK (0x1U) +#define MBIST_BRST_BRST_SHIFT (0U) +/*! BRST - Bist Soft Reset + * 0b1..FSLBIST3/ARMport general soft reset. + */ +#define MBIST_BRST_BRST(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BRST_BRST_SHIFT)) & MBIST_BRST_BRST_MASK) +#define MBIST_BRST_SRST_MASK (0x2U) +#define MBIST_BRST_SRST_SHIFT (1U) +/*! SRST - Bist Status Reset + * 0b1..FSLBIST3/ARMport Status reset. This resets: DSMs; BSMs; ipt_bist_status. + */ +#define MBIST_BRST_SRST(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BRST_SRST_SHIFT)) & MBIST_BRST_SRST_MASK) +/*! @} */ + +/*! @name SKIP - Programmable Skip Counter */ +/*! @{ */ +#define MBIST_SKIP_SCOUNTER_MASK (0xFFFFU) +#define MBIST_SKIP_SCOUNTER_SHIFT (0U) +#define MBIST_SKIP_SCOUNTER(x) (((uint16_t)(((uint16_t)(x)) << MBIST_SKIP_SCOUNTER_SHIFT)) & MBIST_SKIP_SCOUNTER_MASK) +/*! @} */ + +/*! @name BSTAT - BIST Status */ +/*! @{ */ +#define MBIST_BSTAT_BSTAT_1_0_MASK (0x3U) +#define MBIST_BSTAT_BSTAT_1_0_SHIFT (0U) +/*! BSTAT_1_0 - Bist Status 1 .. 0 + * 0b00..Bist has never ran (after reset state). + * 0b01..Bist is busy running a test. + * 0b10..Finished test with no unrepairable fails. + * 0b11..Finished test with unrepairable fails. + */ +#define MBIST_BSTAT_BSTAT_1_0(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTAT_BSTAT_1_0_SHIFT)) & MBIST_BSTAT_BSTAT_1_0_MASK) +#define MBIST_BSTAT_BSTAT_2_MASK (0x4U) +#define MBIST_BSTAT_BSTAT_2_SHIFT (2U) +/*! BSTAT_2 - Bist Status 2 + * 0b0..No error has been detected. + * 0b1..At least one error has been detected. + */ +#define MBIST_BSTAT_BSTAT_2(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTAT_BSTAT_2_SHIFT)) & MBIST_BSTAT_BSTAT_2_MASK) +#define MBIST_BSTAT_BSTAT_3_MASK (0x8U) +#define MBIST_BSTAT_BSTAT_3_SHIFT (3U) +/*! BSTAT_3 - Bist Status 3 + * 0b0..Bist is not on SOF or it is running. + * 0b1..Bist has stopped. + */ +#define MBIST_BSTAT_BSTAT_3(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTAT_BSTAT_3_SHIFT)) & MBIST_BSTAT_BSTAT_3_MASK) +#define MBIST_BSTAT_HOLD_ERR_MASK (0x20U) +#define MBIST_BSTAT_HOLD_ERR_SHIFT (5U) +/*! HOLD_ERR - Read Hold Error + * 0b0..No data stability error was found. + * 0b1..At least one data stability error was found. + */ +#define MBIST_BSTAT_HOLD_ERR(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BSTAT_HOLD_ERR_SHIFT)) & MBIST_BSTAT_HOLD_ERR_MASK) +/*! @} */ + +/*! @name FPM - BIST Fail Per Memory 1 */ +/*! @{ */ +#define MBIST_FPM_FPM0_MASK (0x1U) +#define MBIST_FPM_FPM0_SHIFT (0U) +/*! FPM0 - Fail on Memory 0 + * 0b0..Memory 0 passed the test. + * 0b1..Memory 0 failed the test. + */ +#define MBIST_FPM_FPM0(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM0_SHIFT)) & MBIST_FPM_FPM0_MASK) +#define MBIST_FPM_FPM1_MASK (0x2U) +#define MBIST_FPM_FPM1_SHIFT (1U) +/*! FPM1 - Fail on Memory 1 + * 0b0..Memory 1 passed the test. + * 0b1..Memory 1 failed the test. + */ +#define MBIST_FPM_FPM1(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM1_SHIFT)) & MBIST_FPM_FPM1_MASK) +#define MBIST_FPM_FPM2_MASK (0x4U) +#define MBIST_FPM_FPM2_SHIFT (2U) +/*! FPM2 - Fail on Memory 2 + * 0b0..Memory 2 passed the test. + * 0b1..Memory 2 failed the test. + */ +#define MBIST_FPM_FPM2(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM2_SHIFT)) & MBIST_FPM_FPM2_MASK) +#define MBIST_FPM_FPM3_MASK (0x8U) +#define MBIST_FPM_FPM3_SHIFT (3U) +/*! FPM3 - Fail on Memory 3 + * 0b0..Memory 3 passed the test. + * 0b1..Memory 3 failed the test. + */ +#define MBIST_FPM_FPM3(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM3_SHIFT)) & MBIST_FPM_FPM3_MASK) +#define MBIST_FPM_FPM4_MASK (0x10U) +#define MBIST_FPM_FPM4_SHIFT (4U) +/*! FPM4 - Fail on Memory 4 + * 0b0..Memory 4 passed the test. + * 0b1..Memory 4 failed the test. + */ +#define MBIST_FPM_FPM4(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM4_SHIFT)) & MBIST_FPM_FPM4_MASK) +#define MBIST_FPM_FPM5_MASK (0x20U) +#define MBIST_FPM_FPM5_SHIFT (5U) +/*! FPM5 - Fail on Memory 5 + * 0b0..Memory 5 passed the test. + * 0b1..Memory 5 failed the test. + */ +#define MBIST_FPM_FPM5(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM5_SHIFT)) & MBIST_FPM_FPM5_MASK) +#define MBIST_FPM_FPM6_MASK (0x40U) +#define MBIST_FPM_FPM6_SHIFT (6U) +/*! FPM6 - Fail on Memory 6 + * 0b0..Memory 6 passed the test. + * 0b1..Memory 6 failed the test. + */ +#define MBIST_FPM_FPM6(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM6_SHIFT)) & MBIST_FPM_FPM6_MASK) +#define MBIST_FPM_FPM7_MASK (0x80U) +#define MBIST_FPM_FPM7_SHIFT (7U) +/*! FPM7 - Fail on Memory 7 + * 0b0..Memory 7 passed the test. + * 0b1..Memory 7 failed the test. + */ +#define MBIST_FPM_FPM7(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM7_SHIFT)) & MBIST_FPM_FPM7_MASK) +#define MBIST_FPM_FPM8_MASK (0x100U) +#define MBIST_FPM_FPM8_SHIFT (8U) +/*! FPM8 - Fail on Memory 8 + * 0b0..Memory 8 passed the test. + * 0b1..Memory 8 failed the test. + */ +#define MBIST_FPM_FPM8(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FPM_FPM8_SHIFT)) & MBIST_FPM_FPM8_MASK) +/*! @} */ + +/*! @name BFPM - BIRA Fail Per Memory 1 */ +/*! @{ */ +#define MBIST_BFPM_BIRA_FAIL0_MASK (0x1U) +#define MBIST_BFPM_BIRA_FAIL0_SHIFT (0U) +/*! BIRA_FAIL0 - Bira Fail on Memory 0 + * 0b0..Memory 0 passed the test. + * 0b1..Memory 0 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL0(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL0_SHIFT)) & MBIST_BFPM_BIRA_FAIL0_MASK) +#define MBIST_BFPM_BIRA_FAIL1_MASK (0x2U) +#define MBIST_BFPM_BIRA_FAIL1_SHIFT (1U) +/*! BIRA_FAIL1 - Bira Fail on Memory 1 + * 0b0..Memory 1 passed the test. + * 0b1..Memory 1 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL1(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL1_SHIFT)) & MBIST_BFPM_BIRA_FAIL1_MASK) +#define MBIST_BFPM_BIRA_FAIL2_MASK (0x4U) +#define MBIST_BFPM_BIRA_FAIL2_SHIFT (2U) +/*! BIRA_FAIL2 - Bira Fail on Memory 2 + * 0b0..Memory 2 passed the test. + * 0b1..Memory 2 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL2(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL2_SHIFT)) & MBIST_BFPM_BIRA_FAIL2_MASK) +#define MBIST_BFPM_BIRA_FAIL3_MASK (0x8U) +#define MBIST_BFPM_BIRA_FAIL3_SHIFT (3U) +/*! BIRA_FAIL3 - Bira Fail on Memory 3 + * 0b0..Memory 3 passed the test. + * 0b1..Memory 3 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL3(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL3_SHIFT)) & MBIST_BFPM_BIRA_FAIL3_MASK) +#define MBIST_BFPM_BIRA_FAIL4_MASK (0x10U) +#define MBIST_BFPM_BIRA_FAIL4_SHIFT (4U) +/*! BIRA_FAIL4 - Bira Fail on Memory 4 + * 0b0..Memory 4 passed the test. + * 0b1..Memory 4 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL4(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL4_SHIFT)) & MBIST_BFPM_BIRA_FAIL4_MASK) +#define MBIST_BFPM_BIRA_FAIL5_MASK (0x20U) +#define MBIST_BFPM_BIRA_FAIL5_SHIFT (5U) +/*! BIRA_FAIL5 - Bira Fail on Memory 5 + * 0b0..Memory 5 passed the test. + * 0b1..Memory 5 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL5(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL5_SHIFT)) & MBIST_BFPM_BIRA_FAIL5_MASK) +#define MBIST_BFPM_BIRA_FAIL6_MASK (0x40U) +#define MBIST_BFPM_BIRA_FAIL6_SHIFT (6U) +/*! BIRA_FAIL6 - Bira Fail on Memory 6 + * 0b0..Memory 6 passed the test. + * 0b1..Memory 6 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL6(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL6_SHIFT)) & MBIST_BFPM_BIRA_FAIL6_MASK) +#define MBIST_BFPM_BIRA_FAIL7_MASK (0x80U) +#define MBIST_BFPM_BIRA_FAIL7_SHIFT (7U) +/*! BIRA_FAIL7 - Bira Fail on Memory 7 + * 0b0..Memory 7 passed the test. + * 0b1..Memory 7 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL7(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL7_SHIFT)) & MBIST_BFPM_BIRA_FAIL7_MASK) +#define MBIST_BFPM_BIRA_FAIL8_MASK (0x100U) +#define MBIST_BFPM_BIRA_FAIL8_SHIFT (8U) +/*! BIRA_FAIL8 - Bira Fail on Memory 8 + * 0b0..Memory 8 passed the test. + * 0b1..Memory 8 failed the test. + */ +#define MBIST_BFPM_BIRA_FAIL8(x) (((uint8_t)(((uint8_t)(x)) << MBIST_BFPM_BIRA_FAIL8_SHIFT)) & MBIST_BFPM_BIRA_FAIL8_MASK) +/*! @} */ + +/*! @name FSDR - FSM State Debug Register */ +/*! @{ */ +#define MBIST_FSDR_OP_MASK (0x3U) +#define MBIST_FSDR_OP_SHIFT (0U) +/*! OP - Operation + * 0b00..R0 + * 0b01..R1 + * 0b10..W0 + * 0b11..W1 + */ +#define MBIST_FSDR_OP(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FSDR_OP_SHIFT)) & MBIST_FSDR_OP_MASK) +#define MBIST_FSDR_MP_MASK (0x1CU) +#define MBIST_FSDR_MP_SHIFT (2U) +/*! MP - March Phase + * 0b000..MP0 + * 0b001..MP1 + * 0b010..MP2 + * 0b011..MP3 + * 0b100..MP4 + * 0b101..MP5 + */ +#define MBIST_FSDR_MP(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FSDR_MP_SHIFT)) & MBIST_FSDR_MP_MASK) +#define MBIST_FSDR_ME_MASK (0xE0U) +#define MBIST_FSDR_ME_SHIFT (5U) +/*! ME - March Element + * 0b000..ME0 + * 0b001..ME1 + * 0b010..ME2 + * 0b011..ME3 + * 0b100..ME4 + * 0b101..ME5 + * 0b110..ME6 + * 0b111..ME7 + */ +#define MBIST_FSDR_ME(x) (((uint8_t)(((uint8_t)(x)) << MBIST_FSDR_ME_SHIFT)) & MBIST_FSDR_ME_MASK) +/*! @} */ + +/*! @name ADR - Address Debug Register */ +/*! @{ */ +#define MBIST_ADR_ADDR_MASK (0x7FFU) +#define MBIST_ADR_ADDR_SHIFT (0U) +#define MBIST_ADR_ADDR(x) (((uint8_t)(((uint8_t)(x)) << MBIST_ADR_ADDR_SHIFT)) & MBIST_ADR_ADDR_MASK) +/*! @} */ + +/*! @name DBG0 - Data Debug Register - Word 0 */ +/*! @{ */ +#define MBIST_DBG0_CDATA_0_MASK (0x1U) +#define MBIST_DBG0_CDATA_0_SHIFT (0U) +/*! CDATA_0 - Data Debug Register - Bit 0 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_0(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_0_SHIFT)) & MBIST_DBG0_CDATA_0_MASK) +#define MBIST_DBG0_CDATA_1_MASK (0x2U) +#define MBIST_DBG0_CDATA_1_SHIFT (1U) +/*! CDATA_1 - Data Debug Register - Bit 1 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_1(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_1_SHIFT)) & MBIST_DBG0_CDATA_1_MASK) +#define MBIST_DBG0_CDATA_2_MASK (0x4U) +#define MBIST_DBG0_CDATA_2_SHIFT (2U) +/*! CDATA_2 - Data Debug Register - Bit 2 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_2(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_2_SHIFT)) & MBIST_DBG0_CDATA_2_MASK) +#define MBIST_DBG0_CDATA_3_MASK (0x8U) +#define MBIST_DBG0_CDATA_3_SHIFT (3U) +/*! CDATA_3 - Data Debug Register - Bit 3 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_3(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_3_SHIFT)) & MBIST_DBG0_CDATA_3_MASK) +#define MBIST_DBG0_CDATA_4_MASK (0x10U) +#define MBIST_DBG0_CDATA_4_SHIFT (4U) +/*! CDATA_4 - Data Debug Register - Bit 4 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_4(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_4_SHIFT)) & MBIST_DBG0_CDATA_4_MASK) +#define MBIST_DBG0_CDATA_5_MASK (0x20U) +#define MBIST_DBG0_CDATA_5_SHIFT (5U) +/*! CDATA_5 - Data Debug Register - Bit 5 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_5(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_5_SHIFT)) & MBIST_DBG0_CDATA_5_MASK) +#define MBIST_DBG0_CDATA_6_MASK (0x40U) +#define MBIST_DBG0_CDATA_6_SHIFT (6U) +/*! CDATA_6 - Data Debug Register - Bit 6 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_6(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_6_SHIFT)) & MBIST_DBG0_CDATA_6_MASK) +#define MBIST_DBG0_CDATA_7_MASK (0x80U) +#define MBIST_DBG0_CDATA_7_SHIFT (7U) +/*! CDATA_7 - Data Debug Register - Bit 7 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_7(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_7_SHIFT)) & MBIST_DBG0_CDATA_7_MASK) +#define MBIST_DBG0_CDATA_8_MASK (0x100U) +#define MBIST_DBG0_CDATA_8_SHIFT (8U) +/*! CDATA_8 - Data Debug Register - Bit 8 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_8(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_8_SHIFT)) & MBIST_DBG0_CDATA_8_MASK) +#define MBIST_DBG0_CDATA_9_MASK (0x200U) +#define MBIST_DBG0_CDATA_9_SHIFT (9U) +/*! CDATA_9 - Data Debug Register - Bit 9 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_9(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_9_SHIFT)) & MBIST_DBG0_CDATA_9_MASK) +#define MBIST_DBG0_CDATA_10_MASK (0x400U) +#define MBIST_DBG0_CDATA_10_SHIFT (10U) +/*! CDATA_10 - Data Debug Register - Bit 10 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_10(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_10_SHIFT)) & MBIST_DBG0_CDATA_10_MASK) +#define MBIST_DBG0_CDATA_11_MASK (0x800U) +#define MBIST_DBG0_CDATA_11_SHIFT (11U) +/*! CDATA_11 - Data Debug Register - Bit 11 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_11(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_11_SHIFT)) & MBIST_DBG0_CDATA_11_MASK) +#define MBIST_DBG0_CDATA_12_MASK (0x1000U) +#define MBIST_DBG0_CDATA_12_SHIFT (12U) +/*! CDATA_12 - Data Debug Register - Bit 12 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_12(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_12_SHIFT)) & MBIST_DBG0_CDATA_12_MASK) +#define MBIST_DBG0_CDATA_13_MASK (0x2000U) +#define MBIST_DBG0_CDATA_13_SHIFT (13U) +/*! CDATA_13 - Data Debug Register - Bit 13 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_13(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_13_SHIFT)) & MBIST_DBG0_CDATA_13_MASK) +#define MBIST_DBG0_CDATA_14_MASK (0x4000U) +#define MBIST_DBG0_CDATA_14_SHIFT (14U) +/*! CDATA_14 - Data Debug Register - Bit 14 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_14(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_14_SHIFT)) & MBIST_DBG0_CDATA_14_MASK) +#define MBIST_DBG0_CDATA_15_MASK (0x8000U) +#define MBIST_DBG0_CDATA_15_SHIFT (15U) +/*! CDATA_15 - Data Debug Register - Bit 15 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_15(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_15_SHIFT)) & MBIST_DBG0_CDATA_15_MASK) +#define MBIST_DBG0_CDATA_16_MASK (0x10000U) +#define MBIST_DBG0_CDATA_16_SHIFT (16U) +/*! CDATA_16 - Data Debug Register - Bit 16 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_16(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_16_SHIFT)) & MBIST_DBG0_CDATA_16_MASK) +#define MBIST_DBG0_CDATA_17_MASK (0x20000U) +#define MBIST_DBG0_CDATA_17_SHIFT (17U) +/*! CDATA_17 - Data Debug Register - Bit 17 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_17(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_17_SHIFT)) & MBIST_DBG0_CDATA_17_MASK) +#define MBIST_DBG0_CDATA_18_MASK (0x40000U) +#define MBIST_DBG0_CDATA_18_SHIFT (18U) +/*! CDATA_18 - Data Debug Register - Bit 18 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_18(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_18_SHIFT)) & MBIST_DBG0_CDATA_18_MASK) +#define MBIST_DBG0_CDATA_19_MASK (0x80000U) +#define MBIST_DBG0_CDATA_19_SHIFT (19U) +/*! CDATA_19 - Data Debug Register - Bit 19 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_19(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_19_SHIFT)) & MBIST_DBG0_CDATA_19_MASK) +#define MBIST_DBG0_CDATA_20_MASK (0x100000U) +#define MBIST_DBG0_CDATA_20_SHIFT (20U) +/*! CDATA_20 - Data Debug Register - Bit 20 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_20(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_20_SHIFT)) & MBIST_DBG0_CDATA_20_MASK) +#define MBIST_DBG0_CDATA_21_MASK (0x200000U) +#define MBIST_DBG0_CDATA_21_SHIFT (21U) +/*! CDATA_21 - Data Debug Register - Bit 21 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_21(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_21_SHIFT)) & MBIST_DBG0_CDATA_21_MASK) +#define MBIST_DBG0_CDATA_22_MASK (0x400000U) +#define MBIST_DBG0_CDATA_22_SHIFT (22U) +/*! CDATA_22 - Data Debug Register - Bit 22 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_22(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_22_SHIFT)) & MBIST_DBG0_CDATA_22_MASK) +#define MBIST_DBG0_CDATA_23_MASK (0x800000U) +#define MBIST_DBG0_CDATA_23_SHIFT (23U) +/*! CDATA_23 - Data Debug Register - Bit 23 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_23(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_23_SHIFT)) & MBIST_DBG0_CDATA_23_MASK) +#define MBIST_DBG0_CDATA_24_MASK (0x1000000U) +#define MBIST_DBG0_CDATA_24_SHIFT (24U) +/*! CDATA_24 - Data Debug Register - Bit 24 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_24(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_24_SHIFT)) & MBIST_DBG0_CDATA_24_MASK) +#define MBIST_DBG0_CDATA_25_MASK (0x2000000U) +#define MBIST_DBG0_CDATA_25_SHIFT (25U) +/*! CDATA_25 - Data Debug Register - Bit 25 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_25(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_25_SHIFT)) & MBIST_DBG0_CDATA_25_MASK) +#define MBIST_DBG0_CDATA_26_MASK (0x4000000U) +#define MBIST_DBG0_CDATA_26_SHIFT (26U) +/*! CDATA_26 - Data Debug Register - Bit 26 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_26(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_26_SHIFT)) & MBIST_DBG0_CDATA_26_MASK) +#define MBIST_DBG0_CDATA_27_MASK (0x8000000U) +#define MBIST_DBG0_CDATA_27_SHIFT (27U) +/*! CDATA_27 - Data Debug Register - Bit 27 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_27(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_27_SHIFT)) & MBIST_DBG0_CDATA_27_MASK) +#define MBIST_DBG0_CDATA_28_MASK (0x10000000U) +#define MBIST_DBG0_CDATA_28_SHIFT (28U) +/*! CDATA_28 - Data Debug Register - Bit 28 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_28(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_28_SHIFT)) & MBIST_DBG0_CDATA_28_MASK) +#define MBIST_DBG0_CDATA_29_MASK (0x20000000U) +#define MBIST_DBG0_CDATA_29_SHIFT (29U) +/*! CDATA_29 - Data Debug Register - Bit 29 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_29(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_29_SHIFT)) & MBIST_DBG0_CDATA_29_MASK) +#define MBIST_DBG0_CDATA_30_MASK (0x40000000U) +#define MBIST_DBG0_CDATA_30_SHIFT (30U) +/*! CDATA_30 - Data Debug Register - Bit 30 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_30(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_30_SHIFT)) & MBIST_DBG0_CDATA_30_MASK) +#define MBIST_DBG0_CDATA_31_MASK (0x80000000U) +#define MBIST_DBG0_CDATA_31_SHIFT (31U) +/*! CDATA_31 - Data Debug Register - Bit 31 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG0_CDATA_31(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG0_CDATA_31_SHIFT)) & MBIST_DBG0_CDATA_31_MASK) +/*! @} */ + +/*! @name DBG1 - Data Debug Register - Word 1 */ +/*! @{ */ +#define MBIST_DBG1_CDATA_32_MASK (0x1U) +#define MBIST_DBG1_CDATA_32_SHIFT (0U) +/*! CDATA_32 - Data Debug Register - Bit 32 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_32(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_32_SHIFT)) & MBIST_DBG1_CDATA_32_MASK) +#define MBIST_DBG1_CDATA_33_MASK (0x2U) +#define MBIST_DBG1_CDATA_33_SHIFT (1U) +/*! CDATA_33 - Data Debug Register - Bit 33 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_33(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_33_SHIFT)) & MBIST_DBG1_CDATA_33_MASK) +#define MBIST_DBG1_CDATA_34_MASK (0x4U) +#define MBIST_DBG1_CDATA_34_SHIFT (2U) +/*! CDATA_34 - Data Debug Register - Bit 34 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_34(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_34_SHIFT)) & MBIST_DBG1_CDATA_34_MASK) +#define MBIST_DBG1_CDATA_35_MASK (0x8U) +#define MBIST_DBG1_CDATA_35_SHIFT (3U) +/*! CDATA_35 - Data Debug Register - Bit 35 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_35(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_35_SHIFT)) & MBIST_DBG1_CDATA_35_MASK) +#define MBIST_DBG1_CDATA_36_MASK (0x10U) +#define MBIST_DBG1_CDATA_36_SHIFT (4U) +/*! CDATA_36 - Data Debug Register - Bit 36 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_36(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_36_SHIFT)) & MBIST_DBG1_CDATA_36_MASK) +#define MBIST_DBG1_CDATA_37_MASK (0x20U) +#define MBIST_DBG1_CDATA_37_SHIFT (5U) +/*! CDATA_37 - Data Debug Register - Bit 37 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_37(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_37_SHIFT)) & MBIST_DBG1_CDATA_37_MASK) +#define MBIST_DBG1_CDATA_38_MASK (0x40U) +#define MBIST_DBG1_CDATA_38_SHIFT (6U) +/*! CDATA_38 - Data Debug Register - Bit 38 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_38(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_38_SHIFT)) & MBIST_DBG1_CDATA_38_MASK) +#define MBIST_DBG1_CDATA_39_MASK (0x80U) +#define MBIST_DBG1_CDATA_39_SHIFT (7U) +/*! CDATA_39 - Data Debug Register - Bit 39 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_39(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_39_SHIFT)) & MBIST_DBG1_CDATA_39_MASK) +#define MBIST_DBG1_CDATA_40_MASK (0x100U) +#define MBIST_DBG1_CDATA_40_SHIFT (8U) +/*! CDATA_40 - Data Debug Register - Bit 40 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_40(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_40_SHIFT)) & MBIST_DBG1_CDATA_40_MASK) +#define MBIST_DBG1_CDATA_41_MASK (0x200U) +#define MBIST_DBG1_CDATA_41_SHIFT (9U) +/*! CDATA_41 - Data Debug Register - Bit 41 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_41(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_41_SHIFT)) & MBIST_DBG1_CDATA_41_MASK) +#define MBIST_DBG1_CDATA_42_MASK (0x400U) +#define MBIST_DBG1_CDATA_42_SHIFT (10U) +/*! CDATA_42 - Data Debug Register - Bit 42 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_42(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_42_SHIFT)) & MBIST_DBG1_CDATA_42_MASK) +#define MBIST_DBG1_CDATA_43_MASK (0x800U) +#define MBIST_DBG1_CDATA_43_SHIFT (11U) +/*! CDATA_43 - Data Debug Register - Bit 43 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_43(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_43_SHIFT)) & MBIST_DBG1_CDATA_43_MASK) +#define MBIST_DBG1_CDATA_44_MASK (0x1000U) +#define MBIST_DBG1_CDATA_44_SHIFT (12U) +/*! CDATA_44 - Data Debug Register - Bit 44 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_44(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_44_SHIFT)) & MBIST_DBG1_CDATA_44_MASK) +#define MBIST_DBG1_CDATA_45_MASK (0x2000U) +#define MBIST_DBG1_CDATA_45_SHIFT (13U) +/*! CDATA_45 - Data Debug Register - Bit 45 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_45(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_45_SHIFT)) & MBIST_DBG1_CDATA_45_MASK) +#define MBIST_DBG1_CDATA_46_MASK (0x4000U) +#define MBIST_DBG1_CDATA_46_SHIFT (14U) +/*! CDATA_46 - Data Debug Register - Bit 46 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_46(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_46_SHIFT)) & MBIST_DBG1_CDATA_46_MASK) +#define MBIST_DBG1_CDATA_47_MASK (0x8000U) +#define MBIST_DBG1_CDATA_47_SHIFT (15U) +/*! CDATA_47 - Data Debug Register - Bit 47 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_47(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_47_SHIFT)) & MBIST_DBG1_CDATA_47_MASK) +#define MBIST_DBG1_CDATA_48_MASK (0x10000U) +#define MBIST_DBG1_CDATA_48_SHIFT (16U) +/*! CDATA_48 - Data Debug Register - Bit 48 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_48(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_48_SHIFT)) & MBIST_DBG1_CDATA_48_MASK) +#define MBIST_DBG1_CDATA_49_MASK (0x20000U) +#define MBIST_DBG1_CDATA_49_SHIFT (17U) +/*! CDATA_49 - Data Debug Register - Bit 49 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_49(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_49_SHIFT)) & MBIST_DBG1_CDATA_49_MASK) +#define MBIST_DBG1_CDATA_50_MASK (0x40000U) +#define MBIST_DBG1_CDATA_50_SHIFT (18U) +/*! CDATA_50 - Data Debug Register - Bit 50 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_50(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_50_SHIFT)) & MBIST_DBG1_CDATA_50_MASK) +#define MBIST_DBG1_CDATA_51_MASK (0x80000U) +#define MBIST_DBG1_CDATA_51_SHIFT (19U) +/*! CDATA_51 - Data Debug Register - Bit 51 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_51(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_51_SHIFT)) & MBIST_DBG1_CDATA_51_MASK) +#define MBIST_DBG1_CDATA_52_MASK (0x100000U) +#define MBIST_DBG1_CDATA_52_SHIFT (20U) +/*! CDATA_52 - Data Debug Register - Bit 52 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_52(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_52_SHIFT)) & MBIST_DBG1_CDATA_52_MASK) +#define MBIST_DBG1_CDATA_53_MASK (0x200000U) +#define MBIST_DBG1_CDATA_53_SHIFT (21U) +/*! CDATA_53 - Data Debug Register - Bit 53 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_53(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_53_SHIFT)) & MBIST_DBG1_CDATA_53_MASK) +#define MBIST_DBG1_CDATA_54_MASK (0x400000U) +#define MBIST_DBG1_CDATA_54_SHIFT (22U) +/*! CDATA_54 - Data Debug Register - Bit 54 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_54(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_54_SHIFT)) & MBIST_DBG1_CDATA_54_MASK) +#define MBIST_DBG1_CDATA_55_MASK (0x800000U) +#define MBIST_DBG1_CDATA_55_SHIFT (23U) +/*! CDATA_55 - Data Debug Register - Bit 55 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_55(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_55_SHIFT)) & MBIST_DBG1_CDATA_55_MASK) +#define MBIST_DBG1_CDATA_56_MASK (0x1000000U) +#define MBIST_DBG1_CDATA_56_SHIFT (24U) +/*! CDATA_56 - Data Debug Register - Bit 56 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_56(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_56_SHIFT)) & MBIST_DBG1_CDATA_56_MASK) +#define MBIST_DBG1_CDATA_57_MASK (0x2000000U) +#define MBIST_DBG1_CDATA_57_SHIFT (25U) +/*! CDATA_57 - Data Debug Register - Bit 57 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_57(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_57_SHIFT)) & MBIST_DBG1_CDATA_57_MASK) +#define MBIST_DBG1_CDATA_58_MASK (0x4000000U) +#define MBIST_DBG1_CDATA_58_SHIFT (26U) +/*! CDATA_58 - Data Debug Register - Bit 58 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_58(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_58_SHIFT)) & MBIST_DBG1_CDATA_58_MASK) +#define MBIST_DBG1_CDATA_59_MASK (0x8000000U) +#define MBIST_DBG1_CDATA_59_SHIFT (27U) +/*! CDATA_59 - Data Debug Register - Bit 59 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_59(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_59_SHIFT)) & MBIST_DBG1_CDATA_59_MASK) +#define MBIST_DBG1_CDATA_60_MASK (0x10000000U) +#define MBIST_DBG1_CDATA_60_SHIFT (28U) +/*! CDATA_60 - Data Debug Register - Bit 60 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_60(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_60_SHIFT)) & MBIST_DBG1_CDATA_60_MASK) +#define MBIST_DBG1_CDATA_61_MASK (0x20000000U) +#define MBIST_DBG1_CDATA_61_SHIFT (29U) +/*! CDATA_61 - Data Debug Register - Bit 61 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_61(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_61_SHIFT)) & MBIST_DBG1_CDATA_61_MASK) +#define MBIST_DBG1_CDATA_62_MASK (0x40000000U) +#define MBIST_DBG1_CDATA_62_SHIFT (30U) +/*! CDATA_62 - Data Debug Register - Bit 62 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_62(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_62_SHIFT)) & MBIST_DBG1_CDATA_62_MASK) +#define MBIST_DBG1_CDATA_63_MASK (0x80000000U) +#define MBIST_DBG1_CDATA_63_SHIFT (31U) +/*! CDATA_63 - Data Debug Register - Bit 63 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG1_CDATA_63(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG1_CDATA_63_SHIFT)) & MBIST_DBG1_CDATA_63_MASK) +/*! @} */ + +/*! @name DBG2 - Data Debug Register - Word 2 */ +/*! @{ */ +#define MBIST_DBG2_CDATA_64_MASK (0x1U) +#define MBIST_DBG2_CDATA_64_SHIFT (0U) +/*! CDATA_64 - Data Debug Register - Bit 64 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_64(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_64_SHIFT)) & MBIST_DBG2_CDATA_64_MASK) +#define MBIST_DBG2_CDATA_65_MASK (0x2U) +#define MBIST_DBG2_CDATA_65_SHIFT (1U) +/*! CDATA_65 - Data Debug Register - Bit 65 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_65(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_65_SHIFT)) & MBIST_DBG2_CDATA_65_MASK) +#define MBIST_DBG2_CDATA_66_MASK (0x4U) +#define MBIST_DBG2_CDATA_66_SHIFT (2U) +/*! CDATA_66 - Data Debug Register - Bit 66 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_66(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_66_SHIFT)) & MBIST_DBG2_CDATA_66_MASK) +#define MBIST_DBG2_CDATA_67_MASK (0x8U) +#define MBIST_DBG2_CDATA_67_SHIFT (3U) +/*! CDATA_67 - Data Debug Register - Bit 67 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_67(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_67_SHIFT)) & MBIST_DBG2_CDATA_67_MASK) +#define MBIST_DBG2_CDATA_68_MASK (0x10U) +#define MBIST_DBG2_CDATA_68_SHIFT (4U) +/*! CDATA_68 - Data Debug Register - Bit 68 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_68(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_68_SHIFT)) & MBIST_DBG2_CDATA_68_MASK) +#define MBIST_DBG2_CDATA_69_MASK (0x20U) +#define MBIST_DBG2_CDATA_69_SHIFT (5U) +/*! CDATA_69 - Data Debug Register - Bit 69 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_69(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_69_SHIFT)) & MBIST_DBG2_CDATA_69_MASK) +#define MBIST_DBG2_CDATA_70_MASK (0x40U) +#define MBIST_DBG2_CDATA_70_SHIFT (6U) +/*! CDATA_70 - Data Debug Register - Bit 70 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_70(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_70_SHIFT)) & MBIST_DBG2_CDATA_70_MASK) +#define MBIST_DBG2_CDATA_71_MASK (0x80U) +#define MBIST_DBG2_CDATA_71_SHIFT (7U) +/*! CDATA_71 - Data Debug Register - Bit 71 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_71(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_71_SHIFT)) & MBIST_DBG2_CDATA_71_MASK) +#define MBIST_DBG2_CDATA_72_MASK (0x100U) +#define MBIST_DBG2_CDATA_72_SHIFT (8U) +/*! CDATA_72 - Data Debug Register - Bit 72 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_72(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_72_SHIFT)) & MBIST_DBG2_CDATA_72_MASK) +#define MBIST_DBG2_CDATA_73_MASK (0x200U) +#define MBIST_DBG2_CDATA_73_SHIFT (9U) +/*! CDATA_73 - Data Debug Register - Bit 73 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_73(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_73_SHIFT)) & MBIST_DBG2_CDATA_73_MASK) +#define MBIST_DBG2_CDATA_74_MASK (0x400U) +#define MBIST_DBG2_CDATA_74_SHIFT (10U) +/*! CDATA_74 - Data Debug Register - Bit 74 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_74(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_74_SHIFT)) & MBIST_DBG2_CDATA_74_MASK) +#define MBIST_DBG2_CDATA_75_MASK (0x800U) +#define MBIST_DBG2_CDATA_75_SHIFT (11U) +/*! CDATA_75 - Data Debug Register - Bit 75 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_75(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_75_SHIFT)) & MBIST_DBG2_CDATA_75_MASK) +#define MBIST_DBG2_CDATA_76_MASK (0x1000U) +#define MBIST_DBG2_CDATA_76_SHIFT (12U) +/*! CDATA_76 - Data Debug Register - Bit 76 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_76(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_76_SHIFT)) & MBIST_DBG2_CDATA_76_MASK) +#define MBIST_DBG2_CDATA_77_MASK (0x2000U) +#define MBIST_DBG2_CDATA_77_SHIFT (13U) +/*! CDATA_77 - Data Debug Register - Bit 77 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_77(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_77_SHIFT)) & MBIST_DBG2_CDATA_77_MASK) +#define MBIST_DBG2_CDATA_78_MASK (0x4000U) +#define MBIST_DBG2_CDATA_78_SHIFT (14U) +/*! CDATA_78 - Data Debug Register - Bit 78 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_78(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_78_SHIFT)) & MBIST_DBG2_CDATA_78_MASK) +#define MBIST_DBG2_CDATA_79_MASK (0x8000U) +#define MBIST_DBG2_CDATA_79_SHIFT (15U) +/*! CDATA_79 - Data Debug Register - Bit 79 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_79(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_79_SHIFT)) & MBIST_DBG2_CDATA_79_MASK) +#define MBIST_DBG2_CDATA_80_MASK (0x10000U) +#define MBIST_DBG2_CDATA_80_SHIFT (16U) +/*! CDATA_80 - Data Debug Register - Bit 80 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_80(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_80_SHIFT)) & MBIST_DBG2_CDATA_80_MASK) +#define MBIST_DBG2_CDATA_81_MASK (0x20000U) +#define MBIST_DBG2_CDATA_81_SHIFT (17U) +/*! CDATA_81 - Data Debug Register - Bit 81 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_81(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_81_SHIFT)) & MBIST_DBG2_CDATA_81_MASK) +#define MBIST_DBG2_CDATA_82_MASK (0x40000U) +#define MBIST_DBG2_CDATA_82_SHIFT (18U) +/*! CDATA_82 - Data Debug Register - Bit 82 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_82(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_82_SHIFT)) & MBIST_DBG2_CDATA_82_MASK) +#define MBIST_DBG2_CDATA_83_MASK (0x80000U) +#define MBIST_DBG2_CDATA_83_SHIFT (19U) +/*! CDATA_83 - Data Debug Register - Bit 83 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_83(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_83_SHIFT)) & MBIST_DBG2_CDATA_83_MASK) +#define MBIST_DBG2_CDATA_84_MASK (0x100000U) +#define MBIST_DBG2_CDATA_84_SHIFT (20U) +/*! CDATA_84 - Data Debug Register - Bit 84 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_84(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_84_SHIFT)) & MBIST_DBG2_CDATA_84_MASK) +#define MBIST_DBG2_CDATA_85_MASK (0x200000U) +#define MBIST_DBG2_CDATA_85_SHIFT (21U) +/*! CDATA_85 - Data Debug Register - Bit 85 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_85(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_85_SHIFT)) & MBIST_DBG2_CDATA_85_MASK) +#define MBIST_DBG2_CDATA_86_MASK (0x400000U) +#define MBIST_DBG2_CDATA_86_SHIFT (22U) +/*! CDATA_86 - Data Debug Register - Bit 86 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_86(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_86_SHIFT)) & MBIST_DBG2_CDATA_86_MASK) +#define MBIST_DBG2_CDATA_87_MASK (0x800000U) +#define MBIST_DBG2_CDATA_87_SHIFT (23U) +/*! CDATA_87 - Data Debug Register - Bit 87 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_87(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_87_SHIFT)) & MBIST_DBG2_CDATA_87_MASK) +#define MBIST_DBG2_CDATA_88_MASK (0x1000000U) +#define MBIST_DBG2_CDATA_88_SHIFT (24U) +/*! CDATA_88 - Data Debug Register - Bit 88 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_88(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_88_SHIFT)) & MBIST_DBG2_CDATA_88_MASK) +#define MBIST_DBG2_CDATA_89_MASK (0x2000000U) +#define MBIST_DBG2_CDATA_89_SHIFT (25U) +/*! CDATA_89 - Data Debug Register - Bit 89 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_89(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_89_SHIFT)) & MBIST_DBG2_CDATA_89_MASK) +#define MBIST_DBG2_CDATA_90_MASK (0x4000000U) +#define MBIST_DBG2_CDATA_90_SHIFT (26U) +/*! CDATA_90 - Data Debug Register - Bit 90 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_90(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_90_SHIFT)) & MBIST_DBG2_CDATA_90_MASK) +#define MBIST_DBG2_CDATA_91_MASK (0x8000000U) +#define MBIST_DBG2_CDATA_91_SHIFT (27U) +/*! CDATA_91 - Data Debug Register - Bit 91 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_91(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_91_SHIFT)) & MBIST_DBG2_CDATA_91_MASK) +#define MBIST_DBG2_CDATA_92_MASK (0x10000000U) +#define MBIST_DBG2_CDATA_92_SHIFT (28U) +/*! CDATA_92 - Data Debug Register - Bit 92 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_92(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_92_SHIFT)) & MBIST_DBG2_CDATA_92_MASK) +#define MBIST_DBG2_CDATA_93_MASK (0x20000000U) +#define MBIST_DBG2_CDATA_93_SHIFT (29U) +/*! CDATA_93 - Data Debug Register - Bit 93 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_93(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_93_SHIFT)) & MBIST_DBG2_CDATA_93_MASK) +#define MBIST_DBG2_CDATA_94_MASK (0x40000000U) +#define MBIST_DBG2_CDATA_94_SHIFT (30U) +/*! CDATA_94 - Data Debug Register - Bit 94 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_94(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_94_SHIFT)) & MBIST_DBG2_CDATA_94_MASK) +#define MBIST_DBG2_CDATA_95_MASK (0x80000000U) +#define MBIST_DBG2_CDATA_95_SHIFT (31U) +/*! CDATA_95 - Data Debug Register - Bit 95 + * 0b0..Bit compare passed. + * 0b1..Bit compare failed. + */ +#define MBIST_DBG2_CDATA_95(x) (((uint32_t)(((uint32_t)(x)) << MBIST_DBG2_CDATA_95_SHIFT)) & MBIST_DBG2_CDATA_95_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group MBIST_Register_Masks */ + +/*! + * @} + */ /* end of group MBIST_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Bit_Field_Generic_Macros Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). + * @{ + */ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/** + * @brief Mask and left-shift a bit field value for use in a register bit range. + * @param field Name of the register bit field. + * @param value Value of the bit field. + * @return Masked and shifted value. + */ +#define NXP_VAL2FLD(field, value) (((value) << (field ## _SHIFT)) & (field ## _MASK)) +/** + * @brief Mask and right-shift a register value to extract a bit field value. + * @param field Name of the register bit field. + * @param value Value of the register. + * @return Masked and shifted bit field value. + */ +#define NXP_FLD2VAL(field, value) (((value) & (field ## _MASK)) >> (field ## _SHIFT)) + +/*! + * @} + */ /* end of group Bit_Field_Generic_Macros */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* MX8_MBIST_H */ + diff --git a/platform/devices/MX8/MX8_mcm.h b/platform/devices/MX8/MX8_mcm.h new file mode 100755 index 0000000..d947cb2 --- /dev/null +++ b/platform/devices/MX8/MX8_mcm.h @@ -0,0 +1,291 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_MCM_REGISTERS_H +#define HW_MCM_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- MCM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MCM_Peripheral_Access_Layer MCM Peripheral Access Layer + * @{ + */ + +/** MCM - Register Layout Typedef */ +typedef struct { + __I uint32_t REVINFO; /**< Core Type and Plaform Revision register, offset: 0x0 */ + __I uint32_t MEMCFG; /**< Memory Configuration register, offset: 0x4 */ + __I uint16_t PLASC; /**< Crossbar Switch (AXBS) Slave Configuration, offset: 0x8 */ + __I uint16_t PLAMC; /**< Crossbar Switch (AXBS) Master Configuration, offset: 0xA */ + __IO uint32_t CR; /**< Control Register, offset: 0xC */ + __IO uint32_t ISCR; /**< Interrupt Status and control Register, offset: 0x10 */ + __IO uint32_t ETBCC; /**< ETB Counter Control register, offset: 0x14 */ + __IO uint32_t ETBRL; /**< ETB Reload register, offset: 0x18 */ + __I uint32_t ETBCNT; /**< ETB Counter Value register, offset: 0x1C */ + __I uint32_t FADR; /**< Fault address register, offset: 0x20 */ + __I uint32_t FATR; /**< Fault attributes register, offset: 0x24 */ + __I uint32_t FDR; /**< Fault data register, offset: 0x28 */ + uint8_t RESERVED_1[4]; + __IO uint32_t PID; /**< Process ID register, offset: 0x30 */ + uint8_t RESERVED_2[12]; + __IO uint32_t CPO; /**< Compute Operation Control Register, offset: 0x40 */ + uint8_t RESERVED_3[956]; + __IO uint32_t LMDR0; /**< Local Memory Descriptor Register, offset: 0x400 */ + __IO uint32_t LMDR1; /**< Local Memory Descriptor Register, offset: 0x404 */ + __IO uint32_t LMDR2; /**< Local Memory Descriptor Register, offset: 0x408 */ + __IO uint32_t LMDR3; /**< Local Memory Descriptor Register, offset: 0x40C */ + uint8_t RESERVED_4[112]; + __IO uint32_t LMPECR; /**< LMEM Parity & ECC Control Register, offset: 0x480 */ + uint8_t RESERVED_5[4]; + __IO uint32_t LMPEIR; /**< LMEM Parity & ECC Interrupt Register, offset: 0x488 */ + uint8_t RESERVED_6[4]; + __IO uint32_t LMFAR; /**< LMEM Fault Address Register, offset: 0x490 */ + __IO uint32_t LMFATR; /**< LMEM Fault Attribute Register, offset: 0x494 */ + uint8_t RESERVED_7[8]; + __IO uint32_t LMFDHR; /**< LMEM Fault Data High Register, offset: 0x4A0 */ + __IO uint32_t LMFDLR; /**< LMEM Fault Data Low Register, offset: 0x4A4 */ +} MCM_Type; + +/* ---------------------------------------------------------------------------- + -- MCM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MCM_Register_Masks MCM Register Masks + * @{ + */ + +/*! @name PLASC - Crossbar Switch (AXBS) Slave Configuration */ +#define MCM_PLASC_ASC_MASK (0xFFU) +#define MCM_PLASC_ASC_SHIFT (0U) +#define MCM_PLASC_ASC(x) (((uint16_t)(((uint16_t)(x)) << MCM_PLASC_ASC_SHIFT)) & MCM_PLASC_ASC_MASK) + +/*! @name PLAMC - Crossbar Switch (AXBS) Master Configuration */ +#define MCM_PLAMC_AMC_MASK (0xFFU) +#define MCM_PLAMC_AMC_SHIFT (0U) +#define MCM_PLAMC_AMC(x) (((uint16_t)(((uint16_t)(x)) << MCM_PLAMC_AMC_SHIFT)) & MCM_PLAMC_AMC_MASK) + +/*! @name CR - Control Register */ +#define MCM_CR_DDRSIZE_MASK (0x300000U) +#define MCM_CR_DDRSIZE_SHIFT (20U) +#define MCM_CR_DDRSIZE(x) (((uint32_t)(((uint32_t)(x)) << MCM_CR_DDRSIZE_SHIFT)) & MCM_CR_DDRSIZE_MASK) +#define MCM_CR_SRAMUAP_MASK (0x3000000U) +#define MCM_CR_SRAMUAP_SHIFT (24U) +#define MCM_CR_SRAMUAP(x) (((uint32_t)(((uint32_t)(x)) << MCM_CR_SRAMUAP_SHIFT)) & MCM_CR_SRAMUAP_MASK) +#define MCM_CR_SRAMUWP_MASK (0x4000000U) +#define MCM_CR_SRAMUWP_SHIFT (26U) +#define MCM_CR_SRAMUWP(x) (((uint32_t)(((uint32_t)(x)) << MCM_CR_SRAMUWP_SHIFT)) & MCM_CR_SRAMUWP_MASK) +#define MCM_CR_SRAMLAP_MASK (0x30000000U) +#define MCM_CR_SRAMLAP_SHIFT (28U) +#define MCM_CR_SRAMLAP(x) (((uint32_t)(((uint32_t)(x)) << MCM_CR_SRAMLAP_SHIFT)) & MCM_CR_SRAMLAP_MASK) +#define MCM_CR_SRAMLWP_MASK (0x40000000U) +#define MCM_CR_SRAMLWP_SHIFT (30U) +#define MCM_CR_SRAMLWP(x) (((uint32_t)(((uint32_t)(x)) << MCM_CR_SRAMLWP_SHIFT)) & MCM_CR_SRAMLWP_MASK) + +/*! @name ISCR - Interrupt Status and control Register */ +#define MCM_ISCR_IRQ_MASK (0x2U) +#define MCM_ISCR_IRQ_SHIFT (1U) +#define MCM_ISCR_IRQ(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_IRQ_SHIFT)) & MCM_ISCR_IRQ_MASK) +#define MCM_ISCR_NMI_MASK (0x4U) +#define MCM_ISCR_NMI_SHIFT (2U) +#define MCM_ISCR_NMI(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_NMI_SHIFT)) & MCM_ISCR_NMI_MASK) +#define MCM_ISCR_DHREQ_MASK (0x8U) +#define MCM_ISCR_DHREQ_SHIFT (3U) +#define MCM_ISCR_DHREQ(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_DHREQ_SHIFT)) & MCM_ISCR_DHREQ_MASK) +#define MCM_ISCR_CWBER_MASK (0x10U) +#define MCM_ISCR_CWBER_SHIFT (4U) +#define MCM_ISCR_CWBER(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_CWBER_SHIFT)) & MCM_ISCR_CWBER_MASK) +#define MCM_ISCR_FIOC_MASK (0x100U) +#define MCM_ISCR_FIOC_SHIFT (8U) +#define MCM_ISCR_FIOC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIOC_SHIFT)) & MCM_ISCR_FIOC_MASK) +#define MCM_ISCR_FDZC_MASK (0x200U) +#define MCM_ISCR_FDZC_SHIFT (9U) +#define MCM_ISCR_FDZC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FDZC_SHIFT)) & MCM_ISCR_FDZC_MASK) +#define MCM_ISCR_FOFC_MASK (0x400U) +#define MCM_ISCR_FOFC_SHIFT (10U) +#define MCM_ISCR_FOFC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FOFC_SHIFT)) & MCM_ISCR_FOFC_MASK) +#define MCM_ISCR_FUFC_MASK (0x800U) +#define MCM_ISCR_FUFC_SHIFT (11U) +#define MCM_ISCR_FUFC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FUFC_SHIFT)) & MCM_ISCR_FUFC_MASK) +#define MCM_ISCR_FIXC_MASK (0x1000U) +#define MCM_ISCR_FIXC_SHIFT (12U) +#define MCM_ISCR_FIXC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIXC_SHIFT)) & MCM_ISCR_FIXC_MASK) +#define MCM_ISCR_FIDC_MASK (0x8000U) +#define MCM_ISCR_FIDC_SHIFT (15U) +#define MCM_ISCR_FIDC(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIDC_SHIFT)) & MCM_ISCR_FIDC_MASK) +#define MCM_ISCR_CWBEE_MASK (0x100000U) +#define MCM_ISCR_CWBEE_SHIFT (20U) +#define MCM_ISCR_CWBEE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_CWBEE_SHIFT)) & MCM_ISCR_CWBEE_MASK) +#define MCM_ISCR_FIOCE_MASK (0x1000000U) +#define MCM_ISCR_FIOCE_SHIFT (24U) +#define MCM_ISCR_FIOCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIOCE_SHIFT)) & MCM_ISCR_FIOCE_MASK) +#define MCM_ISCR_FDZCE_MASK (0x2000000U) +#define MCM_ISCR_FDZCE_SHIFT (25U) +#define MCM_ISCR_FDZCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FDZCE_SHIFT)) & MCM_ISCR_FDZCE_MASK) +#define MCM_ISCR_FOFCE_MASK (0x4000000U) +#define MCM_ISCR_FOFCE_SHIFT (26U) +#define MCM_ISCR_FOFCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FOFCE_SHIFT)) & MCM_ISCR_FOFCE_MASK) +#define MCM_ISCR_FUFCE_MASK (0x8000000U) +#define MCM_ISCR_FUFCE_SHIFT (27U) +#define MCM_ISCR_FUFCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FUFCE_SHIFT)) & MCM_ISCR_FUFCE_MASK) +#define MCM_ISCR_FIXCE_MASK (0x10000000U) +#define MCM_ISCR_FIXCE_SHIFT (28U) +#define MCM_ISCR_FIXCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIXCE_SHIFT)) & MCM_ISCR_FIXCE_MASK) +#define MCM_ISCR_FIDCE_MASK (0x80000000U) +#define MCM_ISCR_FIDCE_SHIFT (31U) +#define MCM_ISCR_FIDCE(x) (((uint32_t)(((uint32_t)(x)) << MCM_ISCR_FIDCE_SHIFT)) & MCM_ISCR_FIDCE_MASK) + +/*! @name ETBCC - ETB Counter Control register */ +#define MCM_ETBCC_CNTEN_MASK (0x1U) +#define MCM_ETBCC_CNTEN_SHIFT (0U) +#define MCM_ETBCC_CNTEN(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCC_CNTEN_SHIFT)) & MCM_ETBCC_CNTEN_MASK) +#define MCM_ETBCC_RSPT_MASK (0x6U) +#define MCM_ETBCC_RSPT_SHIFT (1U) +#define MCM_ETBCC_RSPT(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCC_RSPT_SHIFT)) & MCM_ETBCC_RSPT_MASK) +#define MCM_ETBCC_RLRQ_MASK (0x8U) +#define MCM_ETBCC_RLRQ_SHIFT (3U) +#define MCM_ETBCC_RLRQ(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCC_RLRQ_SHIFT)) & MCM_ETBCC_RLRQ_MASK) +#define MCM_ETBCC_ETDIS_MASK (0x10U) +#define MCM_ETBCC_ETDIS_SHIFT (4U) +#define MCM_ETBCC_ETDIS(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCC_ETDIS_SHIFT)) & MCM_ETBCC_ETDIS_MASK) +#define MCM_ETBCC_ITDIS_MASK (0x20U) +#define MCM_ETBCC_ITDIS_SHIFT (5U) +#define MCM_ETBCC_ITDIS(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCC_ITDIS_SHIFT)) & MCM_ETBCC_ITDIS_MASK) + +/*! @name ETBRL - ETB Reload register */ +#define MCM_ETBRL_RELOAD_MASK (0x7FFU) +#define MCM_ETBRL_RELOAD_SHIFT (0U) +#define MCM_ETBRL_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBRL_RELOAD_SHIFT)) & MCM_ETBRL_RELOAD_MASK) + +/*! @name ETBCNT - ETB Counter Value register */ +#define MCM_ETBCNT_COUNTER_MASK (0x7FFU) +#define MCM_ETBCNT_COUNTER_SHIFT (0U) +#define MCM_ETBCNT_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << MCM_ETBCNT_COUNTER_SHIFT)) & MCM_ETBCNT_COUNTER_MASK) + +/*! @name FADR - Fault address register */ +#define MCM_FADR_ADDRESS_MASK (0xFFFFFFFFU) +#define MCM_FADR_ADDRESS_SHIFT (0U) +#define MCM_FADR_ADDRESS(x) (((uint32_t)(((uint32_t)(x)) << MCM_FADR_ADDRESS_SHIFT)) & MCM_FADR_ADDRESS_MASK) + +/*! @name FATR - Fault attributes register */ +#define MCM_FATR_BEDA_MASK (0x1U) +#define MCM_FATR_BEDA_SHIFT (0U) +#define MCM_FATR_BEDA(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BEDA_SHIFT)) & MCM_FATR_BEDA_MASK) +#define MCM_FATR_BEMD_MASK (0x2U) +#define MCM_FATR_BEMD_SHIFT (1U) +#define MCM_FATR_BEMD(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BEMD_SHIFT)) & MCM_FATR_BEMD_MASK) +#define MCM_FATR_BESZ_MASK (0x30U) +#define MCM_FATR_BESZ_SHIFT (4U) +#define MCM_FATR_BESZ(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BESZ_SHIFT)) & MCM_FATR_BESZ_MASK) +#define MCM_FATR_BEWT_MASK (0x80U) +#define MCM_FATR_BEWT_SHIFT (7U) +#define MCM_FATR_BEWT(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BEWT_SHIFT)) & MCM_FATR_BEWT_MASK) +#define MCM_FATR_BEMN_MASK (0xF00U) +#define MCM_FATR_BEMN_SHIFT (8U) +#define MCM_FATR_BEMN(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BEMN_SHIFT)) & MCM_FATR_BEMN_MASK) +#define MCM_FATR_BEOVR_MASK (0x80000000U) +#define MCM_FATR_BEOVR_SHIFT (31U) +#define MCM_FATR_BEOVR(x) (((uint32_t)(((uint32_t)(x)) << MCM_FATR_BEOVR_SHIFT)) & MCM_FATR_BEOVR_MASK) + +/*! @name FDR - Fault data register */ +#define MCM_FDR_DATA_MASK (0xFFFFFFFFU) +#define MCM_FDR_DATA_SHIFT (0U) +#define MCM_FDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MCM_FDR_DATA_SHIFT)) & MCM_FDR_DATA_MASK) + +/*! @name PID - Process ID register */ +#define MCM_PID_PID_MASK (0xFFU) +#define MCM_PID_PID_SHIFT (0U) +#define MCM_PID_PID(x) (((uint32_t)(((uint32_t)(x)) << MCM_PID_PID_SHIFT)) & MCM_PID_PID_MASK) + +/*! @name PID - Process ID register */ +#define MCM_LMPEIR_ENC_TCML_MASK (0x00000001U) +#define MCM_LMPEIR_ENC_TCML_SHIFT (0U) +#define MCM_LMPEIR_ENC_TCML(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_ENC_TCML_SHIFT)) & MCM_LMPEIR_ENC_TCML_MASK) +#define MCM_LMPEIR_ENC_TCMU_MASK (0x00000002U) +#define MCM_LMPEIR_ENC_TCMU_SHIFT (1U) +#define MCM_LMPEIR_ENC_TCMU(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_ENC_TCMU_SHIFT)) & MCM_LMPEIR_ENC_TCMU_MASK) +#define MCM_LMPEIR_PE_CCTAG_MASK (0x00100000U) +#define MCM_LMPEIR_PE_CCTAG_SHIFT (20U) +#define MCM_LMPEIR_PE_CCTAG(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_PE_CCTAG_SHIFT)) & MCM_LMPEIR_PE_CCTAG_MASK) +#define MCM_LMPEIR_PE_CCDATA_MASK (0x00200000U) +#define MCM_LMPEIR_PE_CCDATA_SHIFT (21U) +#define MCM_LMPEIR_PE_CCDATA(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_PE_CCDATA_SHIFT)) & MCM_LMPEIR_PE_CCDATA_MASK) +#define MCM_LMPEIR_PE_SCTAG_MASK (0x00400000U) +#define MCM_LMPEIR_PE_SCTAG_SHIFT (22U) +#define MCM_LMPEIR_PE_SCTAG(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_PE_SCTAG_SHIFT)) & MCM_LMPEIR_PE_SCTAG_MASK) +#define MCM_LMPEIR_PE_SCDATA_MASK (0x00800000U) +#define MCM_LMPEIR_PE_SCDATA_SHIFT (23U) +#define MCM_LMPEIR_PE_SCDATA(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_PE_SCDATA_SHIFT)) & MCM_LMPEIR_PE_SCDATA_MASK) +#define MCM_LMPEIR_PEELOC_MASK (0x1F000000U) +#define MCM_LMPEIR_PEELOC_SHIFT (24U) +#define MCM_LMPEIR_PEELOC(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_PEELOC_SHIFT)) & MCM_LMPEIR_PEELOC_MASK) +#define MCM_LMPEIR_V_MASK (0x80000000U) +#define MCM_LMPEIR_V_SHIFT (31U) +#define MCM_LMPEIR_V(x) (((uint32_t)(((uint32_t)(x)) << MCM_LMPEIR_V_SHIFT)) & MCM_LMPEIR_V_MASK) + + +/*! + * @} + */ /* end of group MCM_Register_Masks */ + + +/* MCM - Peripheral instance base addresses */ +/** Peripheral MCM base pointer */ +#define MCM ((MCM_Type *)MCM_BASE) +/** Array initializer of MCM peripheral base addresses */ +#define MCM_BASE_ADDRS { MCM_BASE } +/** Array initializer of MCM peripheral base pointers */ +#define MCM_BASE_PTRS { MCM } + +/*! + * @} + */ /* end of group MCM_Peripheral_Access_Layer */ + +#endif /* HW_MCM_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_mu.h b/platform/devices/MX8/MX8_mu.h new file mode 100755 index 0000000..cae01ea --- /dev/null +++ b/platform/devices/MX8/MX8_mu.h @@ -0,0 +1,278 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ + +#ifndef HW_MU_REGISTERS_H +#define HW_MU_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- MU Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @brief Core B boot mode. + */ +typedef enum _mu_core_boot_mode +{ + kMU_CoreBootFromAddr0 = 0x00U, /*!< Boot from 0x00. */ + kMU_CoreBootFromDmem = 0x01U, /*!< Boot from DMEM base. */ + kMU_CoreBootFromImem = 0x02U /*!< Boot from IMEM base. */ +} mu_core_boot_mode_t; + +/*! + * @brief Power mode definition. + */ +typedef enum _mu_power_mode +{ + kMU_PowerModeRun = 0x00U, /*!< Run mode. */ + kMU_PowerModeWait = 0x01U, /*!< WAIT mode. */ + kMU_PowerModeStop = 0x02U, /*!< STOP/VLPS mode. */ + kMU_PowerModeDsm = 0x03U /*!< DSM: LLS/VLLS mode. */ +} mu_power_mode_t; + +/*! + * @addtogroup MU_Peripheral_Access_Layer MU Peripheral Access Layer + * @{ + */ + +/** MU - Register Layout Typedef */ +typedef struct { + __IO uint32_t TR[4]; /**< Transmit Register, array offset: 0x00, array step: 0x4 */ + __I uint32_t RR[4]; /**< Receive Register, array offset: 0x10, array step: 0x4 */ + __IO uint32_t SR; /**< Status Register, offset: 0x20 */ + __IO uint32_t CR; /**< Control Register, offset: 0x24 */ +} MU_Type; + +/* ---------------------------------------------------------------------------- + -- MU Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MU_Register_Masks MU Register Masks + * @{ + */ + +/*! @name TR - Transmit Register */ +#define MU_TR_DATA_MASK (0xFFFFFFFFU) +#define MU_TR_DATA_SHIFT (0U) +#define MU_TR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MU_TR_DATA_SHIFT)) & MU_TR_DATA_MASK) + +/* The count of MU_TR */ +#define MU_TR_COUNT (4U) + +/*! @name RR - Receive Register */ +#define MU_RR_DATA_MASK (0xFFFFFFFFU) +#define MU_RR_DATA_SHIFT (0U) +#define MU_RR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MU_RR_DATA_SHIFT)) & MU_RR_DATA_MASK) + +/* The count of MU_RR */ +#define MU_RR_COUNT (4U) + +/*! @name SR - Status Register */ +#define MU_SR_Fn_MASK (0x7U) +#define MU_SR_Fn_SHIFT (0U) +#define MU_SR_Fn(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_Fn_SHIFT)) & MU_SR_Fn_MASK) +#define MU_SR_NMIC_MASK (0x8U) +#define MU_SR_NMIC_SHIFT (3U) +#define MU_SR_NMIC(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_NMIC_SHIFT)) & MU_SR_NMIC_MASK) +#define MU_SR_EP_MASK (0x10U) +#define MU_SR_EP_SHIFT (4U) +#define MU_SR_EP(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_EP_SHIFT)) & MU_SR_EP_MASK) +#define MU_SR_PM_MASK (0x60U) +#define MU_SR_PM_SHIFT (5U) +#define MU_SR_PM(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_PM_SHIFT)) & MU_SR_PM_MASK) +#define MU_SR_FUP_MASK (0x100U) +#define MU_SR_FUP_SHIFT (8U) +#define MU_SR_FUP(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_FUP_SHIFT)) & MU_SR_FUP_MASK) +#define MU_SR_TEn_MASK (0xF00000U) +#define MU_SR_TEn_SHIFT (20U) +#define MU_SR_TEn(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_TEn_SHIFT)) & MU_SR_TEn_MASK) +#define MU_SR_RFn_MASK (0xF000000U) +#define MU_SR_RFn_SHIFT (24U) +#define MU_SR_RFn(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_RFn_SHIFT)) & MU_SR_RFn_MASK) +#define MU_SR_GIPn_MASK (0xF0000000U) +#define MU_SR_GIPn_SHIFT (28U) +#define MU_SR_GIPn(x) (((uint32_t)(((uint32_t)(x)) << MU_SR_GIPn_SHIFT)) & MU_SR_GIPn_MASK) + +/*! @name CR - Control Register */ +#define MU_CR_Fn_MASK (0x7U) +#define MU_CR_Fn_SHIFT (0U) +#define MU_CR_Fn(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_Fn_SHIFT)) & MU_CR_Fn_MASK) +#define MU_CR_NMI_MASK (0x8U) +#define MU_CR_NMI_SHIFT (3U) +#define MU_CR_NMI(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_NMI_SHIFT)) & MU_CR_NMI_MASK) +#define MU_CR_MUR_MASK (0x20U) +#define MU_CR_MUR_SHIFT (5U) +#define MU_CR_MUR(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_MUR_SHIFT)) & MU_CR_MUR_MASK) +#define MU_CR_BRSTH_MASK (0x80U) +#define MU_CR_BRSTH_SHIFT (7U) +#define MU_CR_BRSTH(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_BRSTH_SHIFT)) & MU_CR_BRSTH_MASK) +#define MU_CR_CLKE_MASK (0x100U) +#define MU_CR_CLKE_SHIFT (8U) +#define MU_CR_CLKE(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_CLKE_SHIFT)) & MU_CR_CLKE_MASK) +#define MU_CR_BBOOT_MASK (0x600U) +#define MU_CR_BBOOT_SHIFT (9U) +#define MU_CR_BBOOT(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_BBOOT_SHIFT)) & MU_CR_BBOOT_MASK) +#define MU_CR_GIRn_MASK (0xF0000U) +#define MU_CR_GIRn_SHIFT (16U) +#define MU_CR_GIRn(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_GIRn_SHIFT)) & MU_CR_GIRn_MASK) +#define MU_CR_TIEn_MASK (0xF00000U) +#define MU_CR_TIEn_SHIFT (20U) +#define MU_CR_TIEn(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_TIEn_SHIFT)) & MU_CR_TIEn_MASK) +#define MU_CR_RIEn_MASK (0xF000000U) +#define MU_CR_RIEn_SHIFT (24U) +#define MU_CR_RIEn(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_RIEn_SHIFT)) & MU_CR_RIEn_MASK) +#define MU_CR_GIEn_MASK (0xF0000000U) +#define MU_CR_GIEn_SHIFT (28U) +#define MU_CR_GIEn(x) (((uint32_t)(((uint32_t)(x)) << MU_CR_GIEn_SHIFT)) & MU_CR_GIEn_MASK) + + +/*! + * @} + */ /* end of group MU_Register_Masks */ + + +/* MU - Peripheral instance base addresses */ + +/** This define is used to access MU registers */ +#define DSC_MU_BASE_ADDR(X, Y) ((MU_Type*) (((uint32_t) DSC_BASE_ADDR(X)) \ + + 0xC000U + (0x80U * (Y)))) + +/** Peripheral MU0 base pointer */ +#define MU0 ((MU_Type *)MU0_BASE) +/** Peripheral MU1 base pointer */ +#define MU1 ((MU_Type *)MU1_BASE) +/** Peripheral MU2 base pointer */ +#define MU2 ((MU_Type *)MU2_BASE) +/** Peripheral MU3 base pointer */ +#define MU3 ((MU_Type *)MU3_BASE) +/** Peripheral MU4 base pointer */ +#define MU4 ((MU_Type *)MU4_BASE) +/** Peripheral MU5 base pointer */ +#define MU5 ((MU_Type *)MU5_BASE) +/** Peripheral MU6 base pointer */ +#define MU6 ((MU_Type *)MU6_BASE) +/** Peripheral MU7 base pointer */ +#define MU7 ((MU_Type *)MU7_BASE) +/** Peripheral MU8 base pointer */ +#define MU8 ((MU_Type *)MU8_BASE) +/** Peripheral MU9 base pointer */ +#define MU9 ((MU_Type *)MU9_BASE) +/** Peripheral MU10 base pointer */ +#define MU10 ((MU_Type *)MU10_BASE) +/** Peripheral MU11 base pointer */ +#define MU11 ((MU_Type *)MU11_BASE) +/** Peripheral MU12 base pointer */ +#define MU12 ((MU_Type *)MU12_BASE) +/** Peripheral MU13 base pointer */ +#define MU13 ((MU_Type *)MU13_BASE) +/** Peripheral MU14 base pointer */ +#define MU14 ((MU_Type *)MU14_BASE) +/** Peripheral MU15 base pointer */ +#define MU15 ((MU_Type *)MU15_BASE) +/** Peripheral MU16 base pointer */ +#define MU16 ((MU_Type *)MU16_BASE) +/** Peripheral MU17 base pointer */ +#define MU17 ((MU_Type *)MU17_BASE) +/** Peripheral MU18 base pointer */ +#define MU18 ((MU_Type *)MU18_BASE) +/** Peripheral MU19 base pointer */ +#define MU19 ((MU_Type *)MU19_BASE) +/** Peripheral MU20 base pointer */ +#define MU20 ((MU_Type *)MU20_BASE) +/** Peripheral MU21 base pointer */ +#define MU21 ((MU_Type *)MU21_BASE) +/** Peripheral MU22 base pointer */ +#define MU22 ((MU_Type *)MU22_BASE) +/** Peripheral MU23 base pointer */ +#define MU23 ((MU_Type *)MU23_BASE) +/** Peripheral MU24 base pointer */ +#define MU24 ((MU_Type *)MU24_BASE) + +/** Array initializer of MU peripheral base addresses */ +#define MU_BASE_ADDRS { MU0_BASE, MU1_BASE, \ + MU2_BASE, MU3_BASE, \ + MU4_BASE, MU5_BASE, \ + MU6_BASE, MU7_BASE, \ + MU8_BASE, MU9_BASE, \ + MU10_BASE, MU11_BASE, \ + MU12_BASE, MU13_BASE, \ + MU14_BASE, MU15_BASE, \ + MU16_BASE, MU17_BASE, \ + MU18_BASE, MU19_BASE, \ + MU20_BASE, MU21_BASE, \ + MU22_BASE, MU23_BASE, \ + MU24_BASE } +/** Array initializer of MU peripheral base pointers */ +#define MU_BASE_PTRS { MU0, MU1, MU2, \ + MU3, MU4, MU5, \ + MU6, MU7, MU8, \ + MU9, MU10, MU11, \ + MU12, MU13, MU14, \ + MU15, MU16, MU17, \ + MU18, MU19, MU20, \ + MU21, MU22, MU23, \ + MU24 } +/** Interrupt vectors for the MU peripheral type */ +#define MU_IRQS { NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn, NotAvail_IRQn, \ + NotAvail_IRQn } + +/*! + * @} + */ /* end of group MU_Peripheral_Access_Layer */ + +#endif /* HW_MU_REGISTERS_H */ + diff --git a/platform/devices/MX8/MX8_pad.h b/platform/devices/MX8/MX8_pad.h new file mode 100755 index 0000000..7144dbc --- /dev/null +++ b/platform/devices/MX8/MX8_pad.h @@ -0,0 +1,303 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file MX8_pad.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for PAD + * + * CMSIS Peripheral Access Layer for PAD + */ + +#ifndef HW_PAD_REGISTERS_H +#define HW_PAD_REGISTERS_H + +#define IOMUXD_REG_BASE 0UL +#define REG32(X) ((uint32_t) (X)) + +#include "iomuxd.h" + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- PAD Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PAD_Peripheral_Access_Layer PAD Peripheral Access Layer + * @{ + */ + +/** PAD - Register Layout Typedef */ +typedef struct { + __IO uint32_t RW; + __IO uint32_t SET; + __IO uint32_t CLR; + __IO uint32_t TOG; + uint32_t reserved[12]; +} PAD_Type; + +/** PADRING - Register Layout Typedef */ +typedef struct { + struct { + struct { + PAD_Type PAD[16]; + __I uint32_t GLOBAL; + uint32_t reserved[767]; + } GROUP[32]; + } RING[4]; +} PADRING_Type; + +/* ---------------------------------------------------------------------------- + -- PAD Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PAD_Register_Masks PAD Register Masks + * @{ + */ + +/*! @name IOMUX - Register */ +#define IOMUX_REG_PAD_CTL_MASK (0x7FFFFU) +#define IOMUX_REG_PAD_CTL_SHIFT (0U) +#define IOMUX_REG_PAD_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_PAD_CTL_SHIFT)) & IOMUX_REG_PAD_CTL_MASK) +#define IOMUX_REG_WAKEUP_CTRL_MASK (0x380000U) +#define IOMUX_REG_WAKEUP_CTRL_SHIFT (19U) +#define IOMUX_REG_WAKEUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_WAKEUP_CTRL_SHIFT)) & IOMUX_REG_WAKEUP_CTRL_MASK) +#define IOMUX_REG_WAKEUP_MASK_MASK (0x400000U) +#define IOMUX_REG_WAKEUP_MASK_SHIFT (22U) +#define IOMUX_REG_WAKEUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_WAKEUP_MASK_SHIFT)) & IOMUX_REG_WAKEUP_MASK_MASK) +#define IOMUX_REG_LP_CONFIG_MASK (0x1800000U) +#define IOMUX_REG_LP_CONFIG_SHIFT (23U) +#define IOMUX_REG_LP_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_LP_CONFIG_SHIFT)) & IOMUX_REG_LP_CONFIG_MASK) +#define IOMUX_REG_SW_CONFIG_MASK (0x6000000U) +#define IOMUX_REG_SW_CONFIG_SHIFT (25U) +#define IOMUX_REG_SW_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_SW_CONFIG_SHIFT)) & IOMUX_REG_SW_CONFIG_MASK) +#define IOMUX_REG_MUX_MODE_MASK (0x38000000U) +#define IOMUX_REG_MUX_MODE_SHIFT (27U) +#define IOMUX_REG_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_MUX_MODE_SHIFT)) & IOMUX_REG_MUX_MODE_MASK) +#define IOMUX_REG_UPDATE_PAD_CTL_MASK (0x40000000U) +#define IOMUX_REG_UPDATE_PAD_CTL_SHIFT (30U) +#define IOMUX_REG_UPDATE_PAD_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_UPDATE_PAD_CTL_SHIFT)) & IOMUX_REG_UPDATE_PAD_CTL_MASK) +#define IOMUX_REG_UPDATE_MUX_MODE_MASK (0x80000000U) +#define IOMUX_REG_UPDATE_MUX_MODE_SHIFT (31U) +#define IOMUX_REG_UPDATE_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_UPDATE_MUX_MODE_SHIFT)) & IOMUX_REG_UPDATE_MUX_MODE_MASK) + +/*! @name 28FDSOI_IOMUX - Register */ +#define IOMUX_REG_28FDSOI_PDRV_MASK (0x7U) +#define IOMUX_REG_28FDSOI_PDRV_SHIFT (0U) +#define IOMUX_REG_28FDSOI_PDRV(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_PDRV_SHIFT)) & IOMUX_REG_28FDSOI_PDRV_MASK) +#define IOMUX_REG_28FDSOI_PULL_MASK (0x60U) +#define IOMUX_REG_28FDSOI_PULL_SHIFT (5U) +#define IOMUX_REG_28FDSOI_PULL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_PULL_SHIFT)) & IOMUX_REG_28FDSOI_PULL_MASK) +#define IOMUX_REG_28FDSOI_WAKEUP_CTRL_MASK (0x380000U) +#define IOMUX_REG_28FDSOI_WAKEUP_CTRL_SHIFT (19U) +#define IOMUX_REG_28FDSOI_WAKEUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_WAKEUP_CTRL_SHIFT)) & IOMUX_REG_28FDSOI_WAKEUP_CTRL_MASK) +#define IOMUX_REG_28FDSOI_WAKEUP_MASK_MASK (0x400000U) +#define IOMUX_REG_28FDSOI_WAKEUP_MASK_SHIFT (22U) +#define IOMUX_REG_28FDSOI_WAKEUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_WAKEUP_MASK_SHIFT)) & IOMUX_REG_28FDSOI_WAKEUP_MASK_MASK) +#define IOMUX_REG_28FDSOI_LP_CONFIG_MASK (0x1800000U) +#define IOMUX_REG_28FDSOI_LP_CONFIG_SHIFT (23U) +#define IOMUX_REG_28FDSOI_LP_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_LP_CONFIG_SHIFT)) & IOMUX_REG_28FDSOI_LP_CONFIG_MASK) +#define IOMUX_REG_28FDSOI_SW_CONFIG_MASK (0x6000000U) +#define IOMUX_REG_28FDSOI_SW_CONFIG_SHIFT (25U) +#define IOMUX_REG_28FDSOI_SW_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_SW_CONFIG_SHIFT)) & IOMUX_REG_28FDSOI_SW_CONFIG_MASK) +#define IOMUX_REG_28FDSOI_MUX_MODE_MASK (0x38000000U) +#define IOMUX_REG_28FDSOI_MUX_MODE_SHIFT (27U) +#define IOMUX_REG_28FDSOI_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_MUX_MODE_SHIFT)) & IOMUX_REG_28FDSOI_MUX_MODE_MASK) +#define IOMUX_REG_28FDSOI_UPDATE_PAD_CTL_MASK (0x40000000U) +#define IOMUX_REG_28FDSOI_UPDATE_PAD_CTL_SHIFT (30U) +#define IOMUX_REG_28FDSOI_UPDATE_PAD_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_UPDATE_PAD_CTL_SHIFT)) & IOMUX_REG_28FDSOI_UPDATE_PAD_CTL_MASK) +#define IOMUX_REG_28FDSOI_UPDATE_MUX_MODE_MASK (0x80000000U) +#define IOMUX_REG_28FDSOI_UPDATE_MUX_MODE_SHIFT (31U) +#define IOMUX_REG_28FDSOI_UPDATE_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_UPDATE_MUX_MODE_SHIFT)) & IOMUX_REG_28FDSOI_UPDATE_MUX_MODE_MASK) + +/*! @name 28FDSOI_HSIC - Register */ +#define IOMUX_REG_28FDSOI_HSIC_DSE_MASK (0x7U) +#define IOMUX_REG_28FDSOI_HSIC_DSE_SHIFT (0U) +#define IOMUX_REG_28FDSOI_HSIC_DSE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_DSE_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_DSE_MASK) +#define IOMUX_REG_28FDSOI_HSIC_HYS_MASK (0x8U) +#define IOMUX_REG_28FDSOI_HSIC_HYS_SHIFT (3U) +#define IOMUX_REG_28FDSOI_HSIC_HYS(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_HYS_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_HYS_MASK) +#define IOMUX_REG_28FDSOI_HSIC_PS_MASK (0x30U) +#define IOMUX_REG_28FDSOI_HSIC_PS_SHIFT (4U) +#define IOMUX_REG_28FDSOI_HSIC_PS(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_PS_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_PS_MASK) +#define IOMUX_REG_28FDSOI_HSIC_PKE_MASK (0x40U) +#define IOMUX_REG_28FDSOI_HSIC_PKE_SHIFT (6U) +#define IOMUX_REG_28FDSOI_HSIC_PKE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_PKE_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_PKE_MASK) +#define IOMUX_REG_28FDSOI_HSIC_PE_MASK (0x80U) +#define IOMUX_REG_28FDSOI_HSIC_PE_SHIFT (7U) +#define IOMUX_REG_28FDSOI_HSIC_PE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_PE_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_PE_MASK) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_CTRL_MASK (0x380000U) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_CTRL_SHIFT (19U) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_WAKEUP_CTRL_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_WAKEUP_CTRL_MASK) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_MASK_MASK (0x400000U) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_MASK_SHIFT (22U) +#define IOMUX_REG_28FDSOI_HSIC_WAKEUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_WAKEUP_MASK_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_WAKEUP_MASK_MASK) +#define IOMUX_REG_28FDSOI_HSIC_LP_CONFIG_MASK (0x1800000U) +#define IOMUX_REG_28FDSOI_HSIC_LP_CONFIG_SHIFT (23U) +#define IOMUX_REG_28FDSOI_HSIC_LP_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_LP_CONFIG_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_LP_CONFIG_MASK) +#define IOMUX_REG_28FDSOI_HSIC_SW_CONFIG_MASK (0x6000000U) +#define IOMUX_REG_28FDSOI_HSIC_SW_CONFIG_SHIFT (25U) +#define IOMUX_REG_28FDSOI_HSIC_SW_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_SW_CONFIG_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_SW_CONFIG_MASK) +#define IOMUX_REG_28FDSOI_HSIC_MUX_MODE_MASK (0x38000000U) +#define IOMUX_REG_28FDSOI_HSIC_MUX_MODE_SHIFT (27U) +#define IOMUX_REG_28FDSOI_HSIC_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_MUX_MODE_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_MUX_MODE_MASK) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_PAD_CTL_MASK (0x40000000U) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_PAD_CTL_SHIFT (30U) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_PAD_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_UPDATE_PAD_CTL_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_UPDATE_PAD_CTL_MASK) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_MUX_MODE_MASK (0x80000000U) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_MUX_MODE_SHIFT (31U) +#define IOMUX_REG_28FDSOI_HSIC_UPDATE_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_HSIC_UPDATE_MUX_MODE_SHIFT)) & IOMUX_REG_28FDSOI_HSIC_UPDATE_MUX_MODE_MASK) + +/*! @name 28FDSOI_COMP - Register */ +#define IOMUX_REG_28FDSOI_COMP_COMP_MASK (0x7U) +#define IOMUX_REG_28FDSOI_COMP_COMP_SHIFT (0U) +#define IOMUX_REG_28FDSOI_COMP_COMP(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_COMP_SHIFT)) & IOMUX_REG_28FDSOI_COMP_COMP_MASK) +#define IOMUX_REG_28FDSOI_COMP_FASTFRZ_EN_MASK (0x8U) +#define IOMUX_REG_28FDSOI_COMP_FASTFRZ_EN_SHIFT (3U) +#define IOMUX_REG_28FDSOI_COMP_FASTFRZ_EN(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_FASTFRZ_EN_SHIFT)) & IOMUX_REG_28FDSOI_COMP_FASTFRZ_EN_MASK) +#define IOMUX_REG_28FDSOI_COMP_PSW_OVR_MASK (0x10U) +#define IOMUX_REG_28FDSOI_COMP_PSW_OVR_SHIFT (4U) +#define IOMUX_REG_28FDSOI_COMP_PSW_OVR(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_PSW_OVR_SHIFT)) & IOMUX_REG_28FDSOI_COMP_PSW_OVR_MASK) +#define IOMUX_REG_28FDSOI_COMP_RASRCP_MASK (0x1E0U) +#define IOMUX_REG_28FDSOI_COMP_RASRCP_SHIFT (5U) +#define IOMUX_REG_28FDSOI_COMP_RASRCP(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_RASRCP_SHIFT)) & IOMUX_REG_28FDSOI_COMP_RASRCP_MASK) +#define IOMUX_REG_28FDSOI_COMP_RASRCN_MASK (0x1E00U) +#define IOMUX_REG_28FDSOI_COMP_RASRCN_SHIFT (9U) +#define IOMUX_REG_28FDSOI_COMP_RASRCN(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_RASRCN_SHIFT)) & IOMUX_REG_28FDSOI_COMP_RASRCN_MASK) +#define IOMUX_REG_28FDSOI_COMP_SELECT_NASRC_MASK (0x2000U) +#define IOMUX_REG_28FDSOI_COMP_SELECT_NASRC_SHIFT (13U) +#define IOMUX_REG_28FDSOI_COMP_SELECT_NASRC(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_SELECT_NASRC_SHIFT)) & IOMUX_REG_28FDSOI_COMP_SELECT_NASRC_MASK) +#define IOMUX_REG_28FDSOI_COMP_COMPOK_MASK (0x4000U) +#define IOMUX_REG_28FDSOI_COMP_COMPOK_SHIFT (14U) +#define IOMUX_REG_28FDSOI_COMP_COMPOK(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_COMPOK_SHIFT)) & IOMUX_REG_28FDSOI_COMP_COMPOK_MASK) +#define IOMUX_REG_28FDSOI_COMP_READ_NASRC_MASK (0x78000U) +#define IOMUX_REG_28FDSOI_COMP_READ_NASRC_SHIFT (15U) +#define IOMUX_REG_28FDSOI_COMP_READ_NASRC(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_READ_NASRC_SHIFT)) & IOMUX_REG_28FDSOI_COMP_READ_NASRC_MASK) +#define IOMUX_REG_28FDSOI_COMP_SLEEP_MASK (0x1800000U) +#define IOMUX_REG_28FDSOI_COMP_SLEEP_SHIFT (23U) +#define IOMUX_REG_28FDSOI_COMP_SLEEP(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_SLEEP_SHIFT)) & IOMUX_REG_28FDSOI_COMP_SLEEP_MASK) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_PAD_CTL_MASK (0x40000000U) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_PAD_CTL_SHIFT (30U) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_PAD_CTL(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_UPDATE_PAD_CTL_SHIFT)) & IOMUX_REG_28FDSOI_COMP_UPDATE_PAD_CTL_MASK) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_MUX_MODE_MASK (0x80000000U) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_MUX_MODE_SHIFT (31U) +#define IOMUX_REG_28FDSOI_COMP_UPDATE_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUX_REG_28FDSOI_COMP_UPDATE_MUX_MODE_SHIFT)) & IOMUX_REG_28FDSOI_COMP_UPDATE_MUX_MODE_MASK) + +/*! + * @} + */ /* end of group PAD_Register_Masks */ + + +/*! + * @name Constants and macros for entire PAD_IOMUX register + */ +/** @{ */ +#define HW_PAD_IOMUX_ADDR(x, y) ((uintptr_t)(x) + (y)) +#define HW_PAD_IOMUX(x, y) (*(__IO PAD_Type *) HW_PAD_IOMUX_ADDR(x, y)) +#define HW_PAD_IOMUX_RD(x, y) (HW_PAD_IOMUX(x, y).RW) +#define HW_PAD_IOMUX_WR(x, y) (HW_PAD_IOMUX(x, y).RW) +/** @} */ + +/*! + * @} + */ /* end of group XRDC2_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* XRDC2_H */ + diff --git a/platform/devices/MX8/MX8_rep2.h b/platform/devices/MX8/MX8_rep2.h new file mode 100755 index 0000000..68ef5ae --- /dev/null +++ b/platform/devices/MX8/MX8_rep2.h @@ -0,0 +1,245 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file rep2.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for rep2 + * + * CMSIS Peripheral Access Layer for rep2 + */ + +#ifndef REP2_H +#define REP2_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- REP2 Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup REP2_Peripheral_Access_Layer REP2 Peripheral Access Layer + * @{ + */ + +/** REP2 - Register Layout Typedef */ +typedef struct { + __I uint32_t REPSTAT; /**< REP status Register, offset: 0x0 */ + __IO uint32_t IR; /**< Instruction Register, offset: 0x4 */ + uint8_t RESERVED_0[20]; + __IO uint32_t CTRL; /**< Control Register, offset: 0x1C */ + __I uint32_t ECCSTAT; /**< ECC status Register, offset: 0x20 */ + uint8_t RESERVED_1[12]; + __IO uint32_t PPSEL; /**< Power plane select Register, offset: 0x30 */ + uint8_t RESERVED_2[204]; + __IO uint32_t SSR[64]; /**< Solution Stage Register - word 0, offset: 0x100 */ +} REP2_Type; + +/* ---------------------------------------------------------------------------- + -- REP2 Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup REP2_Register_Masks REP2 Register Masks + * @{ + */ + +/*! @name REPSTAT - REP status Register */ +#define REP2_REPSTAT_IDL_MASK (0x1U) +#define REP2_REPSTAT_IDL_SHIFT (0U) +#define REP2_REPSTAT_IDL(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_IDL_SHIFT)) & REP2_REPSTAT_IDL_MASK) +#define REP2_REPSTAT_CIE_MASK (0x2U) +#define REP2_REPSTAT_CIE_SHIFT (1U) +#define REP2_REPSTAT_CIE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_CIE_SHIFT)) & REP2_REPSTAT_CIE_MASK) +#define REP2_REPSTAT_INE_MASK (0x4U) +#define REP2_REPSTAT_INE_SHIFT (2U) +#define REP2_REPSTAT_INE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_INE_SHIFT)) & REP2_REPSTAT_INE_MASK) +#define REP2_REPSTAT_IAE_MASK (0x8U) +#define REP2_REPSTAT_IAE_SHIFT (3U) +#define REP2_REPSTAT_IAE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_IAE_SHIFT)) & REP2_REPSTAT_IAE_MASK) +#define REP2_REPSTAT_FXE_MASK (0x10U) +#define REP2_REPSTAT_FXE_SHIFT (4U) +#define REP2_REPSTAT_FXE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_FXE_SHIFT)) & REP2_REPSTAT_FXE_MASK) +#define REP2_REPSTAT_EME_MASK (0x20U) +#define REP2_REPSTAT_EME_SHIFT (5U) +#define REP2_REPSTAT_EME(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_EME_SHIFT)) & REP2_REPSTAT_EME_MASK) +#define REP2_REPSTAT_BXE_MASK (0x40U) +#define REP2_REPSTAT_BXE_SHIFT (6U) +#define REP2_REPSTAT_BXE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_BXE_SHIFT)) & REP2_REPSTAT_BXE_MASK) +#define REP2_REPSTAT_COFE_MASK (0x80U) +#define REP2_REPSTAT_COFE_SHIFT (7U) +#define REP2_REPSTAT_COFE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_COFE_SHIFT)) & REP2_REPSTAT_COFE_MASK) +#define REP2_REPSTAT_COWE_MASK (0x100U) +#define REP2_REPSTAT_COWE_SHIFT (8U) +#define REP2_REPSTAT_COWE(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_COWE_SHIFT)) & REP2_REPSTAT_COWE_MASK) +#define REP2_REPSTAT_ISA_MASK (0x400U) +#define REP2_REPSTAT_ISA_SHIFT (10U) +#define REP2_REPSTAT_ISA(x) (((uint32_t)(((uint32_t)(x)) << REP2_REPSTAT_ISA_SHIFT)) & REP2_REPSTAT_ISA_MASK) + +/*! @name IR - Instruction Register */ +#define REP2_IR_DREG_MASK (0xFFU) +#define REP2_IR_DREG_SHIFT (0U) +#define REP2_IR_DREG(x) (((uint32_t)(((uint32_t)(x)) << REP2_IR_DREG_SHIFT)) & REP2_IR_DREG_MASK) +#define REP2_IR_OPCODE_MASK (0xF00U) +#define REP2_IR_OPCODE_SHIFT (8U) +#define REP2_IR_OPCODE(x) (((uint32_t)(((uint32_t)(x)) << REP2_IR_OPCODE_SHIFT)) & REP2_IR_OPCODE_MASK) + +/*! @name CTRL - Control Register */ +#define REP2_CTRL_ECCSTATRST_MASK (0x1U) +#define REP2_CTRL_ECCSTATRST_SHIFT (0U) +#define REP2_CTRL_ECCSTATRST(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_ECCSTATRST_SHIFT)) & REP2_CTRL_ECCSTATRST_MASK) +#define REP2_CTRL_ECCGENDIS_MASK (0x4U) +#define REP2_CTRL_ECCGENDIS_SHIFT (2U) +#define REP2_CTRL_ECCGENDIS(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_ECCGENDIS_SHIFT)) & REP2_CTRL_ECCGENDIS_MASK) +#define REP2_CTRL_ECCCHKDIS_MASK (0x8U) +#define REP2_CTRL_ECCCHKDIS_SHIFT (3U) +#define REP2_CTRL_ECCCHKDIS(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_ECCCHKDIS_SHIFT)) & REP2_CTRL_ECCCHKDIS_MASK) +#define REP2_CTRL_BISRWDT_MASK (0x30U) +#define REP2_CTRL_BISRWDT_SHIFT (4U) +#define REP2_CTRL_BISRWDT(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_BISRWDT_SHIFT)) & REP2_CTRL_BISRWDT_MASK) +#define REP2_CTRL_BISRUPDATE_MASK (0x40U) +#define REP2_CTRL_BISRUPDATE_SHIFT (6U) +#define REP2_CTRL_BISRUPDATE(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_BISRUPDATE_SHIFT)) & REP2_CTRL_BISRUPDATE_MASK) +#define REP2_CTRL_LOADSSR_MASK (0x80U) +#define REP2_CTRL_LOADSSR_SHIFT (7U) +#define REP2_CTRL_LOADSSR(x) (((uint32_t)(((uint32_t)(x)) << REP2_CTRL_LOADSSR_SHIFT)) & REP2_CTRL_LOADSSR_MASK) + +/*! @name ECCSTAT - Control Register */ +#define REP2_ECCSTAT_ESE_MASK (0x1U) +#define REP2_ECCSTAT_ESE_SHIFT (0U) +#define REP2_ECCSTAT_ESE(x) (((uint32_t)(((uint32_t)(x)) << REP2_ECCSTAT_ESE_SHIFT)) & REP2_ECCSTAT_ESE_MASK) +#define REP2_ECCSTAT_EME_MASK (0x2U) +#define REP2_ECCSTAT_EME_SHIFT (1U) +#define REP2_ECCSTAT_EME(x) (((uint32_t)(((uint32_t)(x)) << REP2_ECCSTAT_EME_SHIFT)) & REP2_ECCSTAT_EME_MASK) +#define REP2_ECCSTAT_SINGLEERR_MASK (0x3FCU) +#define REP2_ECCSTAT_SINGLEERR_SHIFT (2U) +#define REP2_ECCSTAT_SINGLEERR(x) (((uint32_t)(((uint32_t)(x)) << REP2_ECCSTAT_SINGLEERR_SHIFT)) & REP2_ECCSTAT_SINGLEERR_MASK) +#define REP2_ECCSTAT_MULTIERR_MASK (0x3F0000U) +#define REP2_ECCSTAT_MULTIERR_SHIFT (16U) +#define REP2_ECCSTAT_MULTIERR(x) (((uint32_t)(((uint32_t)(x)) << REP2_ECCSTAT_MULTIERR_SHIFT)) & REP2_ECCSTAT_MULTIERR_MASK) + +/*! @name SSR - Solution Stage Register */ +#define REP2_SSR_DATA_MASK (0x3FFU) +#define REP2_SSR_DATA_SHIFT (0U) +#define REP2_SSR_DATA(x) (((uint32_t)(((uint32_t)(x)) << REP2_SSR_DATA_SHIFT)) & REP2_SSR_DATA_MASK) +#define REP2_SSR_ADDR_MASK (0xFFC00U) +#define REP2_SSR_ADDR_SHIFT (10U) +#define REP2_SSR_ADDR(x) (((uint32_t)(((uint32_t)(x)) << REP2_SSR_ADDR_SHIFT)) & REP2_SSR_ADDR_MASK) +#define REP2_SSR_ECC_MASK (0x7F00000U) +#define REP2_SSR_ECC_SHIFT (20U) +#define REP2_SSR_ECC(x) (((uint32_t)(((uint32_t)(x)) << REP2_SSR_ECC_SHIFT)) & REP2_SSR_ECC_MASK) + +/*! + * @} + */ /* end of group REP2_Register_Masks */ + +/*! @name REP Instruction set */ +#define OPCODE_PROG_STORAGE (0x1) +#define OPCODE_READ_STORAGE (0x2) +#define OPCODE_GET_DATA (0x3) +#define OPCODE_LOAD_DATA (0x4) +#define OPCODE_CLEAR (0x5) +#define OPCODE_COMPARE_DATA (0x6) + +/*! @name REP Data Registers */ +#define DREG_ECID (0x1) +#define DREG_SSR (0x2) + +/* REP2 - Peripheral instance base addresses */ +/** Peripheral REP2 base pointer */ +#define REP2 ((REP2_Type *)REP2_BASE) +/** Array initializer of REP2 peripheral base addresses */ +#define REP2_BASE_ADDRS { REP2_BASE } +/** Array initializer of REP2 peripheral base pointers */ +#define REP2_BASE_PTRS { REP2 } + +/*! + * @} + */ /* end of group REP2_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +#endif /* REP2_H */ + diff --git a/platform/devices/MX8/MX8_smmu.h b/platform/devices/MX8/MX8_smmu.h new file mode 100755 index 0000000..cf1cc44 --- /dev/null +++ b/platform/devices/MX8/MX8_smmu.h @@ -0,0 +1,906 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_SMMU_REGISTERS_H +#define HW_SMMU_REGISTERS_H + +#include "stdint.h" + +#define SMMU_NUM_SMRG 32U +#define SMMU_NUM_CB 32U +#define SMMU_PAGESHIFT 12U + +#define SMMU_PAGESIZE (1U << SMMU_PAGESHIFT) +#define SMMU_PAGEMASK (SMMU_PAGESIZE - 1U) + +#define SMMU_GLOBAL_SIZE (SMMU_NUM_CB * PAGESIZE) +#define SMMU_CB_SIZE SMMU_GLOBAL_SIZE + +#define SMMU_CB_BASE(x) ((uintptr_t)(x) + SMMU_GLOBAL_SIZE) +#define SMMU_CBn_BASE(x, n) (SMMU_CB_BASE(x) + ((n) * PAGESIZE)) + +/******************************************************************************* + * HW_SMMU_SCR0 - Configuration Register 0 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_SCR0 - Configuration Register 0 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t CLIENTPD : 1; + uint32_t GFRE : 1; + uint32_t GFIE : 1; + uint32_t EXIDENABLE : 1; + uint32_t GCFGFRE : 1; + uint32_t GCFGFIE : 1; + uint32_t TRANSIENTCFG : 2; + uint32_t STALLD : 1; + uint32_t GSE : 1; + uint32_t USFCFG : 1; + uint32_t VMIDPNE : 1; + uint32_t PTM : 1; + uint32_t FB : 1; + uint32_t BSU : 2; + uint32_t MEMATTR : 4; + uint32_t MTCFG : 1; + uint32_t SMCFCFG : 1; + uint32_t SHCFG : 2; + uint32_t RACFG : 2; + uint32_t WACFG : 2; + uint32_t NSCFG : 2; + uint32_t RESERVED0 : 2; + } B; +} hw_smmu_scr0_t; + +/*! + * @name Constants and macros for entire SMMU_SCR0 register + */ +/** @{ */ +#define HW_SMMU_SCR0_ADDR(x) ((uintptr_t)(x) + 0x0U) +#define HW_SMMU_SCR0(x) (*(__IO hw_smmu_scr0_t *) HW_SMMU_SCR0_ADDR(x)) + +#define HW_SMMU_NSCR0_ADDR(x) ((uintptr_t)(x) + 0x400U) +#define HW_SMMU_NSCR0(x) (*(__IO hw_smmu_scr0_t *) HW_SMMU_NSCR0_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SCR1 - Configuration Register 1 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_SCR1 - Configuration Register 1 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t NSNUMCBO : 8; + uint32_t NSNUMSMRGO : 8; + uint32_t NSNUMIRPTO : 8; + uint32_t GASRAE : 1; + uint32_t GEFRO : 1; + uint32_t SIF : 1; + uint32_t SPMEN : 1; + uint32_t NSCAFRO : 1; + uint32_t RESERVED0 : 3; + } B; +} hw_smmu_scr1_t; + +/*! + * @name Constants and macros for entire SMMU_SCR1 register + */ +/** @{ */ +#define HW_SMMU_SCR1_ADDR(x) ((uintptr_t)(x) + 0x4U) +#define HW_SMMU_SCR1(x) (*(__IO hw_smmu_scr1_t *) HW_SMMU_SCR1_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SCR2 - Configuration Register 2 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_SCR2 - Configuration Register 2 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t BPVMID : 8; + uint32_t RESERVED0 : 24; + } B; +} hw_smmu_scr2_t; + +/*! + * @name Constants and macros for entire SMMU_SCR2 register + */ +/** @{ */ +#define HW_SMMU_SCR2_ADDR(x) ((uintptr_t)(x) + 0x8U) +#define HW_SMMU_SCR2(x) (*(__IO hw_smmu_scr2_t *) HW_SMMU_SCR2_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SACR - Auxiliary Configuration Register + ******************************************************************************/ + +/*! + * @brief HW_SMMU_SACR - Auxiliary Configuration Register (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t RESERVED0 : 2; + uint32_t S1WC2EN : 1; + uint32_t S2WC2EN : 1; + uint32_t IPA2PA_CEN : 1; + uint32_t RESERVED1 : 3; + uint32_t SMTNMB_TLBEN : 1; + uint32_t MMUDISB_TLBEN : 1; + uint32_t S2CRB_TLBEN : 1; + uint32_t RESERVED2 : 5; + uint32_t PAGESIZE : 1; + uint32_t RESERVED3 : 7; + uint32_t DP4K_TCUDISB : 1; + uint32_t DP4K_TBUDISB : 1; + uint32_t CACHE_LOCK : 1; + uint32_t RESERVED4 : 5; + } B; +} hw_smmu_sacr_t; + +/*! + * @name Constants and macros for entire SMMU_ACR register + */ +/** @{ */ +#define HW_SMMU_SACR_ADDR(x) ((uintptr_t)(x) + 0x10U) +#define HW_SMMU_SACR(x) (*(__IO hw_smmu_sacr_t *) HW_SMMU_SACR_ADDR(x)) + +#define HW_SMMU_NSACR_ADDR(x) ((uintptr_t)(x) + 0x410U) +#define HW_SMMU_NSACR(x) (*(__IO hw_smmu_sacr_t *) HW_SMMU_NSACR_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_IDR0 - Identification Register 0 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_IDR0 - Identification Register 0 (RO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t NUMSMRG : 8; + uint32_t EXIDS : 1; + uint32_t NUMSIDB : 4; + uint32_t BTM : 1; + uint32_t CTTW : 1; + uint32_t RESERVED0 : 1; + uint32_t NUMIRPT : 8; + uint32_t PTFS : 2; + uint32_t ATOSNS : 1; + uint32_t SMS : 1; + uint32_t NTS : 1; + uint32_t S2TS : 1; + uint32_t S1TS : 1; + uint32_t SES : 1; + } B; +} hw_smmu_idr0_t; + +/*! + * @name Constants and macros for entire SMMU_IDR0 register + */ +/** @{ */ +#define HW_SMMU_IDR0_ADDR(x) ((uintptr_t)(x) + 0x20U) +#define HW_SMMU_IDR0(x) (*(__I hw_smmu_idr0_t *) HW_SMMU_IDR0_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_IDR1 - Identification Register 1 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_IDR1 - Identification Register 1 (RO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t NUMCB : 8; + uint32_t NUMSSDNDXB : 4; + uint32_t SSDTP : 2; + uint32_t RESERVED0 : 1; + uint32_t SMCD : 1; + uint32_t NUMS2CB : 8; + uint32_t RESERVED1 : 4; + uint32_t NUMPAGENDXB : 3; + uint32_t PAGESIZE : 1; + } B; +} hw_smmu_idr1_t; + +/*! + * @name Constants and macros for entire SMMU_IDR1 register + */ +/** @{ */ +#define HW_SMMU_IDR1_ADDR(x) ((uintptr_t)(x) + 0x24U) +#define HW_SMMU_IDR1(x) (*(__I hw_smmu_idr1_t *) HW_SMMU_IDR1_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_IDR2 - Identification Register 2 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_IDR2 - Identification Register 2 (RO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t IAS : 4; + uint32_t OAS : 4; + uint32_t UBS : 4; + uint32_t PTFSV8 : 3; + uint32_t RESERVED0 : 17; + } B; +} hw_smmu_idr2_t; + +/*! + * @name Constants and macros for entire SMMU_IDR2 register + */ +/** @{ */ +#define HW_SMMU_IDR2_ADDR(x) ((uintptr_t)(x) + 0x28U) +#define HW_SMMU_IDR2(x) (*(__I hw_smmu_idr2_t *) HW_SMMU_IDR2_ADDR(x)) +/** @} */ + + +/******************************************************************************* + * HW_SMMU_IDR3-6 - Identification Register 3-6 + ******************************************************************************/ + +/*! + * @name Constants and macros for SMMU_IDR3-6 registers + */ +/** @{ */ +#define HW_SMMU_IDR3_ADDR(x) ((uintptr_t)(x) + 0x2CU) +#define HW_SMMU_IDR4_ADDR(x) ((uintptr_t)(x) + 0x30U) +#define HW_SMMU_IDR5_ADDR(x) ((uintptr_t)(x) + 0x34U) +#define HW_SMMU_IDR6_ADDR(x) ((uintptr_t)(x) + 0x38U) +/** @} */ + +/******************************************************************************* + * HW_SMMU_IDR7 - Identification Register 7 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_IDR7 - Identification Register 7 (RO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t MINOR : 4; + uint32_t MAJOR : 4; + uint32_t RESERVED0 : 24; + } B; +} hw_smmu_idr7_t; + +/*! + * @name Constants and macros for entire SMMU_IDR7 register + */ +/** @{ */ +#define HW_SMMU_IDR7_ADDR(x) ((uintptr_t)(x) + 0x3CU) +#define HW_SMMU_IDR7(x) (*(__I hw_smmu_idr7_t *) HW_SMMU_IDR7_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SGFSR - Global Fault Status Register + ******************************************************************************/ + +/*! + * @brief SGFSR - Global Fault Status Register (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t ICF : 1; + uint32_t USF : 1; + uint32_t SMCF : 1; + uint32_t UCBF : 1; + uint32_t UCIF : 1; + uint32_t CAF : 1; + uint32_t EF : 1; + uint32_t PF : 1; + uint32_t UUT : 1; + uint32_t RESERVED0 : 22; + uint32_t MULTI : 1; + } B; +} hw_smmu_sgfsr_t; + +/*! + * @name Constants and macros for entire SMMU_SGFSR register + */ +/** @{ */ +#define HW_SMMU_SGFSR_ADDR(x) ((uintptr_t)(x) + 0x48U) +#define HW_SMMU_SGFSR(x) (*(__IO hw_smmu_sgfsr_t *) HW_SMMU_SGFSR_ADDR(x)) + +#define HW_SMMU_NSGFSR_ADDR(x) ((uintptr_t)(x) + 0x448U) +#define HW_SMMU_NSGFSR(x) (*(__IO hw_smmu_sgfsr_t *) HW_SMMU_NSGFSR_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SGFSYNR0 - Global Fault Syndrome Register 0 + ******************************************************************************/ + +/*! + * @brief SGFSYNR0 - Global Fault Syndrome Register 0 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t NESTED : 1; + uint32_t WNR : 1; + uint32_t PNU : 1; + uint32_t IND : 1; + uint32_t NSSTATE : 1; + uint32_t NSATTR : 1; + uint32_t ATS : 1; + uint32_t RESERVED0 : 25; + } B; +} hw_smmu_sgfsynr0_t; + +/*! + * @name Constants and macros for entire SMMU_SGFSYNR0 register + */ +/** @{ */ +#define HW_SMMU_SGFSYNR0_ADDR(x) ((uintptr_t)(x) + 0x50U) +#define HW_SMMU_SGFSYNR0(x) (*(__IO hw_smmu_sgfsynr0_t *) HW_SMMU_SGFSYNR0_ADDR(x)) + +#define HW_SMMU_NSGFSYNR0_ADDR(x) ((uintptr_t)(x) + 0x450U) +#define HW_SMMU_NSGFSYNR0(x) (*(__IO hw_smmu_sgfsynr0_t *) HW_SMMU_NSGFSYNR0_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SGFSYNR1 - Global Fault Syndrome Register 1 + ******************************************************************************/ + +/*! + * @brief SGFSYNR1 - Global Fault Syndrome Register 1 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t SID : 16; + uint32_t SSD : 16; + } B; +} hw_smmu_sgfsynr1_t; + +/*! + * @name Constants and macros for entire SMMU_SGFSYNR1 register + */ +/** @{ */ +#define HW_SMMU_SGFSYNR1_ADDR(x) ((uintptr_t)(x) + 0x54U) +#define HW_SMMU_SGFSYNR1(x) (*(__IO hw_smmu_sgfsynr1_t *) HW_SMMU_SGFSYNR1_ADDR(x)) + +#define HW_SMMU_NSGFSYNR1_ADDR(x) ((uintptr_t)(x) + 0x454U) +#define HW_SMMU_NSGFSYNR1(x) (*(__IO hw_smmu_sgfsynr1_t *) HW_SMMU_NSGFSYNR1_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_SGFSYNR2 - Global Fault Syndrome Register 2 + ******************************************************************************/ + +/*! + * @name Constants and macros for entire SMMU_SGFSYNR2 register + */ +/** @{ */ +#define HW_SMMU_SGFSYNR2_ADDR(x) ((uintptr_t)(x) + 0x58U) +#define HW_SMMU_SGFSYNR2(x) (*(__IO uint32_t *) HW_SMMU_SGFSYNR2_ADDR(x)) + +#define HW_SMMU_NSGFSYNR2_ADDR(x) ((uintptr_t)(x) + 0x458U) +#define HW_SMMU_NSGFSYNR2(x) (*(__IO uint32_t *) HW_SMMU_NSGFSYNR2_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_STLBIALL - TLB Invalidate All + ******************************************************************************/ + +/*! + * @name Constants and macros for entire SMMU_STLBIALL register + */ +/** @{ */ +#define HW_SMMU_STLBIALL_ADDR(x) ((uintptr_t)(x) + 0x60U) +#define HW_SMMU_STLBIALL(x) (*(__O uint32_t *) HW_SMMU_STLBIALL_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_TLBIVMID - TLB Invalidate by VMID + ******************************************************************************/ + +/*! + * @brief TLBIVMID - TLB Invalidate by VMID (WO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t VMID : 8; + uint32_t RESERVED0 : 24; + } B; +} hw_smmu_tlbivmid_t; + +/*! + * @name Constants and macros for entire SMMU_TLBIVMID register + */ +/** @{ */ +#define HW_SMMU_TLBIVMID_ADDR(x) ((uintptr_t)(x) + 0x64U) +#define HW_SMMU_TLBIVMID(x) (*(__O hw_smmu_sgfsynr1_t *) HW_SMMU_TLBIVMID_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_TLBIALLNSNH - TLB Invalidate All Non-Secure Non-Hyp + ******************************************************************************/ + +/*! + * @name Constants and macros for entire SMMU_TLBIALLNSNH register + */ +/** @{ */ +#define HW_SMMU_TLBIALLNSNH_ADDR(x) ((uintptr_t)(x) + 0x68U) +#define HW_SMMU_TLBIALLNSNH(x) (*(__O uint32_t *) HW_SMMU_TLBIALLNSNH_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_TLBIALLNSNH - TLB Invalidate All Hyp + ******************************************************************************/ + +/*! + * @name Constants and macros for entire SMMU_TLBIALLH register + */ +/** @{ */ +#define HW_SMMU_TLBIALLH_ADDR(x) ((uintptr_t)(x) + 0x6CU) +#define HW_SMMU_TLBIALLH(x) (*(__O uint32_t *) HW_SMMU_TLBIALLH_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_STLBGSYNC - Global Synchronize TLB Invalidate + ******************************************************************************/ + +/*! + * @name Constants and macros for entire SMMU_STLBGSYNC register + */ +/** @{ */ +#define HW_SMMU_STLBGSYNC_ADDR(x) ((uintptr_t)(x) + 0x70U) +#define HW_SMMU_STLBGSYNC(x) (*(__O uint32_t *) HW_SMMU_STLBGSYNC_ADDR(x)) + +#define HW_SMMU_NSTLBGSYNC_ADDR(x) ((uintptr_t)(x) + 0x470U) +#define HW_SMMU_NSTLBGSYNC(x) (*(__O uint32_t *) HW_SMMU_NSTLBGSYNC_ADDR(x)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_STLBGSTATUS - Global TLB Status register + ******************************************************************************/ + +/*! + * @brief STLBGSTATUS - Global TLB Status register (RO) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t GSACTIVE : 1; + uint32_t RESERVED0 : 31; + } B; +} hw_smmu_stlbgstatus; + +/*! + * @name Constants and macros for entire STLBGSTATUS register + */ +/** @{ */ +#define HW_SMMU_STLBGSTATUS_ADDR(x) ((uintptr_t)(x) + 0x74U) +#define HW_SMMU_STLBGSTATUS(x) (*(__I _hw_smmu_stlbgstatus *) HW_SMMU_STLBGSTATUS_ADDR(x)) + +#define HW_SMMU_NSTLBGSTATUS_ADDR(x) ((uintptr_t)(x) + 0x474U) +#define HW_SMMU_NSTLBGSTATUS(x) (*(__I _hw_smmu_stlbgstatus *) HW_SMMU_NSTLBGSTATUS_ADDR(x)) +/** @} */ + + +/******************************************************************************* + * HW_SMMU_SMR - Stream Match Register + ******************************************************************************/ + +/*! + * @brief HW_SMMU_SMR - Stream Match Register (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t ID : 15; + uint32_t RESERVED0 : 1; + uint32_t MASK : 15; + uint32_t VALID : 1; + } B1; + struct + { + uint32_t EXID : 16; + uint32_t EXMASK : 16; + } B2; +} hw_smmu_smr_t; + +/*! + * @name Constants and macros for entire SMMU_SMR register + */ +/** @{ */ +#define HW_SMMU_SMR_ADDR(x, n) ((uintptr_t)(x) + 0x800U + (0x4U * (n))) +#define HW_SMMU_SMR(x, n) (*(__IO hw_smmu_smr_t *) HW_SMMU_SMR_ADDR(x, n)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_S2CR - Stream-to-Context Register + ******************************************************************************/ + +/*! + * @brief HW_SMMU_S2CR - Stream-to-Context Register (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t CBNDX : 8; + uint32_t SHCFG : 2; + uint32_t EXIDVALID : 1; + uint32_t MTCFG : 1; + uint32_t MEMATTR : 4; + uint32_t TYPE : 2; + uint32_t NSCFG : 2; + uint32_t RACFG : 2; + uint32_t WACFG : 2; + uint32_t PRIVCFG : 2; + uint32_t INSTCFG : 2; + uint32_t TRANSIENTCFG : 2; + uint32_t RESERVED0 : 2; + } B0; + struct + { + uint32_t VMID : 8; + uint32_t SHCFG : 2; + uint32_t EXIDVALID : 1; + uint32_t MTCFG : 1; + uint32_t MEMATTR : 4; + uint32_t TYPE : 2; + uint32_t NSCFG : 2; + uint32_t RACFG : 2; + uint32_t WACFG : 2; + uint32_t BSU : 2; + uint32_t FB : 1; + uint32_t RESERVED0 : 1; + uint32_t TRANSIENTCFG : 2; + uint32_t RESERVED1 : 2; + } B1; + struct + { + uint32_t RESERVED0 : 16; + uint32_t TYPE : 2; + uint32_t RESERVED1 : 14; + } B2; +} hw_smmu_s2cr_t; + +/*! + * @name Constants and macros for entire SMMU_S2CR register + */ +/** @{ */ +#define HW_SMMU_S2CR_ADDR(x, n) ((uintptr_t)(x) + 0xC00U + (0x4U * (n))) +#define HW_SMMU_S2CR(x, n) (*(__IO hw_smmu_s2cr_t *) HW_SMMU_S2CR_ADDR(x, n)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_CBAR - Stream-to-Context Register + ******************************************************************************/ + +/*! + * @brief HW_SMMU_CBAR - Context Bank Attribute Register (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t VMID : 8; + uint32_t RESERVED0 : 8; + uint32_t TYPE : 2; + uint32_t SBZ : 2; + uint32_t RESERVED1 : 4; + uint32_t IRPTNDX : 8; + } B0; + struct + { + uint32_t VMID : 8; + uint32_t BPSHCFG : 2; + uint32_t HYPC : 1; + uint32_t FB : 1; + uint32_t MEMATTR : 4; + uint32_t TYPE : 2; + uint32_t BSU : 2; + uint32_t RACFG : 2; + uint32_t WACFG : 2; + uint32_t IRPTNDX : 8; + } B1; + struct + { + uint32_t VMID : 8; + uint32_t RESERVED0 : 8; + uint32_t TYPE : 2; + uint32_t SBZ : 2; + uint32_t RESERVED1 : 4; + uint32_t IRPTNDX : 8; + } B2; + struct + { + uint32_t VMID : 8; + uint32_t CBNDX : 8; + uint32_t TYPE : 2; + uint32_t SBZ : 2; + uint32_t RESERVED0 : 4; + uint32_t IRPTNDX : 8; + } B3; +} hw_smmu_cbar_t; + +/*! + * @name Constants and macros for entire SMMU_CBAR register + */ +/** @{ */ +#define HW_SMMU_CBAR_ADDR(x, n) ((uintptr_t)(x) + 0x10000U + (0x4U * (n))) +#define HW_SMMU_CBAR(x, n) (*(__IO hw_smmu_cbar_t *) HW_SMMU_CBAR_ADDR(x, n)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_CBFRSYNRA - Context Bank Fault Restricted Syndrome Register A + ******************************************************************************/ + +/*! + * @brief CBFRSYNRA - Context Bank Fault Restricted Syndrome Register A (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t SID : 16; + uint32_t SSD : 16; + } B; +} hw_smmu_cbfrsynra_t; + +/*! + * @name Constants and macros for entire SMMU_CBFRSYNRA register + */ +/** @{ */ +#define HW_SMMU_CBFRSYNRA_ADDR(x, n) ((uintptr_t)(x) + 0x10400U + (0x4U * (n))) +#define HW_SMMU_CBFRSYNRA(x, n) (*(__IO hw_smmu_cbfrsynra_t *) HW_SMMU_CBFRSYNRA_ADDR(x, n)) +/** @} */ + +/******************************************************************************* + * HW_SMMU_CBA2R - Stream-to-Context Register 2 + ******************************************************************************/ + +/*! + * @brief HW_SMMU_CBA2R - Context Bank Attribute Register 2 (RW) + * + */ +typedef union +{ + uint32_t U; + struct + { + uint32_t VA64 : 1; + uint32_t MONC : 1; + uint32_t RESERVED0 : 30; + } B; +} hw_smmu_cba2r_t; + +/*! + * @name Constants and macros for entire SMMU_CBA2R register + */ +/** @{ */ +#define HW_SMMU_CBA2R_ADDR(x, n) ((uintptr_t)(x) + 0x10800U + (0x4U * (n))) +#define HW_SMMU_CBA2R(x, n) (*(__IO hw_smmu_cba2r_t *) HW_SMMU_CBA2R_ADDR(x, n)) +/** @} */ + +/******************************************************************************* + * hw_smmu_t - module struct + ******************************************************************************/ +/*! + * @brief All SMMU module registers. + */ +#pragma pack(1) +typedef struct +{ + /* GR0 - 64K */ + __IO hw_smmu_scr0_t SCR0; + __IO hw_smmu_scr0_t SCR1; + __IO hw_smmu_scr0_t SCR2; + uint32_t _reserved0; + __IO hw_smmu_sacr_t SACR; + uint32_t _reserved1[3]; + __I hw_smmu_idr0_t IDR0; + __I hw_smmu_idr1_t IDR1; + __I hw_smmu_idr2_t IDR2; + __I uint32_t IDR3; + __I uint32_t IDR4; + __I uint32_t IDR5; + __I uint32_t IDR6; + __I hw_smmu_idr7_t IDR7; + __IO uint32_t SGFAR[2]; + __IO hw_smmu_sgfsr_t SGFSR; + __O uint32_t SFSRRESTORE; + __IO hw_smmu_sgfsynr0_t SGFSYNR0; + __IO hw_smmu_sgfsynr1_t SGFSYNR1; + __IO uint32_t SGFSYNR2; + uint32_t _reserved2; + __O uint32_t STLBIALL; + __O hw_smmu_tlbivmid_t TLBIVMID; + __O uint32_t TLBIALLNSNH; + __O uint32_t TLBIALLH; + __O uint32_t STLBGSYNC; + __I hw_smmu_stlbgstatus STLBGSTATUS; + __O uint32_t TLBIVAH[2]; + __IO uint32_t DBGRPTRTBU; + __I uint32_t DBGRDATATBU; + __IO uint32_t DBGRPTRTCU; + __I uint32_t DBGRDATATCU; + uint32_t _reserved3[4]; + __O uint32_t STLBIVALM[2]; + __O uint32_t STLBIVAM[2]; + __O uint32_t TLBIVALH64[2]; + __O uint32_t TLBIVMIDS1; + __O uint32_t STLBIALLM; + __O uint32_t TLBIVAH64[2]; + uint32_t _reserved4[14]; + __O uint32_t SGATS1UR[2]; + __O uint32_t SGATS1UW[2]; + __O uint32_t SGATS1PR[2]; + __O uint32_t SGATS1PW[2]; + __O uint32_t SGATS12UR[2]; + __O uint32_t SGATS12UW[2]; + __O uint32_t SGATS12PR[2]; + __O uint32_t SGATS12PW[2]; + uint32_t _reserved5[16]; + __IO uint32_t SGPAR[2]; + __IO uint32_t SGATSR; + uint32_t _reserved6[157]; + __IO hw_smmu_scr0_t NSCR0; + uint32_t _reserved7; + __IO hw_smmu_scr2_t NSCR2; + uint32_t _reserved8; + __IO hw_smmu_sacr_t NSACR; + uint32_t _reserved9[11]; + __IO uint32_t NSGFAR[2]; + __IO hw_smmu_sgfsr_t NSGFSR; + __O uint32_t NSGFSRRESTORE; + __IO hw_smmu_sgfsynr0_t NSGFSYNR0; + __IO hw_smmu_sgfsynr1_t NSGFSYNR1; + __IO uint32_t NSGFSYNR2; + uint32_t _reserved10[5]; + __O uint32_t NSTLBGSYNC; + __I hw_smmu_stlbgstatus NSTLBGSTATUS; + uint32_t _reserved11[34]; + __O uint32_t NSGATS1UR[2]; + __O uint32_t NSGATS1UW[2]; + __O uint32_t NSGATS1PR[2]; + __O uint32_t NSGATS1PW[2]; + __O uint32_t NSGATS12UR[2]; + __O uint32_t NSGATS12UW[2]; + __O uint32_t NSGATS12PR[2]; + __O uint32_t NSGATS12PW[2]; + uint32_t _reserved12[16]; + __IO uint32_t NSGPAR[2]; + __IO uint32_t NSGATSR; + uint32_t _reserved13[157]; + __IO hw_smmu_smr_t SMR[128]; + uint32_t _reserved14[128]; + __IO hw_smmu_s2cr_t S2CR[128]; + uint32_t _reserved15[128]; + uint8_t _reserved16[SMMU_PAGESIZE - 4096]; + /* GR 1 - 64K */ + __IO hw_smmu_cbar_t CBAR[128]; + uint32_t _reserved20[128]; + hw_smmu_cbfrsynra_t CBFRSYNRA[128]; + uint32_t _reserved21[128]; + __IO hw_smmu_cba2r_t CBA2R[128]; + uint32_t _reserved22[384]; + uint8_t _reserved23[SMMU_PAGESIZE - 4096]; + /* Blank Global */ + uint8_t _reserved30[SMMU_NUM_CB - 2][SMMU_PAGESIZE]; + /* CB */ + uint8_t _reserved40[SMMU_NUM_CB][SMMU_PAGESIZE]; +} hw_smmu_t; +#pragma pack() + +/*! @brief Macro to access all SMMU registers. */ +/*! @param x SMMU module instance base address. */ +/*! @return Reference (not a pointer) to the registers struct. To get a pointer to the struct, + * use the '&' operator, like &HW_SMMU(SMMU0_BASE). */ +#define HW_SMMU(x) (*(hw_smmu_t *)(x)) + +#define SMMU0 ((hw_smmu_t*) SMMU0_BASE) + +#endif /* HW_SMMU_REGISTERS_H */ + diff --git a/platform/devices/MX8/MX8_snvs.h b/platform/devices/MX8/MX8_snvs.h new file mode 100755 index 0000000..07bf344 --- /dev/null +++ b/platform/devices/MX8/MX8_snvs.h @@ -0,0 +1,857 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2018 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_SNVS_REGISTERS_H +#define HW_SNVS_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- SNVS Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SNVS_Peripheral_Access_Layer SNVS Peripheral Access Layer + * @{ + */ + +/** SNVS - Register Layout Typedef */ +typedef struct { + __IO uint32_t HPLR; /**< SNVS_HP Lock Register, offset: 0x0 */ + __IO uint32_t HPCOMR; /**< SNVS_HP Command Register, offset: 0x4 */ + __IO uint32_t HPCR; /**< SNVS_HP Control Register, offset: 0x8 */ + __IO uint32_t HPSICR; /**< SNVS_HP Security Interrupt Control Register, offset: 0xC */ + __IO uint32_t HPSVCR; /**< SNVS_HP Security Violation Control Register, offset: 0x10 */ + __IO uint32_t HPSR; /**< SNVS_HP Status Register, offset: 0x14 */ + __IO uint32_t HPSVSR; /**< SNVS_HP Security Violation Status Register, offset: 0x18 */ + __IO uint32_t HPHACIVR; /**< SNVS_HP High Assurance Counter IV Register, offset: 0x1C */ + __I uint32_t HPHACR; /**< SNVS_HP High Assurance Counter Register, offset: 0x20 */ + __IO uint32_t HPRTCMR; /**< SNVS_HP Real Time Counter MSB Register, offset: 0x24 */ + __IO uint32_t HPRTCLR; /**< SNVS_HP Real Time Counter LSB Register, offset: 0x28 */ + __IO uint32_t HPTAMR; /**< SNVS_HP Time Alarm MSB Register, offset: 0x2C */ + __IO uint32_t HPTALR; /**< SNVS_HP Time Alarm LSB Register, offset: 0x30 */ + __IO uint32_t LPLR; /**< SNVS_LP Lock Register, offset: 0x34 */ + __IO uint32_t LPCR; /**< SNVS_LP Control Register, offset: 0x38 */ + __IO uint32_t LPMKCR; /**< SNVS_LP Master Key Control Register, offset: 0x3C */ + __IO uint32_t LPSVCR; /**< SNVS_LP Security Violation Control Register, offset: 0x40 */ + __IO uint32_t LPTGFCR; /**< SNVS_LP Tamper Glitch Filters Configuration Register, offset: 0x44 */ + __IO uint32_t LPTDCR; /**< SNVS_LP Tamper Detectors Configuration Register, offset: 0x48 */ + __IO uint32_t LPSR; /**< SNVS_LP Status Register, offset: 0x4C */ + __IO uint32_t LPSRTCMR; /**< SNVS_LP Secure Real Time Counter MSB Register, offset: 0x50 */ + __IO uint32_t LPSRTCLR; /**< SNVS_LP Secure Real Time Counter LSB Register, offset: 0x54 */ + __IO uint32_t LPTAR; /**< SNVS_LP Time Alarm Register, offset: 0x58 */ + __I uint32_t LPSMCMR; /**< SNVS_LP Secure Monotonic Counter MSB Register, offset: 0x5C */ + __I uint32_t LPSMCLR; /**< SNVS_LP Secure Monotonic Counter LSB Register, offset: 0x60 */ + __IO uint32_t LPPGDR; /**< SNVS_LP Power Glitch Detector Register, offset: 0x64 */ + __IO uint32_t LPGPR0_LEGACY_ALIAS; /**< SNVS_LP General Purpose Register 0 (legacy alias), offset: 0x68 */ + __IO uint32_t LPZMKR[8]; /**< SNVS_LP Zeroizable Master Key Register, array offset: 0x6C, array step: 0x4 */ + uint8_t RESERVED_0[4]; + __IO uint32_t LPGPR_ALIAS[4]; /**< SNVS_LP General Purpose Registers 0 .. 3, array offset: 0x90, array step: 0x4 */ + __IO uint32_t LPTDC2R; /**< SNVS_LP Tamper Detectors Config 2 Register, offset: 0xA0 */ + __IO uint32_t LPTDSR; /**< SNVS_LP Tamper Detectors Status Register, offset: 0xA4 */ + __IO uint32_t LPTGF1CR; /**< SNVS_LP Tamper Glitch Filter 1 Configuration Register, offset: 0xA8 */ + __IO uint32_t LPTGF2CR; /**< SNVS_LP Tamper Glitch Filter 2 Configuration Register, offset: 0xAC */ + uint8_t RESERVED_1[80]; + __IO uint32_t LPGPR[8]; /**< SNVS_LP General Purpose Registers 0 .. 7, array offset: 0x100, array step: 0x4 */ + uint8_t RESERVED_2[2776]; + __I uint32_t HPVIDR1; /**< SNVS_HP Version ID Register 1, offset: 0xBF8 */ + __I uint32_t HPVIDR2; /**< SNVS_HP Version ID Register 2, offset: 0xBFC */ +} SNVS_Type; + +/* ---------------------------------------------------------------------------- + -- SNVS Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SNVS_Register_Masks SNVS Register Masks + * @{ + */ + +/*! @name HPLR - SNVS_HP Lock Register */ +#define SNVS_HPLR_ZMK_WSL_MASK (0x1U) +#define SNVS_HPLR_ZMK_WSL_SHIFT (0U) +#define SNVS_HPLR_ZMK_WSL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_ZMK_WSL_SHIFT)) & SNVS_HPLR_ZMK_WSL_MASK) +#define SNVS_HPLR_ZMK_RSL_MASK (0x2U) +#define SNVS_HPLR_ZMK_RSL_SHIFT (1U) +#define SNVS_HPLR_ZMK_RSL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_ZMK_RSL_SHIFT)) & SNVS_HPLR_ZMK_RSL_MASK) +#define SNVS_HPLR_SRTC_SL_MASK (0x4U) +#define SNVS_HPLR_SRTC_SL_SHIFT (2U) +#define SNVS_HPLR_SRTC_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_SRTC_SL_SHIFT)) & SNVS_HPLR_SRTC_SL_MASK) +#define SNVS_HPLR_LPCALB_SL_MASK (0x8U) +#define SNVS_HPLR_LPCALB_SL_SHIFT (3U) +#define SNVS_HPLR_LPCALB_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPCALB_SL_SHIFT)) & SNVS_HPLR_LPCALB_SL_MASK) +#define SNVS_HPLR_MC_SL_MASK (0x10U) +#define SNVS_HPLR_MC_SL_SHIFT (4U) +#define SNVS_HPLR_MC_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_MC_SL_SHIFT)) & SNVS_HPLR_MC_SL_MASK) +#define SNVS_HPLR_GPR_SL_MASK (0x20U) +#define SNVS_HPLR_GPR_SL_SHIFT (5U) +#define SNVS_HPLR_GPR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_GPR_SL_SHIFT)) & SNVS_HPLR_GPR_SL_MASK) +#define SNVS_HPLR_LPSVCR_SL_MASK (0x40U) +#define SNVS_HPLR_LPSVCR_SL_SHIFT (6U) +#define SNVS_HPLR_LPSVCR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPSVCR_SL_SHIFT)) & SNVS_HPLR_LPSVCR_SL_MASK) +#define SNVS_HPLR_LPTGFCR_SL_MASK (0x80U) +#define SNVS_HPLR_LPTGFCR_SL_SHIFT (7U) +#define SNVS_HPLR_LPTGFCR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPTGFCR_SL_SHIFT)) & SNVS_HPLR_LPTGFCR_SL_MASK) +#define SNVS_HPLR_LPTDCR_SL_MASK (0x100U) +#define SNVS_HPLR_LPTDCR_SL_SHIFT (8U) +#define SNVS_HPLR_LPTDCR_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_LPTDCR_SL_SHIFT)) & SNVS_HPLR_LPTDCR_SL_MASK) +#define SNVS_HPLR_MKS_SL_MASK (0x200U) +#define SNVS_HPLR_MKS_SL_SHIFT (9U) +#define SNVS_HPLR_MKS_SL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_MKS_SL_SHIFT)) & SNVS_HPLR_MKS_SL_MASK) +#define SNVS_HPLR_HPSVCR_L_MASK (0x10000U) +#define SNVS_HPLR_HPSVCR_L_SHIFT (16U) +#define SNVS_HPLR_HPSVCR_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HPSVCR_L_SHIFT)) & SNVS_HPLR_HPSVCR_L_MASK) +#define SNVS_HPLR_HPSICR_L_MASK (0x20000U) +#define SNVS_HPLR_HPSICR_L_SHIFT (17U) +#define SNVS_HPLR_HPSICR_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HPSICR_L_SHIFT)) & SNVS_HPLR_HPSICR_L_MASK) +#define SNVS_HPLR_HAC_L_MASK (0x40000U) +#define SNVS_HPLR_HAC_L_SHIFT (18U) +#define SNVS_HPLR_HAC_L(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPLR_HAC_L_SHIFT)) & SNVS_HPLR_HAC_L_MASK) + +/*! @name HPCOMR - SNVS_HP Command Register */ +#define SNVS_HPCOMR_SSM_ST_MASK (0x1U) +#define SNVS_HPCOMR_SSM_ST_SHIFT (0U) +#define SNVS_HPCOMR_SSM_ST(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_ST_SHIFT)) & SNVS_HPCOMR_SSM_ST_MASK) +#define SNVS_HPCOMR_SSM_ST_DIS_MASK (0x2U) +#define SNVS_HPCOMR_SSM_ST_DIS_SHIFT (1U) +#define SNVS_HPCOMR_SSM_ST_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_ST_DIS_SHIFT)) & SNVS_HPCOMR_SSM_ST_DIS_MASK) +#define SNVS_HPCOMR_SSM_SFNS_DIS_MASK (0x4U) +#define SNVS_HPCOMR_SSM_SFNS_DIS_SHIFT (2U) +#define SNVS_HPCOMR_SSM_SFNS_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SSM_SFNS_DIS_SHIFT)) & SNVS_HPCOMR_SSM_SFNS_DIS_MASK) +#define SNVS_HPCOMR_LP_SWR_MASK (0x10U) +#define SNVS_HPCOMR_LP_SWR_SHIFT (4U) +#define SNVS_HPCOMR_LP_SWR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_LP_SWR_SHIFT)) & SNVS_HPCOMR_LP_SWR_MASK) +#define SNVS_HPCOMR_LP_SWR_DIS_MASK (0x20U) +#define SNVS_HPCOMR_LP_SWR_DIS_SHIFT (5U) +#define SNVS_HPCOMR_LP_SWR_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_LP_SWR_DIS_SHIFT)) & SNVS_HPCOMR_LP_SWR_DIS_MASK) +#define SNVS_HPCOMR_SW_SV_MASK (0x100U) +#define SNVS_HPCOMR_SW_SV_SHIFT (8U) +#define SNVS_HPCOMR_SW_SV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_SV_SHIFT)) & SNVS_HPCOMR_SW_SV_MASK) +#define SNVS_HPCOMR_SW_FSV_MASK (0x200U) +#define SNVS_HPCOMR_SW_FSV_SHIFT (9U) +#define SNVS_HPCOMR_SW_FSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_FSV_SHIFT)) & SNVS_HPCOMR_SW_FSV_MASK) +#define SNVS_HPCOMR_SW_LPSV_MASK (0x400U) +#define SNVS_HPCOMR_SW_LPSV_SHIFT (10U) +#define SNVS_HPCOMR_SW_LPSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_SW_LPSV_SHIFT)) & SNVS_HPCOMR_SW_LPSV_MASK) +#define SNVS_HPCOMR_PROG_ZMK_MASK (0x1000U) +#define SNVS_HPCOMR_PROG_ZMK_SHIFT (12U) +#define SNVS_HPCOMR_PROG_ZMK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_PROG_ZMK_SHIFT)) & SNVS_HPCOMR_PROG_ZMK_MASK) +#define SNVS_HPCOMR_MKS_EN_MASK (0x2000U) +#define SNVS_HPCOMR_MKS_EN_SHIFT (13U) +#define SNVS_HPCOMR_MKS_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_MKS_EN_SHIFT)) & SNVS_HPCOMR_MKS_EN_MASK) +#define SNVS_HPCOMR_HAC_EN_MASK (0x10000U) +#define SNVS_HPCOMR_HAC_EN_SHIFT (16U) +#define SNVS_HPCOMR_HAC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_EN_SHIFT)) & SNVS_HPCOMR_HAC_EN_MASK) +#define SNVS_HPCOMR_HAC_LOAD_MASK (0x20000U) +#define SNVS_HPCOMR_HAC_LOAD_SHIFT (17U) +#define SNVS_HPCOMR_HAC_LOAD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_LOAD_SHIFT)) & SNVS_HPCOMR_HAC_LOAD_MASK) +#define SNVS_HPCOMR_HAC_CLEAR_MASK (0x40000U) +#define SNVS_HPCOMR_HAC_CLEAR_SHIFT (18U) +#define SNVS_HPCOMR_HAC_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_CLEAR_SHIFT)) & SNVS_HPCOMR_HAC_CLEAR_MASK) +#define SNVS_HPCOMR_HAC_STOP_MASK (0x80000U) +#define SNVS_HPCOMR_HAC_STOP_SHIFT (19U) +#define SNVS_HPCOMR_HAC_STOP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_HAC_STOP_SHIFT)) & SNVS_HPCOMR_HAC_STOP_MASK) +#define SNVS_HPCOMR_NPSWA_EN_MASK (0x80000000U) +#define SNVS_HPCOMR_NPSWA_EN_SHIFT (31U) +#define SNVS_HPCOMR_NPSWA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCOMR_NPSWA_EN_SHIFT)) & SNVS_HPCOMR_NPSWA_EN_MASK) + +/*! @name HPCR - SNVS_HP Control Register */ +#define SNVS_HPCR_RTC_EN_MASK (0x1U) +#define SNVS_HPCR_RTC_EN_SHIFT (0U) +#define SNVS_HPCR_RTC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_RTC_EN_SHIFT)) & SNVS_HPCR_RTC_EN_MASK) +#define SNVS_HPCR_HPTA_EN_MASK (0x2U) +#define SNVS_HPCR_HPTA_EN_SHIFT (1U) +#define SNVS_HPCR_HPTA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPTA_EN_SHIFT)) & SNVS_HPCR_HPTA_EN_MASK) +#define SNVS_HPCR_PI_EN_MASK (0x8U) +#define SNVS_HPCR_PI_EN_SHIFT (3U) +#define SNVS_HPCR_PI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_PI_EN_SHIFT)) & SNVS_HPCR_PI_EN_MASK) +#define SNVS_HPCR_PI_FREQ_MASK (0xF0U) +#define SNVS_HPCR_PI_FREQ_SHIFT (4U) +#define SNVS_HPCR_PI_FREQ(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_PI_FREQ_SHIFT)) & SNVS_HPCR_PI_FREQ_MASK) +#define SNVS_HPCR_HPCALB_EN_MASK (0x100U) +#define SNVS_HPCR_HPCALB_EN_SHIFT (8U) +#define SNVS_HPCR_HPCALB_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPCALB_EN_SHIFT)) & SNVS_HPCR_HPCALB_EN_MASK) +#define SNVS_HPCR_HPCALB_VAL_MASK (0x7C00U) +#define SNVS_HPCR_HPCALB_VAL_SHIFT (10U) +#define SNVS_HPCR_HPCALB_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HPCALB_VAL_SHIFT)) & SNVS_HPCR_HPCALB_VAL_MASK) +#define SNVS_HPCR_HP_TS_MASK (0x10000U) +#define SNVS_HPCR_HP_TS_SHIFT (16U) +#define SNVS_HPCR_HP_TS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_HP_TS_SHIFT)) & SNVS_HPCR_HP_TS_MASK) +#define SNVS_HPCR_BTN_CONFIG_MASK (0x7000000U) +#define SNVS_HPCR_BTN_CONFIG_SHIFT (24U) +#define SNVS_HPCR_BTN_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_BTN_CONFIG_SHIFT)) & SNVS_HPCR_BTN_CONFIG_MASK) +#define SNVS_HPCR_BTN_MASK_MASK (0x8000000U) +#define SNVS_HPCR_BTN_MASK_SHIFT (27U) +#define SNVS_HPCR_BTN_MASK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPCR_BTN_MASK_SHIFT)) & SNVS_HPCR_BTN_MASK_MASK) + +/*! @name HPSICR - SNVS_HP Security Interrupt Control Register */ +#define SNVS_HPSICR_SV0_EN_MASK (0x1U) +#define SNVS_HPSICR_SV0_EN_SHIFT (0U) +#define SNVS_HPSICR_SV0_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV0_EN_SHIFT)) & SNVS_HPSICR_SV0_EN_MASK) +#define SNVS_HPSICR_SV1_EN_MASK (0x2U) +#define SNVS_HPSICR_SV1_EN_SHIFT (1U) +#define SNVS_HPSICR_SV1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV1_EN_SHIFT)) & SNVS_HPSICR_SV1_EN_MASK) +#define SNVS_HPSICR_SV2_EN_MASK (0x4U) +#define SNVS_HPSICR_SV2_EN_SHIFT (2U) +#define SNVS_HPSICR_SV2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV2_EN_SHIFT)) & SNVS_HPSICR_SV2_EN_MASK) +#define SNVS_HPSICR_SV3_EN_MASK (0x8U) +#define SNVS_HPSICR_SV3_EN_SHIFT (3U) +#define SNVS_HPSICR_SV3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV3_EN_SHIFT)) & SNVS_HPSICR_SV3_EN_MASK) +#define SNVS_HPSICR_SV4_EN_MASK (0x10U) +#define SNVS_HPSICR_SV4_EN_SHIFT (4U) +#define SNVS_HPSICR_SV4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV4_EN_SHIFT)) & SNVS_HPSICR_SV4_EN_MASK) +#define SNVS_HPSICR_SV5_EN_MASK (0x20U) +#define SNVS_HPSICR_SV5_EN_SHIFT (5U) +#define SNVS_HPSICR_SV5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_SV5_EN_SHIFT)) & SNVS_HPSICR_SV5_EN_MASK) +#define SNVS_HPSICR_LPSVI_EN_MASK (0x80000000U) +#define SNVS_HPSICR_LPSVI_EN_SHIFT (31U) +#define SNVS_HPSICR_LPSVI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSICR_LPSVI_EN_SHIFT)) & SNVS_HPSICR_LPSVI_EN_MASK) + +/*! @name HPSVCR - SNVS_HP Security Violation Control Register */ +#define SNVS_HPSVCR_SV0_CFG_MASK (0x1U) +#define SNVS_HPSVCR_SV0_CFG_SHIFT (0U) +#define SNVS_HPSVCR_SV0_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV0_CFG_SHIFT)) & SNVS_HPSVCR_SV0_CFG_MASK) +#define SNVS_HPSVCR_SV1_CFG_MASK (0x2U) +#define SNVS_HPSVCR_SV1_CFG_SHIFT (1U) +#define SNVS_HPSVCR_SV1_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV1_CFG_SHIFT)) & SNVS_HPSVCR_SV1_CFG_MASK) +#define SNVS_HPSVCR_SV2_CFG_MASK (0x4U) +#define SNVS_HPSVCR_SV2_CFG_SHIFT (2U) +#define SNVS_HPSVCR_SV2_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV2_CFG_SHIFT)) & SNVS_HPSVCR_SV2_CFG_MASK) +#define SNVS_HPSVCR_SV3_CFG_MASK (0x8U) +#define SNVS_HPSVCR_SV3_CFG_SHIFT (3U) +#define SNVS_HPSVCR_SV3_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV3_CFG_SHIFT)) & SNVS_HPSVCR_SV3_CFG_MASK) +#define SNVS_HPSVCR_SV4_CFG_MASK (0x10U) +#define SNVS_HPSVCR_SV4_CFG_SHIFT (4U) +#define SNVS_HPSVCR_SV4_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV4_CFG_SHIFT)) & SNVS_HPSVCR_SV4_CFG_MASK) +#define SNVS_HPSVCR_SV5_CFG_MASK (0x60U) +#define SNVS_HPSVCR_SV5_CFG_SHIFT (5U) +#define SNVS_HPSVCR_SV5_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_SV5_CFG_SHIFT)) & SNVS_HPSVCR_SV5_CFG_MASK) +#define SNVS_HPSVCR_LPSV_CFG_MASK (0xC0000000U) +#define SNVS_HPSVCR_LPSV_CFG_SHIFT (30U) +#define SNVS_HPSVCR_LPSV_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVCR_LPSV_CFG_SHIFT)) & SNVS_HPSVCR_LPSV_CFG_MASK) + +/*! @name HPSR - SNVS_HP Status Register */ +#define SNVS_HPSR_HPTA_MASK (0x1U) +#define SNVS_HPSR_HPTA_SHIFT (0U) +#define SNVS_HPSR_HPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_HPTA_SHIFT)) & SNVS_HPSR_HPTA_MASK) +#define SNVS_HPSR_PI_MASK (0x2U) +#define SNVS_HPSR_PI_SHIFT (1U) +#define SNVS_HPSR_PI(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_PI_SHIFT)) & SNVS_HPSR_PI_MASK) +#define SNVS_HPSR_BTN_MASK (0x40U) +#define SNVS_HPSR_BTN_SHIFT (6U) +#define SNVS_HPSR_BTN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_BTN_SHIFT)) & SNVS_HPSR_BTN_MASK) +#define SNVS_HPSR_BI_MASK (0x80U) +#define SNVS_HPSR_BI_SHIFT (7U) +#define SNVS_HPSR_BI(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_BI_SHIFT)) & SNVS_HPSR_BI_MASK) +#define SNVS_HPSR_SSM_STATE_MASK (0xF00U) +#define SNVS_HPSR_SSM_STATE_SHIFT (8U) +#define SNVS_HPSR_SSM_STATE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_SSM_STATE_SHIFT)) & SNVS_HPSR_SSM_STATE_MASK) +#define SNVS_HPSR_SYS_SECURITY_CFG_MASK (0x7000U) +#define SNVS_HPSR_SYS_SECURITY_CFG_SHIFT (12U) +#define SNVS_HPSR_SYS_SECURITY_CFG(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_SYS_SECURITY_CFG_SHIFT)) & SNVS_HPSR_SYS_SECURITY_CFG_MASK) +#define SNVS_HPSR_SYS_SECURE_BOOT_MASK (0x8000U) +#define SNVS_HPSR_SYS_SECURE_BOOT_SHIFT (15U) +#define SNVS_HPSR_SYS_SECURE_BOOT(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_SYS_SECURE_BOOT_SHIFT)) & SNVS_HPSR_SYS_SECURE_BOOT_MASK) +#define SNVS_HPSR_OTPMK_SYNDROME_MASK (0x1FF0000U) +#define SNVS_HPSR_OTPMK_SYNDROME_SHIFT (16U) +#define SNVS_HPSR_OTPMK_SYNDROME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_OTPMK_SYNDROME_SHIFT)) & SNVS_HPSR_OTPMK_SYNDROME_MASK) +#define SNVS_HPSR_OTPMK_ZERO_MASK (0x8000000U) +#define SNVS_HPSR_OTPMK_ZERO_SHIFT (27U) +#define SNVS_HPSR_OTPMK_ZERO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_OTPMK_ZERO_SHIFT)) & SNVS_HPSR_OTPMK_ZERO_MASK) +#define SNVS_HPSR_ZMK_ZERO_MASK (0x80000000U) +#define SNVS_HPSR_ZMK_ZERO_SHIFT (31U) +#define SNVS_HPSR_ZMK_ZERO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSR_ZMK_ZERO_SHIFT)) & SNVS_HPSR_ZMK_ZERO_MASK) + +/*! @name HPSVSR - SNVS_HP Security Violation Status Register */ +#define SNVS_HPSVSR_SV0_MASK (0x1U) +#define SNVS_HPSVSR_SV0_SHIFT (0U) +#define SNVS_HPSVSR_SV0(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV0_SHIFT)) & SNVS_HPSVSR_SV0_MASK) +#define SNVS_HPSVSR_SV1_MASK (0x2U) +#define SNVS_HPSVSR_SV1_SHIFT (1U) +#define SNVS_HPSVSR_SV1(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV1_SHIFT)) & SNVS_HPSVSR_SV1_MASK) +#define SNVS_HPSVSR_SV2_MASK (0x4U) +#define SNVS_HPSVSR_SV2_SHIFT (2U) +#define SNVS_HPSVSR_SV2(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV2_SHIFT)) & SNVS_HPSVSR_SV2_MASK) +#define SNVS_HPSVSR_SV3_MASK (0x8U) +#define SNVS_HPSVSR_SV3_SHIFT (3U) +#define SNVS_HPSVSR_SV3(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV3_SHIFT)) & SNVS_HPSVSR_SV3_MASK) +#define SNVS_HPSVSR_SV4_MASK (0x10U) +#define SNVS_HPSVSR_SV4_SHIFT (4U) +#define SNVS_HPSVSR_SV4(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV4_SHIFT)) & SNVS_HPSVSR_SV4_MASK) +#define SNVS_HPSVSR_SV5_MASK (0x20U) +#define SNVS_HPSVSR_SV5_SHIFT (5U) +#define SNVS_HPSVSR_SV5(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SV5_SHIFT)) & SNVS_HPSVSR_SV5_MASK) +#define SNVS_HPSVSR_SW_SV_MASK (0x2000U) +#define SNVS_HPSVSR_SW_SV_SHIFT (13U) +#define SNVS_HPSVSR_SW_SV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_SV_SHIFT)) & SNVS_HPSVSR_SW_SV_MASK) +#define SNVS_HPSVSR_SW_FSV_MASK (0x4000U) +#define SNVS_HPSVSR_SW_FSV_SHIFT (14U) +#define SNVS_HPSVSR_SW_FSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_FSV_SHIFT)) & SNVS_HPSVSR_SW_FSV_MASK) +#define SNVS_HPSVSR_SW_LPSV_MASK (0x8000U) +#define SNVS_HPSVSR_SW_LPSV_SHIFT (15U) +#define SNVS_HPSVSR_SW_LPSV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_SW_LPSV_SHIFT)) & SNVS_HPSVSR_SW_LPSV_MASK) +#define SNVS_HPSVSR_ZMK_SYNDROME_MASK (0x1FF0000U) +#define SNVS_HPSVSR_ZMK_SYNDROME_SHIFT (16U) +#define SNVS_HPSVSR_ZMK_SYNDROME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_ZMK_SYNDROME_SHIFT)) & SNVS_HPSVSR_ZMK_SYNDROME_MASK) +#define SNVS_HPSVSR_ZMK_ECC_FAIL_MASK (0x8000000U) +#define SNVS_HPSVSR_ZMK_ECC_FAIL_SHIFT (27U) +#define SNVS_HPSVSR_ZMK_ECC_FAIL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_ZMK_ECC_FAIL_SHIFT)) & SNVS_HPSVSR_ZMK_ECC_FAIL_MASK) +#define SNVS_HPSVSR_LP_SEC_VIO_MASK (0x80000000U) +#define SNVS_HPSVSR_LP_SEC_VIO_SHIFT (31U) +#define SNVS_HPSVSR_LP_SEC_VIO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPSVSR_LP_SEC_VIO_SHIFT)) & SNVS_HPSVSR_LP_SEC_VIO_MASK) + +/*! @name HPHACIVR - SNVS_HP High Assurance Counter IV Register */ +#define SNVS_HPHACIVR_HAC_COUNTER_IV_MASK (0xFFFFFFFFU) +#define SNVS_HPHACIVR_HAC_COUNTER_IV_SHIFT (0U) +#define SNVS_HPHACIVR_HAC_COUNTER_IV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPHACIVR_HAC_COUNTER_IV_SHIFT)) & SNVS_HPHACIVR_HAC_COUNTER_IV_MASK) + +/*! @name HPHACR - SNVS_HP High Assurance Counter Register */ +#define SNVS_HPHACR_HAC_COUNTER_MASK (0xFFFFFFFFU) +#define SNVS_HPHACR_HAC_COUNTER_SHIFT (0U) +#define SNVS_HPHACR_HAC_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPHACR_HAC_COUNTER_SHIFT)) & SNVS_HPHACR_HAC_COUNTER_MASK) + +/*! @name HPRTCMR - SNVS_HP Real Time Counter MSB Register */ +#define SNVS_HPRTCMR_RTC_MASK (0x7FFFU) +#define SNVS_HPRTCMR_RTC_SHIFT (0U) +#define SNVS_HPRTCMR_RTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPRTCMR_RTC_SHIFT)) & SNVS_HPRTCMR_RTC_MASK) + +/*! @name HPRTCLR - SNVS_HP Real Time Counter LSB Register */ +#define SNVS_HPRTCLR_RTC_MASK (0xFFFFFFFFU) +#define SNVS_HPRTCLR_RTC_SHIFT (0U) +#define SNVS_HPRTCLR_RTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPRTCLR_RTC_SHIFT)) & SNVS_HPRTCLR_RTC_MASK) + +/*! @name HPTAMR - SNVS_HP Time Alarm MSB Register */ +#define SNVS_HPTAMR_HPTA_MS_MASK (0x7FFFU) +#define SNVS_HPTAMR_HPTA_MS_SHIFT (0U) +#define SNVS_HPTAMR_HPTA_MS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPTAMR_HPTA_MS_SHIFT)) & SNVS_HPTAMR_HPTA_MS_MASK) + +/*! @name HPTALR - SNVS_HP Time Alarm LSB Register */ +#define SNVS_HPTALR_HPTA_LS_MASK (0xFFFFFFFFU) +#define SNVS_HPTALR_HPTA_LS_SHIFT (0U) +#define SNVS_HPTALR_HPTA_LS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPTALR_HPTA_LS_SHIFT)) & SNVS_HPTALR_HPTA_LS_MASK) + +/*! @name LPLR - SNVS_LP Lock Register */ +#define SNVS_LPLR_ZMK_WHL_MASK (0x1U) +#define SNVS_LPLR_ZMK_WHL_SHIFT (0U) +#define SNVS_LPLR_ZMK_WHL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_ZMK_WHL_SHIFT)) & SNVS_LPLR_ZMK_WHL_MASK) +#define SNVS_LPLR_ZMK_RHL_MASK (0x2U) +#define SNVS_LPLR_ZMK_RHL_SHIFT (1U) +#define SNVS_LPLR_ZMK_RHL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_ZMK_RHL_SHIFT)) & SNVS_LPLR_ZMK_RHL_MASK) +#define SNVS_LPLR_SRTC_HL_MASK (0x4U) +#define SNVS_LPLR_SRTC_HL_SHIFT (2U) +#define SNVS_LPLR_SRTC_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_SRTC_HL_SHIFT)) & SNVS_LPLR_SRTC_HL_MASK) +#define SNVS_LPLR_LPCALB_HL_MASK (0x8U) +#define SNVS_LPLR_LPCALB_HL_SHIFT (3U) +#define SNVS_LPLR_LPCALB_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPCALB_HL_SHIFT)) & SNVS_LPLR_LPCALB_HL_MASK) +#define SNVS_LPLR_MC_HL_MASK (0x10U) +#define SNVS_LPLR_MC_HL_SHIFT (4U) +#define SNVS_LPLR_MC_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_MC_HL_SHIFT)) & SNVS_LPLR_MC_HL_MASK) +#define SNVS_LPLR_GPR_HL_MASK (0x20U) +#define SNVS_LPLR_GPR_HL_SHIFT (5U) +#define SNVS_LPLR_GPR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_GPR_HL_SHIFT)) & SNVS_LPLR_GPR_HL_MASK) +#define SNVS_LPLR_LPSVCR_HL_MASK (0x40U) +#define SNVS_LPLR_LPSVCR_HL_SHIFT (6U) +#define SNVS_LPLR_LPSVCR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPSVCR_HL_SHIFT)) & SNVS_LPLR_LPSVCR_HL_MASK) +#define SNVS_LPLR_LPTGFCR_HL_MASK (0x80U) +#define SNVS_LPLR_LPTGFCR_HL_SHIFT (7U) +#define SNVS_LPLR_LPTGFCR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPTGFCR_HL_SHIFT)) & SNVS_LPLR_LPTGFCR_HL_MASK) +#define SNVS_LPLR_LPTDCR_HL_MASK (0x100U) +#define SNVS_LPLR_LPTDCR_HL_SHIFT (8U) +#define SNVS_LPLR_LPTDCR_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_LPTDCR_HL_SHIFT)) & SNVS_LPLR_LPTDCR_HL_MASK) +#define SNVS_LPLR_MKS_HL_MASK (0x200U) +#define SNVS_LPLR_MKS_HL_SHIFT (9U) +#define SNVS_LPLR_MKS_HL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPLR_MKS_HL_SHIFT)) & SNVS_LPLR_MKS_HL_MASK) + +/*! @name LPCR - SNVS_LP Control Register */ +#define SNVS_LPCR_SRTC_ENV_MASK (0x1U) +#define SNVS_LPCR_SRTC_ENV_SHIFT (0U) +#define SNVS_LPCR_SRTC_ENV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_SRTC_ENV_SHIFT)) & SNVS_LPCR_SRTC_ENV_MASK) +#define SNVS_LPCR_LPTA_EN_MASK (0x2U) +#define SNVS_LPCR_LPTA_EN_SHIFT (1U) +#define SNVS_LPCR_LPTA_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPTA_EN_SHIFT)) & SNVS_LPCR_LPTA_EN_MASK) +#define SNVS_LPCR_MC_ENV_MASK (0x4U) +#define SNVS_LPCR_MC_ENV_SHIFT (2U) +#define SNVS_LPCR_MC_ENV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_MC_ENV_SHIFT)) & SNVS_LPCR_MC_ENV_MASK) +#define SNVS_LPCR_LPWUI_EN_MASK (0x8U) +#define SNVS_LPCR_LPWUI_EN_SHIFT (3U) +#define SNVS_LPCR_LPWUI_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPWUI_EN_SHIFT)) & SNVS_LPCR_LPWUI_EN_MASK) +#define SNVS_LPCR_SRTC_INV_EN_MASK (0x10U) +#define SNVS_LPCR_SRTC_INV_EN_SHIFT (4U) +#define SNVS_LPCR_SRTC_INV_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_SRTC_INV_EN_SHIFT)) & SNVS_LPCR_SRTC_INV_EN_MASK) +#define SNVS_LPCR_DP_EN_MASK (0x20U) +#define SNVS_LPCR_DP_EN_SHIFT (5U) +#define SNVS_LPCR_DP_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_DP_EN_SHIFT)) & SNVS_LPCR_DP_EN_MASK) +#define SNVS_LPCR_TOP_MASK (0x40U) +#define SNVS_LPCR_TOP_SHIFT (6U) +#define SNVS_LPCR_TOP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_TOP_SHIFT)) & SNVS_LPCR_TOP_MASK) +#define SNVS_LPCR_PWR_GLITCH_EN_MASK (0x80U) +#define SNVS_LPCR_PWR_GLITCH_EN_SHIFT (7U) +#define SNVS_LPCR_PWR_GLITCH_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PWR_GLITCH_EN_SHIFT)) & SNVS_LPCR_PWR_GLITCH_EN_MASK) +#define SNVS_LPCR_LPCALB_EN_MASK (0x100U) +#define SNVS_LPCR_LPCALB_EN_SHIFT (8U) +#define SNVS_LPCR_LPCALB_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPCALB_EN_SHIFT)) & SNVS_LPCR_LPCALB_EN_MASK) +#define SNVS_LPCR_LPCALB_VAL_MASK (0x7C00U) +#define SNVS_LPCR_LPCALB_VAL_SHIFT (10U) +#define SNVS_LPCR_LPCALB_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_LPCALB_VAL_SHIFT)) & SNVS_LPCR_LPCALB_VAL_MASK) +#define SNVS_LPCR_BTN_PRESS_TIME_MASK (0x30000U) +#define SNVS_LPCR_BTN_PRESS_TIME_SHIFT (16U) +#define SNVS_LPCR_BTN_PRESS_TIME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_BTN_PRESS_TIME_SHIFT)) & SNVS_LPCR_BTN_PRESS_TIME_MASK) +#define SNVS_LPCR_DEBOUNCE_MASK (0xC0000U) +#define SNVS_LPCR_DEBOUNCE_SHIFT (18U) +#define SNVS_LPCR_DEBOUNCE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_DEBOUNCE_SHIFT)) & SNVS_LPCR_DEBOUNCE_MASK) +#define SNVS_LPCR_ON_TIME_MASK (0x300000U) +#define SNVS_LPCR_ON_TIME_SHIFT (20U) +#define SNVS_LPCR_ON_TIME(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_ON_TIME_SHIFT)) & SNVS_LPCR_ON_TIME_MASK) +#define SNVS_LPCR_PK_EN_MASK (0x400000U) +#define SNVS_LPCR_PK_EN_SHIFT (22U) +#define SNVS_LPCR_PK_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PK_EN_SHIFT)) & SNVS_LPCR_PK_EN_MASK) +#define SNVS_LPCR_PK_OVERRIDE_MASK (0x800000U) +#define SNVS_LPCR_PK_OVERRIDE_SHIFT (23U) +#define SNVS_LPCR_PK_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_PK_OVERRIDE_SHIFT)) & SNVS_LPCR_PK_OVERRIDE_MASK) +#define SNVS_LPCR_GPR_Z_DIS_MASK (0x1000000U) +#define SNVS_LPCR_GPR_Z_DIS_SHIFT (24U) +#define SNVS_LPCR_GPR_Z_DIS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPCR_GPR_Z_DIS_SHIFT)) & SNVS_LPCR_GPR_Z_DIS_MASK) + +/*! @name LPMKCR - SNVS_LP Master Key Control Register */ +#define SNVS_LPMKCR_MASTER_KEY_SEL_MASK (0x3U) +#define SNVS_LPMKCR_MASTER_KEY_SEL_SHIFT (0U) +#define SNVS_LPMKCR_MASTER_KEY_SEL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_MASTER_KEY_SEL_SHIFT)) & SNVS_LPMKCR_MASTER_KEY_SEL_MASK) +#define SNVS_LPMKCR_ZMK_HWP_MASK (0x4U) +#define SNVS_LPMKCR_ZMK_HWP_SHIFT (2U) +#define SNVS_LPMKCR_ZMK_HWP(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_HWP_SHIFT)) & SNVS_LPMKCR_ZMK_HWP_MASK) +#define SNVS_LPMKCR_ZMK_VAL_MASK (0x8U) +#define SNVS_LPMKCR_ZMK_VAL_SHIFT (3U) +#define SNVS_LPMKCR_ZMK_VAL(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_VAL_SHIFT)) & SNVS_LPMKCR_ZMK_VAL_MASK) +#define SNVS_LPMKCR_ZMK_ECC_EN_MASK (0x10U) +#define SNVS_LPMKCR_ZMK_ECC_EN_SHIFT (4U) +#define SNVS_LPMKCR_ZMK_ECC_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_ECC_EN_SHIFT)) & SNVS_LPMKCR_ZMK_ECC_EN_MASK) +#define SNVS_LPMKCR_ZMK_ECC_VALUE_MASK (0xFF80U) +#define SNVS_LPMKCR_ZMK_ECC_VALUE_SHIFT (7U) +#define SNVS_LPMKCR_ZMK_ECC_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPMKCR_ZMK_ECC_VALUE_SHIFT)) & SNVS_LPMKCR_ZMK_ECC_VALUE_MASK) + +/*! @name LPSVCR - SNVS_LP Security Violation Control Register */ +#define SNVS_LPSVCR_SV0_EN_MASK (0x1U) +#define SNVS_LPSVCR_SV0_EN_SHIFT (0U) +#define SNVS_LPSVCR_SV0_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV0_EN_SHIFT)) & SNVS_LPSVCR_SV0_EN_MASK) +#define SNVS_LPSVCR_SV1_EN_MASK (0x2U) +#define SNVS_LPSVCR_SV1_EN_SHIFT (1U) +#define SNVS_LPSVCR_SV1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV1_EN_SHIFT)) & SNVS_LPSVCR_SV1_EN_MASK) +#define SNVS_LPSVCR_SV2_EN_MASK (0x4U) +#define SNVS_LPSVCR_SV2_EN_SHIFT (2U) +#define SNVS_LPSVCR_SV2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV2_EN_SHIFT)) & SNVS_LPSVCR_SV2_EN_MASK) +#define SNVS_LPSVCR_SV3_EN_MASK (0x8U) +#define SNVS_LPSVCR_SV3_EN_SHIFT (3U) +#define SNVS_LPSVCR_SV3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV3_EN_SHIFT)) & SNVS_LPSVCR_SV3_EN_MASK) +#define SNVS_LPSVCR_SV4_EN_MASK (0x10U) +#define SNVS_LPSVCR_SV4_EN_SHIFT (4U) +#define SNVS_LPSVCR_SV4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV4_EN_SHIFT)) & SNVS_LPSVCR_SV4_EN_MASK) +#define SNVS_LPSVCR_SV5_EN_MASK (0x20U) +#define SNVS_LPSVCR_SV5_EN_SHIFT (5U) +#define SNVS_LPSVCR_SV5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSVCR_SV5_EN_SHIFT)) & SNVS_LPSVCR_SV5_EN_MASK) + +/*! @name LPTGFCR - SNVS_LP Tamper Glitch Filters Configuration Register */ +#define SNVS_LPTGFCR_WMTGF_MASK (0x1FU) +#define SNVS_LPTGFCR_WMTGF_SHIFT (0U) +#define SNVS_LPTGFCR_WMTGF(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_WMTGF_SHIFT)) & SNVS_LPTGFCR_WMTGF_MASK) +#define SNVS_LPTGFCR_WMTGF_EN_MASK (0x80U) +#define SNVS_LPTGFCR_WMTGF_EN_SHIFT (7U) +#define SNVS_LPTGFCR_WMTGF_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_WMTGF_EN_SHIFT)) & SNVS_LPTGFCR_WMTGF_EN_MASK) +#define SNVS_LPTGFCR_ETGF1_MASK (0x7F0000U) +#define SNVS_LPTGFCR_ETGF1_SHIFT (16U) +#define SNVS_LPTGFCR_ETGF1(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_ETGF1_SHIFT)) & SNVS_LPTGFCR_ETGF1_MASK) +#define SNVS_LPTGFCR_ETGF1_EN_MASK (0x800000U) +#define SNVS_LPTGFCR_ETGF1_EN_SHIFT (23U) +#define SNVS_LPTGFCR_ETGF1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_ETGF1_EN_SHIFT)) & SNVS_LPTGFCR_ETGF1_EN_MASK) +#define SNVS_LPTGFCR_ETGF2_MASK (0x7F000000U) +#define SNVS_LPTGFCR_ETGF2_SHIFT (24U) +#define SNVS_LPTGFCR_ETGF2(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_ETGF2_SHIFT)) & SNVS_LPTGFCR_ETGF2_MASK) +#define SNVS_LPTGFCR_ETGF2_EN_MASK (0x80000000U) +#define SNVS_LPTGFCR_ETGF2_EN_SHIFT (31U) +#define SNVS_LPTGFCR_ETGF2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGFCR_ETGF2_EN_SHIFT)) & SNVS_LPTGFCR_ETGF2_EN_MASK) + +/*! @name LPTDCR - SNVS_LP Tamper Detectors Configuration Register */ +#define SNVS_LPTDCR_SRTCR_EN_MASK (0x2U) +#define SNVS_LPTDCR_SRTCR_EN_SHIFT (1U) +#define SNVS_LPTDCR_SRTCR_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_SRTCR_EN_SHIFT)) & SNVS_LPTDCR_SRTCR_EN_MASK) +#define SNVS_LPTDCR_MCR_EN_MASK (0x4U) +#define SNVS_LPTDCR_MCR_EN_SHIFT (2U) +#define SNVS_LPTDCR_MCR_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_MCR_EN_SHIFT)) & SNVS_LPTDCR_MCR_EN_MASK) +#define SNVS_LPTDCR_CT_EN_MASK (0x10U) +#define SNVS_LPTDCR_CT_EN_SHIFT (4U) +#define SNVS_LPTDCR_CT_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_CT_EN_SHIFT)) & SNVS_LPTDCR_CT_EN_MASK) +#define SNVS_LPTDCR_TT_EN_MASK (0x20U) +#define SNVS_LPTDCR_TT_EN_SHIFT (5U) +#define SNVS_LPTDCR_TT_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_TT_EN_SHIFT)) & SNVS_LPTDCR_TT_EN_MASK) +#define SNVS_LPTDCR_VT_EN_MASK (0x40U) +#define SNVS_LPTDCR_VT_EN_SHIFT (6U) +#define SNVS_LPTDCR_VT_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_VT_EN_SHIFT)) & SNVS_LPTDCR_VT_EN_MASK) +#define SNVS_LPTDCR_WMT1_EN_MASK (0x80U) +#define SNVS_LPTDCR_WMT1_EN_SHIFT (7U) +#define SNVS_LPTDCR_WMT1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_WMT1_EN_SHIFT)) & SNVS_LPTDCR_WMT1_EN_MASK) +#define SNVS_LPTDCR_WMT2_EN_MASK (0x100U) +#define SNVS_LPTDCR_WMT2_EN_SHIFT (8U) +#define SNVS_LPTDCR_WMT2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_WMT2_EN_SHIFT)) & SNVS_LPTDCR_WMT2_EN_MASK) +#define SNVS_LPTDCR_ET1_EN_MASK (0x200U) +#define SNVS_LPTDCR_ET1_EN_SHIFT (9U) +#define SNVS_LPTDCR_ET1_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET1_EN_SHIFT)) & SNVS_LPTDCR_ET1_EN_MASK) +#define SNVS_LPTDCR_ET2_EN_MASK (0x400U) +#define SNVS_LPTDCR_ET2_EN_SHIFT (10U) +#define SNVS_LPTDCR_ET2_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET2_EN_SHIFT)) & SNVS_LPTDCR_ET2_EN_MASK) +#define SNVS_LPTDCR_ET1P_MASK (0x800U) +#define SNVS_LPTDCR_ET1P_SHIFT (11U) +#define SNVS_LPTDCR_ET1P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET1P_SHIFT)) & SNVS_LPTDCR_ET1P_MASK) +#define SNVS_LPTDCR_ET2P_MASK (0x1000U) +#define SNVS_LPTDCR_ET2P_SHIFT (12U) +#define SNVS_LPTDCR_ET2P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_ET2P_SHIFT)) & SNVS_LPTDCR_ET2P_MASK) +#define SNVS_LPTDCR_PFD_OBSERV_MASK (0x4000U) +#define SNVS_LPTDCR_PFD_OBSERV_SHIFT (14U) +#define SNVS_LPTDCR_PFD_OBSERV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_PFD_OBSERV_SHIFT)) & SNVS_LPTDCR_PFD_OBSERV_MASK) +#define SNVS_LPTDCR_POR_OBSERV_MASK (0x8000U) +#define SNVS_LPTDCR_POR_OBSERV_SHIFT (15U) +#define SNVS_LPTDCR_POR_OBSERV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_POR_OBSERV_SHIFT)) & SNVS_LPTDCR_POR_OBSERV_MASK) +#define SNVS_LPTDCR_LTDC_MASK (0x70000U) +#define SNVS_LPTDCR_LTDC_SHIFT (16U) +#define SNVS_LPTDCR_LTDC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_LTDC_SHIFT)) & SNVS_LPTDCR_LTDC_MASK) +#define SNVS_LPTDCR_HTDC_MASK (0x700000U) +#define SNVS_LPTDCR_HTDC_SHIFT (20U) +#define SNVS_LPTDCR_HTDC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_HTDC_SHIFT)) & SNVS_LPTDCR_HTDC_MASK) +#define SNVS_LPTDCR_VRC_MASK (0x7000000U) +#define SNVS_LPTDCR_VRC_SHIFT (24U) +#define SNVS_LPTDCR_VRC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_VRC_SHIFT)) & SNVS_LPTDCR_VRC_MASK) +#define SNVS_LPTDCR_OSCB_MASK (0x10000000U) +#define SNVS_LPTDCR_OSCB_SHIFT (28U) +#define SNVS_LPTDCR_OSCB(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDCR_OSCB_SHIFT)) & SNVS_LPTDCR_OSCB_MASK) + +/*! @name LPSR - SNVS_LP Status Register */ +#define SNVS_LPSR_LPTA_MASK (0x1U) +#define SNVS_LPSR_LPTA_SHIFT (0U) +#define SNVS_LPSR_LPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPTA_SHIFT)) & SNVS_LPSR_LPTA_MASK) +#define SNVS_LPSR_SRTCR_MASK (0x2U) +#define SNVS_LPSR_SRTCR_SHIFT (1U) +#define SNVS_LPSR_SRTCR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SRTCR_SHIFT)) & SNVS_LPSR_SRTCR_MASK) +#define SNVS_LPSR_MCR_MASK (0x4U) +#define SNVS_LPSR_MCR_SHIFT (2U) +#define SNVS_LPSR_MCR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_MCR_SHIFT)) & SNVS_LPSR_MCR_MASK) +#define SNVS_LPSR_PGD_MASK (0x8U) +#define SNVS_LPSR_PGD_SHIFT (3U) +#define SNVS_LPSR_PGD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_PGD_SHIFT)) & SNVS_LPSR_PGD_MASK) +#define SNVS_LPSR_CTD_MASK (0x10U) +#define SNVS_LPSR_CTD_SHIFT (4U) +#define SNVS_LPSR_CTD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_CTD_SHIFT)) & SNVS_LPSR_CTD_MASK) +#define SNVS_LPSR_TTD_MASK (0x20U) +#define SNVS_LPSR_TTD_SHIFT (5U) +#define SNVS_LPSR_TTD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_TTD_SHIFT)) & SNVS_LPSR_TTD_MASK) +#define SNVS_LPSR_VTD_MASK (0x40U) +#define SNVS_LPSR_VTD_SHIFT (6U) +#define SNVS_LPSR_VTD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_VTD_SHIFT)) & SNVS_LPSR_VTD_MASK) +#define SNVS_LPSR_WMT1D_MASK (0x80U) +#define SNVS_LPSR_WMT1D_SHIFT (7U) +#define SNVS_LPSR_WMT1D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_WMT1D_SHIFT)) & SNVS_LPSR_WMT1D_MASK) +#define SNVS_LPSR_WMT2D_MASK (0x100U) +#define SNVS_LPSR_WMT2D_SHIFT (8U) +#define SNVS_LPSR_WMT2D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_WMT2D_SHIFT)) & SNVS_LPSR_WMT2D_MASK) +#define SNVS_LPSR_ET1D_MASK (0x200U) +#define SNVS_LPSR_ET1D_SHIFT (9U) +#define SNVS_LPSR_ET1D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_ET1D_SHIFT)) & SNVS_LPSR_ET1D_MASK) +#define SNVS_LPSR_ET2D_MASK (0x400U) +#define SNVS_LPSR_ET2D_SHIFT (10U) +#define SNVS_LPSR_ET2D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_ET2D_SHIFT)) & SNVS_LPSR_ET2D_MASK) +#define SNVS_LPSR_ESVD_MASK (0x10000U) +#define SNVS_LPSR_ESVD_SHIFT (16U) +#define SNVS_LPSR_ESVD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_ESVD_SHIFT)) & SNVS_LPSR_ESVD_MASK) +#define SNVS_LPSR_EO_MASK (0x20000U) +#define SNVS_LPSR_EO_SHIFT (17U) +#define SNVS_LPSR_EO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_EO_SHIFT)) & SNVS_LPSR_EO_MASK) +#define SNVS_LPSR_SPO_MASK (0x40000U) +#define SNVS_LPSR_SPO_SHIFT (18U) +#define SNVS_LPSR_SPO(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SPO_SHIFT)) & SNVS_LPSR_SPO_MASK) +#define SNVS_LPSR_SED_MASK (0x100000U) +#define SNVS_LPSR_SED_SHIFT (20U) +#define SNVS_LPSR_SED(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_SED_SHIFT)) & SNVS_LPSR_SED_MASK) +#define SNVS_LPSR_LPNS_MASK (0x40000000U) +#define SNVS_LPSR_LPNS_SHIFT (30U) +#define SNVS_LPSR_LPNS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPNS_SHIFT)) & SNVS_LPSR_LPNS_MASK) +#define SNVS_LPSR_LPS_MASK (0x80000000U) +#define SNVS_LPSR_LPS_SHIFT (31U) +#define SNVS_LPSR_LPS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSR_LPS_SHIFT)) & SNVS_LPSR_LPS_MASK) + +/*! @name LPSRTCMR - SNVS_LP Secure Real Time Counter MSB Register */ +#define SNVS_LPSRTCMR_SRTC_MASK (0x7FFFU) +#define SNVS_LPSRTCMR_SRTC_SHIFT (0U) +#define SNVS_LPSRTCMR_SRTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSRTCMR_SRTC_SHIFT)) & SNVS_LPSRTCMR_SRTC_MASK) + +/*! @name LPSRTCLR - SNVS_LP Secure Real Time Counter LSB Register */ +#define SNVS_LPSRTCLR_SRTC_MASK (0xFFFFFFFFU) +#define SNVS_LPSRTCLR_SRTC_SHIFT (0U) +#define SNVS_LPSRTCLR_SRTC(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSRTCLR_SRTC_SHIFT)) & SNVS_LPSRTCLR_SRTC_MASK) + +/*! @name LPTAR - SNVS_LP Time Alarm Register */ +#define SNVS_LPTAR_LPTA_MASK (0xFFFFFFFFU) +#define SNVS_LPTAR_LPTA_SHIFT (0U) +#define SNVS_LPTAR_LPTA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTAR_LPTA_SHIFT)) & SNVS_LPTAR_LPTA_MASK) + +/*! @name LPSMCMR - SNVS_LP Secure Monotonic Counter MSB Register */ +#define SNVS_LPSMCMR_MON_COUNTER_MASK (0xFFFFU) +#define SNVS_LPSMCMR_MON_COUNTER_SHIFT (0U) +#define SNVS_LPSMCMR_MON_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCMR_MON_COUNTER_SHIFT)) & SNVS_LPSMCMR_MON_COUNTER_MASK) +#define SNVS_LPSMCMR_MC_ERA_BITS_MASK (0xFFFF0000U) +#define SNVS_LPSMCMR_MC_ERA_BITS_SHIFT (16U) +#define SNVS_LPSMCMR_MC_ERA_BITS(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCMR_MC_ERA_BITS_SHIFT)) & SNVS_LPSMCMR_MC_ERA_BITS_MASK) + +/*! @name LPSMCLR - SNVS_LP Secure Monotonic Counter LSB Register */ +#define SNVS_LPSMCLR_MON_COUNTER_MASK (0xFFFFFFFFU) +#define SNVS_LPSMCLR_MON_COUNTER_SHIFT (0U) +#define SNVS_LPSMCLR_MON_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPSMCLR_MON_COUNTER_SHIFT)) & SNVS_LPSMCLR_MON_COUNTER_MASK) + +/*! @name LPPGDR - SNVS_LP Power Glitch Detector Register */ +#define SNVS_LPPGDR_PGD_MASK (0xFFFFFFFFU) +#define SNVS_LPPGDR_PGD_SHIFT (0U) +#define SNVS_LPPGDR_PGD(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPPGDR_PGD_SHIFT)) & SNVS_LPPGDR_PGD_MASK) + +/*! @name LPGPR0_LEGACY_ALIAS - SNVS_LP General Purpose Register 0 (legacy alias) */ +#define SNVS_LPGPR0_LEGACY_ALIAS_GPR_MASK (0xFFFFFFFFU) +#define SNVS_LPGPR0_LEGACY_ALIAS_GPR_SHIFT (0U) +#define SNVS_LPGPR0_LEGACY_ALIAS_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR0_LEGACY_ALIAS_GPR_SHIFT)) & SNVS_LPGPR0_LEGACY_ALIAS_GPR_MASK) + +/*! @name LPZMKR - SNVS_LP Zeroizable Master Key Register */ +#define SNVS_LPZMKR_ZMK_MASK (0xFFFFFFFFU) +#define SNVS_LPZMKR_ZMK_SHIFT (0U) +#define SNVS_LPZMKR_ZMK(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPZMKR_ZMK_SHIFT)) & SNVS_LPZMKR_ZMK_MASK) + +/* The count of SNVS_LPZMKR */ +#define SNVS_LPZMKR_COUNT (8U) + +/*! @name LPGPR_ALIAS - SNVS_LP General Purpose Registers 0 .. 3 */ +#define SNVS_LPGPR_ALIAS_GPR_MASK (0xFFFFFFFFU) +#define SNVS_LPGPR_ALIAS_GPR_SHIFT (0U) +#define SNVS_LPGPR_ALIAS_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR_ALIAS_GPR_SHIFT)) & SNVS_LPGPR_ALIAS_GPR_MASK) + +/* The count of SNVS_LPGPR_ALIAS */ +#define SNVS_LPGPR_ALIAS_COUNT (4U) + +/*! @name LPTDC2R - SNVS_LP Tamper Detectors Config 2 Register */ +#define SNVS_LPTDC2R_ET3_EN_MASK (0x1U) +#define SNVS_LPTDC2R_ET3_EN_SHIFT (0U) +#define SNVS_LPTDC2R_ET3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET3_EN_SHIFT)) & SNVS_LPTDC2R_ET3_EN_MASK) +#define SNVS_LPTDC2R_ET4_EN_MASK (0x2U) +#define SNVS_LPTDC2R_ET4_EN_SHIFT (1U) +#define SNVS_LPTDC2R_ET4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET4_EN_SHIFT)) & SNVS_LPTDC2R_ET4_EN_MASK) +#define SNVS_LPTDC2R_ET5_EN_MASK (0x4U) +#define SNVS_LPTDC2R_ET5_EN_SHIFT (2U) +#define SNVS_LPTDC2R_ET5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET5_EN_SHIFT)) & SNVS_LPTDC2R_ET5_EN_MASK) +#define SNVS_LPTDC2R_ET6_EN_MASK (0x8U) +#define SNVS_LPTDC2R_ET6_EN_SHIFT (3U) +#define SNVS_LPTDC2R_ET6_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET6_EN_SHIFT)) & SNVS_LPTDC2R_ET6_EN_MASK) +#define SNVS_LPTDC2R_ET7_EN_MASK (0x10U) +#define SNVS_LPTDC2R_ET7_EN_SHIFT (4U) +#define SNVS_LPTDC2R_ET7_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET7_EN_SHIFT)) & SNVS_LPTDC2R_ET7_EN_MASK) +#define SNVS_LPTDC2R_ET8_EN_MASK (0x20U) +#define SNVS_LPTDC2R_ET8_EN_SHIFT (5U) +#define SNVS_LPTDC2R_ET8_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET8_EN_SHIFT)) & SNVS_LPTDC2R_ET8_EN_MASK) +#define SNVS_LPTDC2R_ET9_EN_MASK (0x40U) +#define SNVS_LPTDC2R_ET9_EN_SHIFT (6U) +#define SNVS_LPTDC2R_ET9_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET9_EN_SHIFT)) & SNVS_LPTDC2R_ET9_EN_MASK) +#define SNVS_LPTDC2R_ET10_EN_MASK (0x80U) +#define SNVS_LPTDC2R_ET10_EN_SHIFT (7U) +#define SNVS_LPTDC2R_ET10_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET10_EN_SHIFT)) & SNVS_LPTDC2R_ET10_EN_MASK) +#define SNVS_LPTDC2R_ET3P_MASK (0x10000U) +#define SNVS_LPTDC2R_ET3P_SHIFT (16U) +#define SNVS_LPTDC2R_ET3P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET3P_SHIFT)) & SNVS_LPTDC2R_ET3P_MASK) +#define SNVS_LPTDC2R_ET4P_MASK (0x20000U) +#define SNVS_LPTDC2R_ET4P_SHIFT (17U) +#define SNVS_LPTDC2R_ET4P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET4P_SHIFT)) & SNVS_LPTDC2R_ET4P_MASK) +#define SNVS_LPTDC2R_ET5P_MASK (0x40000U) +#define SNVS_LPTDC2R_ET5P_SHIFT (18U) +#define SNVS_LPTDC2R_ET5P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET5P_SHIFT)) & SNVS_LPTDC2R_ET5P_MASK) +#define SNVS_LPTDC2R_ET6P_MASK (0x80000U) +#define SNVS_LPTDC2R_ET6P_SHIFT (19U) +#define SNVS_LPTDC2R_ET6P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET6P_SHIFT)) & SNVS_LPTDC2R_ET6P_MASK) +#define SNVS_LPTDC2R_ET7P_MASK (0x100000U) +#define SNVS_LPTDC2R_ET7P_SHIFT (20U) +#define SNVS_LPTDC2R_ET7P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET7P_SHIFT)) & SNVS_LPTDC2R_ET7P_MASK) +#define SNVS_LPTDC2R_ET8P_MASK (0x200000U) +#define SNVS_LPTDC2R_ET8P_SHIFT (21U) +#define SNVS_LPTDC2R_ET8P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET8P_SHIFT)) & SNVS_LPTDC2R_ET8P_MASK) +#define SNVS_LPTDC2R_ET9P_MASK (0x400000U) +#define SNVS_LPTDC2R_ET9P_SHIFT (22U) +#define SNVS_LPTDC2R_ET9P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET9P_SHIFT)) & SNVS_LPTDC2R_ET9P_MASK) +#define SNVS_LPTDC2R_ET10P_MASK (0x800000U) +#define SNVS_LPTDC2R_ET10P_SHIFT (23U) +#define SNVS_LPTDC2R_ET10P(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDC2R_ET10P_SHIFT)) & SNVS_LPTDC2R_ET10P_MASK) + +/*! @name LPTDSR - SNVS_LP Tamper Detectors Status Register */ +#define SNVS_LPTDSR_ET3D_MASK (0x1U) +#define SNVS_LPTDSR_ET3D_SHIFT (0U) +#define SNVS_LPTDSR_ET3D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET3D_SHIFT)) & SNVS_LPTDSR_ET3D_MASK) +#define SNVS_LPTDSR_ET4D_MASK (0x2U) +#define SNVS_LPTDSR_ET4D_SHIFT (1U) +#define SNVS_LPTDSR_ET4D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET4D_SHIFT)) & SNVS_LPTDSR_ET4D_MASK) +#define SNVS_LPTDSR_ET5D_MASK (0x4U) +#define SNVS_LPTDSR_ET5D_SHIFT (2U) +#define SNVS_LPTDSR_ET5D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET5D_SHIFT)) & SNVS_LPTDSR_ET5D_MASK) +#define SNVS_LPTDSR_ET6D_MASK (0x8U) +#define SNVS_LPTDSR_ET6D_SHIFT (3U) +#define SNVS_LPTDSR_ET6D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET6D_SHIFT)) & SNVS_LPTDSR_ET6D_MASK) +#define SNVS_LPTDSR_ET7D_MASK (0x10U) +#define SNVS_LPTDSR_ET7D_SHIFT (4U) +#define SNVS_LPTDSR_ET7D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET7D_SHIFT)) & SNVS_LPTDSR_ET7D_MASK) +#define SNVS_LPTDSR_ET8D_MASK (0x20U) +#define SNVS_LPTDSR_ET8D_SHIFT (5U) +#define SNVS_LPTDSR_ET8D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET8D_SHIFT)) & SNVS_LPTDSR_ET8D_MASK) +#define SNVS_LPTDSR_ET9D_MASK (0x40U) +#define SNVS_LPTDSR_ET9D_SHIFT (6U) +#define SNVS_LPTDSR_ET9D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET9D_SHIFT)) & SNVS_LPTDSR_ET9D_MASK) +#define SNVS_LPTDSR_ET10D_MASK (0x80U) +#define SNVS_LPTDSR_ET10D_SHIFT (7U) +#define SNVS_LPTDSR_ET10D(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTDSR_ET10D_SHIFT)) & SNVS_LPTDSR_ET10D_MASK) + +/*! @name LPTGF1CR - SNVS_LP Tamper Glitch Filter 1 Configuration Register */ +#define SNVS_LPTGF1CR_ETGF3_MASK (0x7FU) +#define SNVS_LPTGF1CR_ETGF3_SHIFT (0U) +#define SNVS_LPTGF1CR_ETGF3(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF3_SHIFT)) & SNVS_LPTGF1CR_ETGF3_MASK) +#define SNVS_LPTGF1CR_ETGF3_EN_MASK (0x80U) +#define SNVS_LPTGF1CR_ETGF3_EN_SHIFT (7U) +#define SNVS_LPTGF1CR_ETGF3_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF3_EN_SHIFT)) & SNVS_LPTGF1CR_ETGF3_EN_MASK) +#define SNVS_LPTGF1CR_ETGF4_MASK (0x7F00U) +#define SNVS_LPTGF1CR_ETGF4_SHIFT (8U) +#define SNVS_LPTGF1CR_ETGF4(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF4_SHIFT)) & SNVS_LPTGF1CR_ETGF4_MASK) +#define SNVS_LPTGF1CR_ETGF4_EN_MASK (0x8000U) +#define SNVS_LPTGF1CR_ETGF4_EN_SHIFT (15U) +#define SNVS_LPTGF1CR_ETGF4_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF4_EN_SHIFT)) & SNVS_LPTGF1CR_ETGF4_EN_MASK) +#define SNVS_LPTGF1CR_ETGF5_MASK (0x7F0000U) +#define SNVS_LPTGF1CR_ETGF5_SHIFT (16U) +#define SNVS_LPTGF1CR_ETGF5(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF5_SHIFT)) & SNVS_LPTGF1CR_ETGF5_MASK) +#define SNVS_LPTGF1CR_ETGF5_EN_MASK (0x800000U) +#define SNVS_LPTGF1CR_ETGF5_EN_SHIFT (23U) +#define SNVS_LPTGF1CR_ETGF5_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF5_EN_SHIFT)) & SNVS_LPTGF1CR_ETGF5_EN_MASK) +#define SNVS_LPTGF1CR_ETGF6_MASK (0x7F000000U) +#define SNVS_LPTGF1CR_ETGF6_SHIFT (24U) +#define SNVS_LPTGF1CR_ETGF6(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF6_SHIFT)) & SNVS_LPTGF1CR_ETGF6_MASK) +#define SNVS_LPTGF1CR_ETGF6_EN_MASK (0x80000000U) +#define SNVS_LPTGF1CR_ETGF6_EN_SHIFT (31U) +#define SNVS_LPTGF1CR_ETGF6_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF1CR_ETGF6_EN_SHIFT)) & SNVS_LPTGF1CR_ETGF6_EN_MASK) + +/*! @name LPTGF2CR - SNVS_LP Tamper Glitch Filter 2 Configuration Register */ +#define SNVS_LPTGF2CR_ETGF7_MASK (0x7FU) +#define SNVS_LPTGF2CR_ETGF7_SHIFT (0U) +#define SNVS_LPTGF2CR_ETGF7(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF7_SHIFT)) & SNVS_LPTGF2CR_ETGF7_MASK) +#define SNVS_LPTGF2CR_ETGF7_EN_MASK (0x80U) +#define SNVS_LPTGF2CR_ETGF7_EN_SHIFT (7U) +#define SNVS_LPTGF2CR_ETGF7_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF7_EN_SHIFT)) & SNVS_LPTGF2CR_ETGF7_EN_MASK) +#define SNVS_LPTGF2CR_ETGF8_MASK (0x7F00U) +#define SNVS_LPTGF2CR_ETGF8_SHIFT (8U) +#define SNVS_LPTGF2CR_ETGF8(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF8_SHIFT)) & SNVS_LPTGF2CR_ETGF8_MASK) +#define SNVS_LPTGF2CR_ETGF8_EN_MASK (0x8000U) +#define SNVS_LPTGF2CR_ETGF8_EN_SHIFT (15U) +#define SNVS_LPTGF2CR_ETGF8_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF8_EN_SHIFT)) & SNVS_LPTGF2CR_ETGF8_EN_MASK) +#define SNVS_LPTGF2CR_ETGF9_MASK (0x7F0000U) +#define SNVS_LPTGF2CR_ETGF9_SHIFT (16U) +#define SNVS_LPTGF2CR_ETGF9(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF9_SHIFT)) & SNVS_LPTGF2CR_ETGF9_MASK) +#define SNVS_LPTGF2CR_ETGF9_EN_MASK (0x800000U) +#define SNVS_LPTGF2CR_ETGF9_EN_SHIFT (23U) +#define SNVS_LPTGF2CR_ETGF9_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF9_EN_SHIFT)) & SNVS_LPTGF2CR_ETGF9_EN_MASK) +#define SNVS_LPTGF2CR_ETGF10_MASK (0x7F000000U) +#define SNVS_LPTGF2CR_ETGF10_SHIFT (24U) +#define SNVS_LPTGF2CR_ETGF10(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF10_SHIFT)) & SNVS_LPTGF2CR_ETGF10_MASK) +#define SNVS_LPTGF2CR_ETGF10_EN_MASK (0x80000000U) +#define SNVS_LPTGF2CR_ETGF10_EN_SHIFT (31U) +#define SNVS_LPTGF2CR_ETGF10_EN(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPTGF2CR_ETGF10_EN_SHIFT)) & SNVS_LPTGF2CR_ETGF10_EN_MASK) + +/*! @name LPGPR - SNVS_LP General Purpose Registers 0 .. 7 */ +#define SNVS_LPGPR_GPR_MASK (0xFFFFFFFFU) +#define SNVS_LPGPR_GPR_SHIFT (0U) +#define SNVS_LPGPR_GPR(x) (((uint32_t)(((uint32_t)(x)) << SNVS_LPGPR_GPR_SHIFT)) & SNVS_LPGPR_GPR_MASK) + +/* The count of SNVS_LPGPR */ +#define SNVS_LPGPR_COUNT (8U) + +/*! @name HPVIDR1 - SNVS_HP Version ID Register 1 */ +#define SNVS_HPVIDR1_MINOR_REV_MASK (0xFFU) +#define SNVS_HPVIDR1_MINOR_REV_SHIFT (0U) +#define SNVS_HPVIDR1_MINOR_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_MINOR_REV_SHIFT)) & SNVS_HPVIDR1_MINOR_REV_MASK) +#define SNVS_HPVIDR1_MAJOR_REV_MASK (0xFF00U) +#define SNVS_HPVIDR1_MAJOR_REV_SHIFT (8U) +#define SNVS_HPVIDR1_MAJOR_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_MAJOR_REV_SHIFT)) & SNVS_HPVIDR1_MAJOR_REV_MASK) +#define SNVS_HPVIDR1_IP_ID_MASK (0xFFFF0000U) +#define SNVS_HPVIDR1_IP_ID_SHIFT (16U) +#define SNVS_HPVIDR1_IP_ID(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR1_IP_ID_SHIFT)) & SNVS_HPVIDR1_IP_ID_MASK) + +/*! @name HPVIDR2 - SNVS_HP Version ID Register 2 */ +#define SNVS_HPVIDR2_CONFIG_OPT_MASK (0xFFU) +#define SNVS_HPVIDR2_CONFIG_OPT_SHIFT (0U) +#define SNVS_HPVIDR2_CONFIG_OPT(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_CONFIG_OPT_SHIFT)) & SNVS_HPVIDR2_CONFIG_OPT_MASK) +#define SNVS_HPVIDR2_ECO_REV_MASK (0xFF00U) +#define SNVS_HPVIDR2_ECO_REV_SHIFT (8U) +#define SNVS_HPVIDR2_ECO_REV(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_ECO_REV_SHIFT)) & SNVS_HPVIDR2_ECO_REV_MASK) +#define SNVS_HPVIDR2_INTG_OPT_MASK (0xFF0000U) +#define SNVS_HPVIDR2_INTG_OPT_SHIFT (16U) +#define SNVS_HPVIDR2_INTG_OPT(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_INTG_OPT_SHIFT)) & SNVS_HPVIDR2_INTG_OPT_MASK) +#define SNVS_HPVIDR2_IP_ERA_MASK (0xFF000000U) +#define SNVS_HPVIDR2_IP_ERA_SHIFT (24U) +#define SNVS_HPVIDR2_IP_ERA(x) (((uint32_t)(((uint32_t)(x)) << SNVS_HPVIDR2_IP_ERA_SHIFT)) & SNVS_HPVIDR2_IP_ERA_MASK) + + +/*! + * @} + */ /* end of group SNVS_Register_Masks */ + + +/* SNVS - Peripheral instance base addresses */ +/** Peripheral SNVS base pointer */ +#define SNVS ((SNVS_Type *)SNVS_BASE) +/** Array initializer of SNVS peripheral base addresses */ +#define SNVS_BASE_ADDRS { SNVS_BASE } +/** Array initializer of SNVS peripheral base pointers */ +#define SNVS_BASE_PTRS { SNVS } +/** Interrupt vectors for the SNVS peripheral type */ +#define SNVS_IRQS { SNVS_IRQn } + +/*! + * @} + */ /* end of group SNVS_Peripheral_Access_Layer */ + + +#endif /* HW_SNVS_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_stc.h b/platform/devices/MX8/MX8_stc.h new file mode 100755 index 0000000..f98793f --- /dev/null +++ b/platform/devices/MX8/MX8_stc.h @@ -0,0 +1,385 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file stc.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for stc + * + * CMSIS Peripheral Access Layer for stc + */ + +#ifndef STC_H +#define STC_H /**< Symbol preventing repeated inclusion */ + + +/* ---------------------------------------------------------------------------- + -- STC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup STC_Peripheral_Access_Layer STC Peripheral Access Layer + * @{ + */ + +/** STC - Register Layout Typedef */ +typedef struct { + __IO uint32_t INTERLEAVE_SEL; /**< Interleave Select, offset: 0x0 */ + uint8_t RESERVED_0[12]; + __I uint32_t RVSD_HPR_ENABLE; /**< Highest Priority Request scheduler enable, offset: 0x10 */ + uint8_t RESERVED_1[12]; + __IO uint32_t UD_ENABLE; /**< Underrun Detection Enable, offset: 0x20 */ + uint8_t RESERVED_2[12]; + __IO uint32_t TDM_ENABLE; /**< TDM Function Enable, offset: 0x30 */ + uint8_t RESERVED_3[12]; + __IO uint32_t TDM_ALWAYS_ALLOW; /**< TDM Always Allow, offset: 0x40 */ + uint8_t RESERVED_4[12]; + __IO uint32_t GLB_CSCHED_WAIT_COUNT; /**< Global Completion Scheduler Wait Count, offset: 0x50 */ + uint8_t RESERVED_5[12]; + __IO uint32_t MASK_ID[8]; /**< MASK for the AxID Hash Function, array offset: 0x60, array step: 0x4 */ + __IO uint32_t COMPARE_ID[8]; /**< COMPARE ID for the AxID Hash Function, array offset: 0x80, array step: 0x4 */ + __IO uint32_t MIN_QOS[8]; /**< Minimum QoS Clamp, array offset: 0xA0, array step: 0x4 */ + __IO uint32_t MAX_QOS[8]; /**< Maximum QOS Clamp, array offset: 0xC0, array step: 0x4 */ + uint8_t RESERVED_6[32]; + __IO uint32_t PANIC_QOS_OFFSET[8]; /**< Panic QoS Offset value, array offset: 0x100, array step: 0x4 */ + __IO uint32_t HPR_QOS_OFFSET[8]; /**< Highest Priority QoS Offset value, array offset: 0x120, array step: 0x4 */ + __IO uint32_t UD_QOS_OFFSET[8]; /**< Underrun Detect QoS Offset value, array offset: 0x140, array step: 0x4 */ + __IO uint32_t UD_COUNT_DECR_VALUE[8]; /**< Decrement value of under run counter., array offset: 0x160, array step: 0x4 */ + __IO uint32_t UD_COUNT_THRESH_1[8]; /**< Underrun counter threshold 1, array offset: 0x180, array step: 0x4 */ + uint8_t RESERVED_7[96]; + __IO uint32_t UD_COUNT_THRESH_2[8]; /**< Underrun counter threshold 2, array offset: 0x200, array step: 0x4 */ + __IO uint32_t CSCHED_WAIT_COUNT[8]; /**< Category Completion Scheduler wait count for completion returns, array offset: 0x220, array step: 0x4 */ + uint8_t RESERVED_8[32]; + __IO uint32_t TDM_QOS_OFFSET[8]; /**< TDM QoS OFFSET, array offset: 0x260, array step: 0x4 */ + uint8_t RESERVED_9[128]; + __IO uint32_t TDM_START0_COUNT[8]; /**< Time Division Multiplexed Start0 count, array offset: 0x300, array step: 0x4 */ + __IO uint32_t TDM_STOP0_COUNT[8]; /**< Time Division Multiplexed stop0 count, array offset: 0x320, array step: 0x4 */ + __IO uint32_t TDM_START1_COUNT[8]; /**< Time Division Multiplexed start1 count, array offset: 0x340, array step: 0x4 */ + __IO uint32_t TDM_STOP1_COUNT[8]; /**< Time Division Multiplexed stop1 count, array offset: 0x360, array step: 0x4 */ + __IO uint32_t TDM_START2_COUNT[8]; /**< Time Division Multiplexed start2 count, array offset: 0x380, array step: 0x4 */ + __IO uint32_t TDM_STOP2_COUNT[8]; /**< Time Division Multiplexed stop2 count, array offset: 0x3A0, array step: 0x4 */ + __IO uint32_t TDM_START3_COUNT[8]; /**< Time Division Multiplexed start3 count, array offset: 0x3C0, array step: 0x4 */ + __IO uint32_t TDM_STOP3_COUNT[8]; /**< Time Division Multiplexed stop3 count, array offset: 0x3E0, array step: 0x4 */ +} STC_Type; + +/* ---------------------------------------------------------------------------- + -- STC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup STC_Register_Masks STC Register Masks + * @{ + */ + +/*! @name INTERLEAVE_SEL - Interleave Select */ +#define STC_INTERLEAVE_SEL_INTERLEAVE_SEL_MASK (0x3U) +#define STC_INTERLEAVE_SEL_INTERLEAVE_SEL_SHIFT (0U) +#define STC_INTERLEAVE_SEL_INTERLEAVE_SEL(x) (((uint32_t)(((uint32_t)(x)) << STC_INTERLEAVE_SEL_INTERLEAVE_SEL_SHIFT)) & STC_INTERLEAVE_SEL_INTERLEAVE_SEL_MASK) + +/*! @name UD_ENABLE - Underrun Detection Enable */ +#define STC_UD_ENABLE_UD_ENABLE_MASK (0xFFU) +#define STC_UD_ENABLE_UD_ENABLE_SHIFT (0U) +#define STC_UD_ENABLE_UD_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << STC_UD_ENABLE_UD_ENABLE_SHIFT)) & STC_UD_ENABLE_UD_ENABLE_MASK) + +/*! @name TDM_ENABLE - TDM Function Enable */ +#define STC_TDM_ENABLE_TDM_ENABLE_MASK (0xFFU) +#define STC_TDM_ENABLE_TDM_ENABLE_SHIFT (0U) +#define STC_TDM_ENABLE_TDM_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_ENABLE_TDM_ENABLE_SHIFT)) & STC_TDM_ENABLE_TDM_ENABLE_MASK) + +/*! @name TDM_ALWAYS_ALLOW - TDM Always Allow */ +#define STC_TDM_ALWAYS_ALLOW_TDM_ALWAYS_ALLOW_MASK (0xFFU) +#define STC_TDM_ALWAYS_ALLOW_TDM_ALWAYS_ALLOW_SHIFT (0U) +#define STC_TDM_ALWAYS_ALLOW_TDM_ALWAYS_ALLOW(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_ALWAYS_ALLOW_TDM_ALWAYS_ALLOW_SHIFT)) & STC_TDM_ALWAYS_ALLOW_TDM_ALWAYS_ALLOW_MASK) + +/*! @name GLB_CSCHED_WAIT_COUNT - Global Completion Scheduler Wait Count */ +#define STC_GLB_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_MASK (0x7U) +#define STC_GLB_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_SHIFT (0U) +#define STC_GLB_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_GLB_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_SHIFT)) & STC_GLB_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_MASK) + +/*! @name MASK_ID - MASK for the AxID Hash Function */ +#define STC_MASK_ID_MASK_ID_MASK (0xFFFU) +#define STC_MASK_ID_MASK_ID_SHIFT (0U) +#define STC_MASK_ID_MASK_ID(x) (((uint32_t)(((uint32_t)(x)) << STC_MASK_ID_MASK_ID_SHIFT)) & STC_MASK_ID_MASK_ID_MASK) + +/* The count of STC_MASK_ID */ +#define STC_MASK_ID_COUNT (8U) + +/*! @name COMPARE_ID - COMPARE ID for the AxID Hash Function */ +#define STC_COMPARE_ID_COMPARE_ID_MASK (0xFFFU) +#define STC_COMPARE_ID_COMPARE_ID_SHIFT (0U) +#define STC_COMPARE_ID_COMPARE_ID(x) (((uint32_t)(((uint32_t)(x)) << STC_COMPARE_ID_COMPARE_ID_SHIFT)) & STC_COMPARE_ID_COMPARE_ID_MASK) + +/* The count of STC_COMPARE_ID */ +#define STC_COMPARE_ID_COUNT (8U) + +/*! @name MIN_QOS - Minimum QoS Clamp */ +#define STC_MIN_QOS_MIN_QOS_MASK (0xFU) +#define STC_MIN_QOS_MIN_QOS_SHIFT (0U) +#define STC_MIN_QOS_MIN_QOS(x) (((uint32_t)(((uint32_t)(x)) << STC_MIN_QOS_MIN_QOS_SHIFT)) & STC_MIN_QOS_MIN_QOS_MASK) + +/* The count of STC_MIN_QOS */ +#define STC_MIN_QOS_COUNT (8U) + +/*! @name MAX_QOS - Maximum QOS Clamp */ +#define STC_MAX_QOS_MAX_QOS_MASK (0xFU) +#define STC_MAX_QOS_MAX_QOS_SHIFT (0U) +#define STC_MAX_QOS_MAX_QOS(x) (((uint32_t)(((uint32_t)(x)) << STC_MAX_QOS_MAX_QOS_SHIFT)) & STC_MAX_QOS_MAX_QOS_MASK) + +/* The count of STC_MAX_QOS */ +#define STC_MAX_QOS_COUNT (8U) + +/*! @name PANIC_QOS_OFFSET - Panic QoS Offset value */ +#define STC_PANIC_QOS_OFFSET_PANIC_QOS_OFFSET_MASK (0xFU) +#define STC_PANIC_QOS_OFFSET_PANIC_QOS_OFFSET_SHIFT (0U) +#define STC_PANIC_QOS_OFFSET_PANIC_QOS_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << STC_PANIC_QOS_OFFSET_PANIC_QOS_OFFSET_SHIFT)) & STC_PANIC_QOS_OFFSET_PANIC_QOS_OFFSET_MASK) + +/* The count of STC_PANIC_QOS_OFFSET */ +#define STC_PANIC_QOS_OFFSET_COUNT (8U) + +/*! @name HPR_QOS_OFFSET - Highest Priority QoS Offset value */ +#define STC_HPR_QOS_OFFSET_HPR_QOS_OFFSET_MASK (0xFU) +#define STC_HPR_QOS_OFFSET_HPR_QOS_OFFSET_SHIFT (0U) +#define STC_HPR_QOS_OFFSET_HPR_QOS_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << STC_HPR_QOS_OFFSET_HPR_QOS_OFFSET_SHIFT)) & STC_HPR_QOS_OFFSET_HPR_QOS_OFFSET_MASK) + +/* The count of STC_HPR_QOS_OFFSET */ +#define STC_HPR_QOS_OFFSET_COUNT (8U) + +/*! @name UD_QOS_OFFSET - Underrun Detect QoS Offset value */ +#define STC_UD_QOS_OFFSET_UD_QOS_OFFSET_MASK (0xFU) +#define STC_UD_QOS_OFFSET_UD_QOS_OFFSET_SHIFT (0U) +#define STC_UD_QOS_OFFSET_UD_QOS_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << STC_UD_QOS_OFFSET_UD_QOS_OFFSET_SHIFT)) & STC_UD_QOS_OFFSET_UD_QOS_OFFSET_MASK) + +/* The count of STC_UD_QOS_OFFSET */ +#define STC_UD_QOS_OFFSET_COUNT (8U) + +/*! @name UD_COUNT_DECR_VALUE - Decrement value of under run counter. */ +#define STC_UD_COUNT_DECR_VALUE_UD_COUNT_DECR_VALUE_MASK (0x7FU) +#define STC_UD_COUNT_DECR_VALUE_UD_COUNT_DECR_VALUE_SHIFT (0U) +#define STC_UD_COUNT_DECR_VALUE_UD_COUNT_DECR_VALUE(x) (((uint32_t)(((uint32_t)(x)) << STC_UD_COUNT_DECR_VALUE_UD_COUNT_DECR_VALUE_SHIFT)) & STC_UD_COUNT_DECR_VALUE_UD_COUNT_DECR_VALUE_MASK) + +/* The count of STC_UD_COUNT_DECR_VALUE */ +#define STC_UD_COUNT_DECR_VALUE_COUNT (8U) + +/*! @name UD_COUNT_THRESH_1 - Underrun counter threshold 1 */ +#define STC_UD_COUNT_THRESH_1_UD_COUNT_THRESH_1_MASK (0x7FU) +#define STC_UD_COUNT_THRESH_1_UD_COUNT_THRESH_1_SHIFT (0U) +#define STC_UD_COUNT_THRESH_1_UD_COUNT_THRESH_1(x) (((uint32_t)(((uint32_t)(x)) << STC_UD_COUNT_THRESH_1_UD_COUNT_THRESH_1_SHIFT)) & STC_UD_COUNT_THRESH_1_UD_COUNT_THRESH_1_MASK) + +/* The count of STC_UD_COUNT_THRESH_1 */ +#define STC_UD_COUNT_THRESH_1_COUNT (8U) + +/*! @name UD_COUNT_THRESH_2 - Underrun counter threshold 2 */ +#define STC_UD_COUNT_THRESH_2_UD_COUNT_THRESH_2_MASK (0x7FU) +#define STC_UD_COUNT_THRESH_2_UD_COUNT_THRESH_2_SHIFT (0U) +#define STC_UD_COUNT_THRESH_2_UD_COUNT_THRESH_2(x) (((uint32_t)(((uint32_t)(x)) << STC_UD_COUNT_THRESH_2_UD_COUNT_THRESH_2_SHIFT)) & STC_UD_COUNT_THRESH_2_UD_COUNT_THRESH_2_MASK) + +/* The count of STC_UD_COUNT_THRESH_2 */ +#define STC_UD_COUNT_THRESH_2_COUNT (8U) + +/*! @name CSCHED_WAIT_COUNT - Category Completion Scheduler wait count for completion returns */ +#define STC_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_MASK (0x3FU) +#define STC_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_SHIFT (0U) +#define STC_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_SHIFT)) & STC_CSCHED_WAIT_COUNT_CSCHED_WAIT_COUNT_MASK) + +/* The count of STC_CSCHED_WAIT_COUNT */ +#define STC_CSCHED_WAIT_COUNT_COUNT (8U) + +/*! @name TDM_QOS_OFFSET - TDM QoS OFFSET */ +#define STC_TDM_QOS_OFFSET_TDM_QOS_OFFSET_MASK (0xFU) +#define STC_TDM_QOS_OFFSET_TDM_QOS_OFFSET_SHIFT (0U) +#define STC_TDM_QOS_OFFSET_TDM_QOS_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_QOS_OFFSET_TDM_QOS_OFFSET_SHIFT)) & STC_TDM_QOS_OFFSET_TDM_QOS_OFFSET_MASK) + +/* The count of STC_TDM_QOS_OFFSET */ +#define STC_TDM_QOS_OFFSET_COUNT (8U) + +/*! @name TDM_START0_COUNT - Time Division Multiplexed Start0 count */ +#define STC_TDM_START0_COUNT_TDM_START_COUNT_MASK (0x7FU) +#define STC_TDM_START0_COUNT_TDM_START_COUNT_SHIFT (0U) +#define STC_TDM_START0_COUNT_TDM_START_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_START0_COUNT_TDM_START_COUNT_SHIFT)) & STC_TDM_START0_COUNT_TDM_START_COUNT_MASK) + +/* The count of STC_TDM_START0_COUNT */ +#define STC_TDM_START0_COUNT_COUNT (8U) + +/*! @name TDM_STOP0_COUNT - Time Division Multiplexed stop0 count */ +#define STC_TDM_STOP0_COUNT_TDM_STOP_COUNT_MASK (0x7FU) +#define STC_TDM_STOP0_COUNT_TDM_STOP_COUNT_SHIFT (0U) +#define STC_TDM_STOP0_COUNT_TDM_STOP_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_STOP0_COUNT_TDM_STOP_COUNT_SHIFT)) & STC_TDM_STOP0_COUNT_TDM_STOP_COUNT_MASK) + +/* The count of STC_TDM_STOP0_COUNT */ +#define STC_TDM_STOP0_COUNT_COUNT (8U) + +/*! @name TDM_START1_COUNT - Time Division Multiplexed start1 count */ +#define STC_TDM_START1_COUNT_TDM_START_COUNT_MASK (0x7FU) +#define STC_TDM_START1_COUNT_TDM_START_COUNT_SHIFT (0U) +#define STC_TDM_START1_COUNT_TDM_START_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_START1_COUNT_TDM_START_COUNT_SHIFT)) & STC_TDM_START1_COUNT_TDM_START_COUNT_MASK) + +/* The count of STC_TDM_START1_COUNT */ +#define STC_TDM_START1_COUNT_COUNT (8U) + +/*! @name TDM_STOP1_COUNT - Time Division Multiplexed stop1 count */ +#define STC_TDM_STOP1_COUNT_TDM_STOP_COUNT_MASK (0x7FU) +#define STC_TDM_STOP1_COUNT_TDM_STOP_COUNT_SHIFT (0U) +#define STC_TDM_STOP1_COUNT_TDM_STOP_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_STOP1_COUNT_TDM_STOP_COUNT_SHIFT)) & STC_TDM_STOP1_COUNT_TDM_STOP_COUNT_MASK) + +/* The count of STC_TDM_STOP1_COUNT */ +#define STC_TDM_STOP1_COUNT_COUNT (8U) + +/*! @name TDM_START2_COUNT - Time Division Multiplexed start2 count */ +#define STC_TDM_START2_COUNT_TDM_START_COUNT_MASK (0x7FU) +#define STC_TDM_START2_COUNT_TDM_START_COUNT_SHIFT (0U) +#define STC_TDM_START2_COUNT_TDM_START_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_START2_COUNT_TDM_START_COUNT_SHIFT)) & STC_TDM_START2_COUNT_TDM_START_COUNT_MASK) + +/* The count of STC_TDM_START2_COUNT */ +#define STC_TDM_START2_COUNT_COUNT (8U) + +/*! @name TDM_STOP2_COUNT - Time Division Multiplexed stop2 count */ +#define STC_TDM_STOP2_COUNT_TDM_STOP_COUNT_MASK (0x7FU) +#define STC_TDM_STOP2_COUNT_TDM_STOP_COUNT_SHIFT (0U) +#define STC_TDM_STOP2_COUNT_TDM_STOP_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_STOP2_COUNT_TDM_STOP_COUNT_SHIFT)) & STC_TDM_STOP2_COUNT_TDM_STOP_COUNT_MASK) + +/* The count of STC_TDM_STOP2_COUNT */ +#define STC_TDM_STOP2_COUNT_COUNT (8U) + +/*! @name TDM_START3_COUNT - Time Division Multiplexed start3 count */ +#define STC_TDM_START3_COUNT_TDM_START_COUNT_MASK (0x7FU) +#define STC_TDM_START3_COUNT_TDM_START_COUNT_SHIFT (0U) +#define STC_TDM_START3_COUNT_TDM_START_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_START3_COUNT_TDM_START_COUNT_SHIFT)) & STC_TDM_START3_COUNT_TDM_START_COUNT_MASK) + +/* The count of STC_TDM_START3_COUNT */ +#define STC_TDM_START3_COUNT_COUNT (8U) + +/*! @name TDM_STOP3_COUNT - Time Division Multiplexed stop3 count */ +#define STC_TDM_STOP3_COUNT_TDM_STOP_COUNT_MASK (0x7FU) +#define STC_TDM_STOP3_COUNT_TDM_STOP_COUNT_SHIFT (0U) +#define STC_TDM_STOP3_COUNT_TDM_STOP_COUNT(x) (((uint32_t)(((uint32_t)(x)) << STC_TDM_STOP3_COUNT_TDM_STOP_COUNT_SHIFT)) & STC_TDM_STOP3_COUNT_TDM_STOP_COUNT_MASK) + +/* The count of STC_TDM_STOP3_COUNT */ +#define STC_TDM_STOP3_COUNT_COUNT (8U) + + +/*! + * @} + */ /* end of group STC_Register_Masks */ + + +/** Peripheral STC0 base pointer */ +#define STC0 ((STC_Type *)STC0_BASE) +/** Peripheral STC1 base pointer */ +#define STC1 ((STC_Type *)STC1_BASE) +/** Peripheral STC2 base pointer */ +#define STC2 ((STC_Type *)STC2_BASE) +/** Peripheral STC3 base pointer */ +#define STC3 ((STC_Type *)STC3_BASE) +/** Peripheral STC4 base pointer */ +#define STC4 ((STC_Type *)STC4_BASE) +/** Peripheral STC5 base pointer */ +#define STC5 ((STC_Type *)STC5_BASE) +/** Peripheral STC6 base pointer */ +#define STC6 ((STC_Type *)STC6_BASE) +/** Peripheral STC7 base pointer */ +#define STC7 ((STC_Type *)STC7_BASE) +/** Peripheral STC8 base pointer */ +#define STC8 ((STC_Type *)STC8_BASE) +/** Peripheral STC9 base pointer */ +#define STC9 ((STC_Type *)STC9_BASE) +/** Peripheral STC10 base pointer */ +#define STC10 ((STC_Type *)STC10_BASE) +/** Peripheral STC11 base pointer */ +#define STC11 ((STC_Type *)STC11_BASE) +/** Peripheral STC12 base pointer */ +#define STC12 ((STC_Type *)STC12_BASE) +/** Peripheral STC13 base pointer */ +#define STC13 ((STC_Type *)STC13_BASE) +/** Peripheral STC14 base pointer */ +#define STC14 ((STC_Type *)STC14_BASE) +/** Peripheral STC15 base pointer */ +#define STC15 ((STC_Type *)STC15_BASE) +/** Peripheral STC15 base pointer */ +#define STC16 ((STC_Type *)STC16_BASE) +/** Peripheral STC15 base pointer */ +#define STC17 ((STC_Type *)STC17_BASE) +/** Peripheral STC15 base pointer */ +#define STC18 ((STC_Type *)STC18_BASE) +/** Peripheral STC15 base pointer */ +#define STC19 ((STC_Type *)STC19_BASE) +/** Peripheral STC15 base pointer */ +#define STC20 ((STC_Type *)STC20_BASE) +/** Peripheral STC15 base pointer */ +#define STC21 ((STC_Type *)STC21_BASE) +/** Peripheral STC15 base pointer */ +#define STC22 ((STC_Type *)STC22_BASE) +/** Peripheral STC15 base pointer */ +#define STC23 ((STC_Type *)STC23_BASE) + + +/** Array initializer of STC peripheral base addresses */ +#define STC_BASE_ADDRS { STC0_BASE, STC1_BASE, \ + STC2_BASE, STC3_BASE, \ + STC2_BASE, STC3_BASE, \ + STC4_BASE, STC5_BASE, \ + STC6_BASE, STC7_BASE, \ + STC8_BASE, STC9_BASE, \ + STC10_BASE, STC11_BASE, \ + STC12_BASE, STC13_BASE, \ + STC14_BASE, STC15_BASE, \ + STC16_BASE, STC17_BASE, \ + STC18_BASE, STC19_BASE, \ + STC20_BASE, STC21_BASE, \ + STC22_BASE, STC23_BASE } +/** Array initializer of STC peripheral base pointers */ +#define STC_BASE_PTRS { STC0, STC1, STC2, STC3, \ + STC4, STC5, STC6, STC7, \ + STC8, STC9, STC10, STC11, \ + STC12, STC13, STC14, STC15, \ + STC16, STC17, STC18, STC19, \ + STC20, STC21, STC22, STC23 } + +/*! + * @} + */ /* end of group STC_Peripheral_Access_Layer */ + + +#endif /* STC_H */ + diff --git a/platform/devices/MX8/MX8_sysctr.h b/platform/devices/MX8/MX8_sysctr.h new file mode 100755 index 0000000..e66b8fd --- /dev/null +++ b/platform/devices/MX8/MX8_sysctr.h @@ -0,0 +1,214 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_SYSCTR_REGISTERS_H +#define HW_SYSCTR_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- SYSCTR Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SYSCTR_Peripheral_Access_Layer SYSCTR Peripheral Access Layer + * @{ + */ + +/** SYSCTR_CTRL - Register Layout Typedef */ +typedef struct { + __IO uint32_t CNTCR; /**< Counter Control Register, offset: 0x0 */ + __IO uint32_t CNTSR; /**< Counter Status Register, offset: 0x4 */ + __IO uint32_t CNTCVL; /**< Counter Count Value Low, offset: 0x8 */ + __IO uint32_t CNTCVH; /**< Counter Count Value High, offset: 0xC */ + uint32_t RESERVED_0[4]; + __IO uint32_t CNTFID0; /**< Frequency Mode Table, Base Frequency, offset: 0x20 */ + __IO uint32_t CNTFID1; /**< Frequency Mode Table, Alternate Frequency, offset: 0x24 */ + __IO uint32_t CNTFID2; /**< Frequency Mode Table, End Marker, offset: 0x28 */ +} SYSCTR_CTRL_Type, *SYSCTR_CTRL_MemMapPtr; + +/** SYSCTR_RD - Register Layout Typedef */ +typedef struct { + uint32_t RESERVED_0[2]; + __IO uint32_t CNTCVL; /**< Counter Count Value Low, offset: 0x8 */ + __IO uint32_t CNTCVH; /**< Counter Count Value High, offset: 0xC */ +} SYSCTR_RD_Type, *SYSCTR_RD_MemMapPtr; + +/** SYSCTR_CMP - Register Layout Typedef */ +typedef struct { + uint32_t RESERVED_0[8]; + __IO uint32_t CMPCVL; /**< Counter Compare Value Low, offset: 0x20 */ + __IO uint32_t CMPCVH; /**< Counter Compare Value Low, offset: 0x24 */ + uint32_t RESERVED_1[1]; + __IO uint32_t CMPCR; /**< Counter Compare Control Register, offset: 0x2C */ +} SYSCTR_CMP_Type, *SYSCTR_CMP_MemMapPtr; + +/* ---------------------------------------------------------------------------- + -- SYSCTR_CTRL Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SYSCTR_CTRL_Register_Masks SYSCTR_CTRL Register Masks + * @{ + */ + +/* CNTCR Bit Fields */ +#define SYSCTR_CTRL_CNTCR_EN_SHIFT 0U +#define SYSCTR_CTRL_CNTCR_EN_WIDTH 1U +#define SYSCTR_CTRL_CNTCR_EN_MASK (1UL << SYSCTR_CTRL_CNTCR_EN_SHIFT) +#define SYSCTR_CTRL_CNTCR_HDBG_SHIFT 1U +#define SYSCTR_CTRL_CNTCR_HDBG_WIDTH 1U +#define SYSCTR_CTRL_CNTCR_HDBG_MASK (1UL << SYSCTR_CTRL_CNTCR_HDBG_SHIFT) +#define SYSCTR_CTRL_CNTCR_FCR0_SHIFT 8U +#define SYSCTR_CTRL_CNTCR_FCR0_WIDTH 1U +#define SYSCTR_CTRL_CNTCR_FCR0_MASK (1UL << SYSCTR_CTRL_CNTCR_FCR0_SHIFT) +#define SYSCTR_CTRL_CNTCR_FCR1_SHIFT 9U +#define SYSCTR_CTRL_CNTCR_FCR1_WIDTH 1U +#define SYSCTR_CTRL_CNTCR_FCR1_MASK (1UL << SYSCTR_CTRL_CNTCR_FCR1_SHIFT) +/* CNTSR Bit Fields */ +#define SYSCTR_CTRL_CNTSR_DBGH_SHIFT 0U +#define SYSCTR_CTRL_CNTSR_DBGH_WIDTH 1U +#define SYSCTR_CTRL_CNTSR_DBGH_MASK (1UL << SYSCTR_CTRL_CNTSR_DBGH_SHIFT) +#define SYSCTR_CTRL_CNTSR_FCA0_SHIFT 8U +#define SYSCTR_CTRL_CNTSR_FCA0_WIDTH 1U +#define SYSCTR_CTRL_CNTSR_FCA0_MASK (1UL << SYSCTR_CTRL_CNTSR_FCA0_SHIFT) +#define SYSCTR_CTRL_CNTSR_FCA1_SHIFT 9U +#define SYSCTR_CTRL_CNTSR_FCA1_WIDTH 1U +#define SYSCTR_CTRL_CNTSR_FCA1_MASK (1UL << SYSCTR_CTRL_CNTSR_FCA1_SHIFT) +/* CNTCVL Bit Fields */ +#define SYSCTR_CTRL_CNTCVL_CNTCV_SHIFT 0U +#define SYSCTR_CTRL_CNTCVL_CNTCV_WIDTH 32U +/* CNTCVH Bit Fields */ +#define SYSCTR_CTRL_CNTCVH_CNTCV_SHIFT 0U +#define SYSCTR_CTRL_CNTCVH_CNTCV_WIDTH 24U +/* CNTFID0 Bit Fields */ +#define SYSCTR_CTRL_CNTFID0_CNTFID_SHIFT 0U +#define SYSCTR_CTRL_CNTFID0_CNTFID_WIDTH 32U +/* CNTFID1 Bit Fields */ +#define SYSCTR_CTRL_CNTFID1_CNTFID_SHIFT 0U +#define SYSCTR_CTRL_CNTFID1_CNTFID_WIDTH 32U +/* CNTFID1 Bit Fields */ +#define SYSCTR_CTRL_CNTFID2_CNTFID_SHIFT 0U +#define SYSCTR_CTRL_CNTFID2_CNTFID_WIDTH 32U + +/*! + * @} + */ /* end of group SYSCTR_CTRL_Register_Masks */ + +/*! + * @addtogroup SYSCTR_RD_Register_Masks SYSCTR_RD Register Masks + * @{ + */ + +/* CNTCVL Bit Fields */ +#define SYSCTR_RD_CNTCVL_CNTCV_SHIFT 0U +#define SYSCTR_RD_CNTCVL_CNTCV_WIDTH 32U +/* CNTCVH Bit Fields */ +#define SYSCTR_RD_CNTCVH_CNTCV_SHIFT 0U +#define SYSCTR_RD_CNTCVH_CNTCV_WIDTH 24U + +/*! + * @} + */ /* end of group SYSCTR_RD_Register_Masks */ + +/*! + * @addtogroup SYSCTR_CMP_Register_Masks SYSCTR_CMP Register Masks + * @{ + */ + +/* CMPCVL Bit Fields */ +#define SYSCTR_CMP_CMPCVL_CMPCV_SHIFT 0U +#define SYSCTR_CMP_CMPCVL_CMPCV_WIDTH 32U +/* CMPCVH Bit Fields */ +#define SYSCTR_CMP_CMPCVH_CMPCV_SHIFT 0U +#define SYSCTR_CMP_CMPCVH_CMPCV_WIDTH 24U +/* CMPCR Bit Fields */ +#define SYSCTR_CMP_CMPCR_EN_SHIFT 0U +#define SYSCTR_CMP_CMPCR_EN_WIDTH 1U +#define SYSCTR_CMP_CMPCR_EN_MASK (1UL << SYSCTR_CMP_CMPCR_EN_SHIFT) +#define SYSCTR_CMP_CMPCR_IMASK_SHIFT 1U +#define SYSCTR_CMP_CMPCR_IMASK_WIDTH 1U +#define SYSCTR_CMP_CMPCR_IMASK_MASK (1UL << SYSCTR_CMP_CMPCR_IMASK_SHIFT) +#define SYSCTR_CMP_CMPCR_ISTAT_SHIFT 2U +#define SYSCTR_CMP_CMPCR_ISTAT_WIDTH 1U +#define SYSCTR_CMP_CMPCR_ISTAT_MASK (1UL << SYSCTR_CMP_CMPCR_ISTAT_SHIFT) + +/*! + * @} + */ /* end of group SYSCTR_CMP_Register_Masks */ + + +/* SYSCTR - Peripheral instance base addresses */ +/** Peripheral SYSCTR base pointer */ +#define SYSCTR_CTRL ((SYSCTR_CTRL_Type *)SYSCTR_CTRL_BASE) +#define SYSCTR_CTRL_BASE_PTR (SYSCTR_CTRL_BASE) +#define SYSCTR_RD ((SYSCTR_RD_Type *)SYSCTR_RD_BASE) +#define SYSCTR_RD_BASE_PTR (SYSCTR_RD_BASE) +#define SYSCTR_CMP ((SYSCTR_CMP_Type *)SYSCTR_CMP_BASE) +#define SYSCTR_CMP_BASE_PTR (SYSCTR_CMP_BASE) +#define SYSCTR_CMP1 ((SYSCTR_CMP_Type *)SYSCTR_CMP1_BASE) +#define SYSCTR_CMP1_BASE_PTR (SYSCTR_CMP1_BASE) +/** Interrupt vectors for the SYSCTR peripheral type */ +#define SYSCTR_IRQS { SYSCTR_CMP0_IRQn, SYSCTR_CMP1_IRQn, SYSCTR_CMP2_IRQn, SYSCTR_CMP3_IRQn } + + +/* ---------------------------------------------------------------------------- + -- SYSCTR - Register accessor macros + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SYSCTR_Register_Accessor_Macros SYSCTR - Register accessor macros + * @{ + */ + + + + +/*! + * @} + */ /* end of group SYSCTR_Peripheral_Access_Layer */ + +#endif /* HW_SYSCTR_REGISTERS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8/MX8_wdog.h b/platform/devices/MX8/MX8_wdog.h new file mode 100755 index 0000000..897538b --- /dev/null +++ b/platform/devices/MX8/MX8_wdog.h @@ -0,0 +1,169 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ + +#ifndef HW_WDOG_REGISTERS_H +#define HW_WDOG_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- WDOG Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WDOG_Peripheral_Access_Layer WDOG Peripheral Access Layer + * @{ + */ + +/** WDOG - Register Layout Typedef */ +typedef struct { + __IO uint32_t CS; /**< Watchdog Control and Status Register, offset: 0x0 */ + __IO uint32_t CNT; /**< Watchdog Counter Register, offset: 0x4 */ + __IO uint32_t TOVAL; /**< Watchdog Timeout Value Register, offset: 0x8 */ + __IO uint32_t WIN; /**< Watchdog Window Register, offset: 0xC */ +} WDOG_Type; + +/* ---------------------------------------------------------------------------- + -- WDOG Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WDOG_Register_Masks WDOG Register Masks + * @{ + */ + +/*! @name CS - Watchdog Control and Status Register */ +#define WDOG_CS_STOP_MASK (0x1U) +#define WDOG_CS_STOP_SHIFT (0U) +#define WDOG_CS_STOP(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_STOP_SHIFT)) & WDOG_CS_STOP_MASK) +#define WDOG_CS_WAIT_MASK (0x2U) +#define WDOG_CS_WAIT_SHIFT (1U) +#define WDOG_CS_WAIT(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_WAIT_SHIFT)) & WDOG_CS_WAIT_MASK) +#define WDOG_CS_DBG_MASK (0x4U) +#define WDOG_CS_DBG_SHIFT (2U) +#define WDOG_CS_DBG(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_DBG_SHIFT)) & WDOG_CS_DBG_MASK) +#define WDOG_CS_TST_MASK (0x18U) +#define WDOG_CS_TST_SHIFT (3U) +#define WDOG_CS_TST(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_TST_SHIFT)) & WDOG_CS_TST_MASK) +#define WDOG_CS_UPDATE_MASK (0x20U) +#define WDOG_CS_UPDATE_SHIFT (5U) +#define WDOG_CS_UPDATE(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_UPDATE_SHIFT)) & WDOG_CS_UPDATE_MASK) +#define WDOG_CS_INT_MASK (0x40U) +#define WDOG_CS_INT_SHIFT (6U) +#define WDOG_CS_INT(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_INT_SHIFT)) & WDOG_CS_INT_MASK) +#define WDOG_CS_EN_MASK (0x80U) +#define WDOG_CS_EN_SHIFT (7U) +#define WDOG_CS_EN(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_EN_SHIFT)) & WDOG_CS_EN_MASK) +#define WDOG_CS_CLK_MASK (0x300U) +#define WDOG_CS_CLK_SHIFT (8U) +#define WDOG_CS_CLK(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_CLK_SHIFT)) & WDOG_CS_CLK_MASK) +#define WDOG_CS_PRES_MASK (0x1000U) +#define WDOG_CS_PRES_SHIFT (12U) +#define WDOG_CS_PRES(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_PRES_SHIFT)) & WDOG_CS_PRES_MASK) +#define WDOG_CS_CMD32EN_MASK (0x2000U) +#define WDOG_CS_CMD32EN_SHIFT (13U) +#define WDOG_CS_CMD32EN(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_CMD32EN_SHIFT)) & WDOG_CS_CMD32EN_MASK) +#define WDOG_CS_FLG_MASK (0x4000U) +#define WDOG_CS_FLG_SHIFT (14U) +#define WDOG_CS_FLG(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_FLG_SHIFT)) & WDOG_CS_FLG_MASK) +#define WDOG_CS_WIN_MASK (0x8000U) +#define WDOG_CS_WIN_SHIFT (15U) +#define WDOG_CS_WIN(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CS_WIN_SHIFT)) & WDOG_CS_WIN_MASK) + +/*! @name CNT - Watchdog Counter Register */ +#define WDOG_CNT_CNTLOW_MASK (0xFFU) +#define WDOG_CNT_CNTLOW_SHIFT (0U) +#define WDOG_CNT_CNTLOW(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CNT_CNTLOW_SHIFT)) & WDOG_CNT_CNTLOW_MASK) +#define WDOG_CNT_CNTHIGH_MASK (0xFF00U) +#define WDOG_CNT_CNTHIGH_SHIFT (8U) +#define WDOG_CNT_CNTHIGH(x) (((uint32_t)(((uint32_t)(x)) << WDOG_CNT_CNTHIGH_SHIFT)) & WDOG_CNT_CNTHIGH_MASK) + +/*! @name TOVAL - Watchdog Timeout Value Register */ +#define WDOG_TOVAL_TOVALLOW_MASK (0xFFU) +#define WDOG_TOVAL_TOVALLOW_SHIFT (0U) +#define WDOG_TOVAL_TOVALLOW(x) (((uint32_t)(((uint32_t)(x)) << WDOG_TOVAL_TOVALLOW_SHIFT)) & WDOG_TOVAL_TOVALLOW_MASK) +#define WDOG_TOVAL_TOVALHIGH_MASK (0xFF00U) +#define WDOG_TOVAL_TOVALHIGH_SHIFT (8U) +#define WDOG_TOVAL_TOVALHIGH(x) (((uint32_t)(((uint32_t)(x)) << WDOG_TOVAL_TOVALHIGH_SHIFT)) & WDOG_TOVAL_TOVALHIGH_MASK) + +/*! @name WIN - Watchdog Window Register */ +#define WDOG_WIN_WINLOW_MASK (0xFFU) +#define WDOG_WIN_WINLOW_SHIFT (0U) +#define WDOG_WIN_WINLOW(x) (((uint32_t)(((uint32_t)(x)) << WDOG_WIN_WINLOW_SHIFT)) & WDOG_WIN_WINLOW_MASK) +#define WDOG_WIN_WINHIGH_MASK (0xFF00U) +#define WDOG_WIN_WINHIGH_SHIFT (8U) +#define WDOG_WIN_WINHIGH(x) (((uint32_t)(((uint32_t)(x)) << WDOG_WIN_WINHIGH_SHIFT)) & WDOG_WIN_WINHIGH_MASK) + + +/*! + * @} + */ /* end of group WDOG_Register_Masks */ + + +/* WDOG - Peripheral instance base addresses */ +/** Peripheral WDOG0 base pointer */ +#define WDOG0 ((WDOG_Type *)WDOG0_BASE) +/** Peripheral WDOG1 base pointer */ +#define WDOG1 ((WDOG_Type *)WDOG1_BASE) +/** Peripheral WDOG2 base pointer */ +#define WDOG2 ((WDOG_Type *)WDOG2_BASE) +/** Array initializer of WDOG peripheral base addresses */ +#define WDOG_BASE_ADDRS { WDOG0_BASE, WDOG1_BASE, \ + WDOG2_BASE } +/** Array initializer of WDOG peripheral base pointers */ +#define WDOG_BASE_PTRS { WDOG0, WDOG1, WDOG2 } +/** Interrupt vectors for the WDOG peripheral type */ +#define WDOG_IRQS { WDOG0_IRQn } + +#define WDOG_UPDATE_KEY (0xD928C520U) +#define WDOG_REFRESH_KEY (0xB480A602U) + + +/*! + * @} + */ /* end of group WDOG_Peripheral_Access_Layer */ + + +#endif /* HW_WDOG_REGISTERS_H */ + diff --git a/platform/devices/MX8/MX8_xrdc2.h b/platform/devices/MX8/MX8_xrdc2.h new file mode 100755 index 0000000..e99d87e --- /dev/null +++ b/platform/devices/MX8/MX8_xrdc2.h @@ -0,0 +1,523 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 1900 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** Revisions: +** +** ################################################################### +*/ + +/*! + * @file xrdc2.h + * @version 0.0 + * @date 0-00-00 + * @brief CMSIS Peripheral Access Layer for xrdc2 + * + * CMSIS Peripheral Access Layer for xrdc2 + */ + +#ifndef XRDC2_H +#define XRDC2_H /**< Symbol preventing repeated inclusion */ + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma push + #pragma anon_unions +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- XRDC2 Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup XRDC2_Peripheral_Access_Layer XRDC2 Peripheral Access Layer + * @{ + */ + +/** XRDC2 - Register Layout Typedef */ +typedef struct { + __IO uint32_t MCR; /**< Module Control Register, offset: 0x0 */ + __I uint32_t SR; /**< Status Register, offset: 0x4 */ + uint8_t RESERVED_0[4088]; + struct { /* offset: 0x1000, array step: 0x8 */ + __IO uint32_t MSC_MSAC_W0; /**< Memory Slot Access Control, array offset: 0x1000, array step: 0x8 */ + __IO uint32_t MSC_MSAC_W1; /**< Memory Slot Access Control, array offset: 0x1004, array step: 0x8 */ + } MSCI_MSAC_WK[128]; + uint8_t RESERVED_1[3072]; + struct { /* offset: 0x2000, array step: index*0x100, index2*0x8 */ + __IO uint32_t MDAC_MDA_W0; /**< Master Domain Assignment (W0), array offset: 0x2000, array step: index*0x100, index2*0x8 */ + __IO uint32_t MDAC_MDA_W1; /**< Master Domain Assignment (W1), array offset: 0x2004, array step: index*0x100, index2*0x8 */ + } MDACI_MDAJ[32][32]; + struct { /* offset: 0x4000, array step: index*0x800, index2*0x8 */ + __IO uint32_t PAC_PDAC_W0; /**< Peripheral Domain Access Control, array offset: 0x4000, array step: index*0x800, index2*0x8 */ + __IO uint32_t PAC_PDAC_W1; /**< Peripheral Domain Access Control, array offset: 0x4004, array step: index*0x800, index2*0x8 */ + } PACI_PDACJ[8][256]; + struct { /* offset: 0x8000, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W0; /**< Memory Region Descriptor, array offset: 0x8000, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W1; /**< Memory Region Descriptor, array offset: 0x8004, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W2; /**< Memory Region Descriptor, array offset: 0x8008, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W3; /**< Memory Region Descriptor, array offset: 0x800C, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W4; /**< Memory Region Descriptor, array offset: 0x8010, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W5; /**< Memory Region Descriptor, array offset: 0x8014, array step: index*0x400, index2*0x20 */ + __IO uint32_t MRC_MRGD_W6; /**< Memory Region Descriptor, array offset: 0x8018, array step: index*0x400, index2*0x20 */ + uint8_t RESERVED_0[4]; + } MRCI_MRGDJ[32][32]; +} XRDC2_Type; + +/* ---------------------------------------------------------------------------- + -- XRDC2 Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup XRDC2_Register_Masks XRDC2 Register Masks + * @{ + */ + +/*! @name MCR - Module Control Register */ +#define XRDC2_MCR_GVLDM_MASK (0x1U) +#define XRDC2_MCR_GVLDM_SHIFT (0U) +#define XRDC2_MCR_GVLDM(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MCR_GVLDM_SHIFT)) & XRDC2_MCR_GVLDM_MASK) +#define XRDC2_MCR_GVLDC_MASK (0x2U) +#define XRDC2_MCR_GVLDC_SHIFT (1U) +#define XRDC2_MCR_GVLDC(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MCR_GVLDC_SHIFT)) & XRDC2_MCR_GVLDC_MASK) +#define XRDC2_MCR_GCL_MASK (0x30U) +#define XRDC2_MCR_GCL_SHIFT (4U) +#define XRDC2_MCR_GCL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MCR_GCL_SHIFT)) & XRDC2_MCR_GCL_MASK) + +/*! @name SR - Status Register */ +#define XRDC2_SR_DID_MASK (0xFU) +#define XRDC2_SR_DID_SHIFT (0U) +#define XRDC2_SR_DID(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_SR_DID_SHIFT)) & XRDC2_SR_DID_MASK) +#define XRDC2_SR_HRL_MASK (0xF0U) +#define XRDC2_SR_HRL_SHIFT (4U) +#define XRDC2_SR_HRL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_SR_HRL_SHIFT)) & XRDC2_SR_HRL_MASK) +#define XRDC2_SR_GCLO_MASK (0xF00U) +#define XRDC2_SR_GCLO_SHIFT (8U) +#define XRDC2_SR_GCLO(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_SR_GCLO_SHIFT)) & XRDC2_SR_GCLO_MASK) + +/*! @name MSC_MSAC_W0 - Memory Slot Access Control */ +#define XRDC2_MSC_MSAC_W0_D0ACP_MASK (0x7U) +#define XRDC2_MSC_MSAC_W0_D0ACP_SHIFT (0U) +#define XRDC2_MSC_MSAC_W0_D0ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D0ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D0ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D1ACP_MASK (0x38U) +#define XRDC2_MSC_MSAC_W0_D1ACP_SHIFT (3U) +#define XRDC2_MSC_MSAC_W0_D1ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D1ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D1ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D2ACP_MASK (0x1C0U) +#define XRDC2_MSC_MSAC_W0_D2ACP_SHIFT (6U) +#define XRDC2_MSC_MSAC_W0_D2ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D2ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D2ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D3ACP_MASK (0xE00U) +#define XRDC2_MSC_MSAC_W0_D3ACP_SHIFT (9U) +#define XRDC2_MSC_MSAC_W0_D3ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D3ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D3ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D4ACP_MASK (0x7000U) +#define XRDC2_MSC_MSAC_W0_D4ACP_SHIFT (12U) +#define XRDC2_MSC_MSAC_W0_D4ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D4ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D4ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D5ACP_MASK (0x38000U) +#define XRDC2_MSC_MSAC_W0_D5ACP_SHIFT (15U) +#define XRDC2_MSC_MSAC_W0_D5ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D5ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D5ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D6ACP_MASK (0x1C0000U) +#define XRDC2_MSC_MSAC_W0_D6ACP_SHIFT (18U) +#define XRDC2_MSC_MSAC_W0_D6ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D6ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D6ACP_MASK) +#define XRDC2_MSC_MSAC_W0_D7ACP_MASK (0xE00000U) +#define XRDC2_MSC_MSAC_W0_D7ACP_SHIFT (21U) +#define XRDC2_MSC_MSAC_W0_D7ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_D7ACP_SHIFT)) & XRDC2_MSC_MSAC_W0_D7ACP_MASK) +#define XRDC2_MSC_MSAC_W0_EALO_MASK (0xF000000U) +#define XRDC2_MSC_MSAC_W0_EALO_SHIFT (24U) +#define XRDC2_MSC_MSAC_W0_EALO(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W0_EALO_SHIFT)) & XRDC2_MSC_MSAC_W0_EALO_MASK) + +/* The count of XRDC2_MSC_MSAC_W0 */ +#define XRDC2_MSC_MSAC_W0_COUNT (128U) + +/*! @name MSC_MSAC_W1 - Memory Slot Access Control */ +#define XRDC2_MSC_MSAC_W1_D8ACP_MASK (0x7U) +#define XRDC2_MSC_MSAC_W1_D8ACP_SHIFT (0U) +#define XRDC2_MSC_MSAC_W1_D8ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D8ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D8ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D9ACP_MASK (0x38U) +#define XRDC2_MSC_MSAC_W1_D9ACP_SHIFT (3U) +#define XRDC2_MSC_MSAC_W1_D9ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D9ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D9ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D10ACP_MASK (0x1C0U) +#define XRDC2_MSC_MSAC_W1_D10ACP_SHIFT (6U) +#define XRDC2_MSC_MSAC_W1_D10ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D10ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D10ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D11ACP_MASK (0xE00U) +#define XRDC2_MSC_MSAC_W1_D11ACP_SHIFT (9U) +#define XRDC2_MSC_MSAC_W1_D11ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D11ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D11ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D12ACP_MASK (0x7000U) +#define XRDC2_MSC_MSAC_W1_D12ACP_SHIFT (12U) +#define XRDC2_MSC_MSAC_W1_D12ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D12ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D12ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D13ACP_MASK (0x38000U) +#define XRDC2_MSC_MSAC_W1_D13ACP_SHIFT (15U) +#define XRDC2_MSC_MSAC_W1_D13ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D13ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D13ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D14ACP_MASK (0x1C0000U) +#define XRDC2_MSC_MSAC_W1_D14ACP_SHIFT (18U) +#define XRDC2_MSC_MSAC_W1_D14ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D14ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D14ACP_MASK) +#define XRDC2_MSC_MSAC_W1_D15ACP_MASK (0xE00000U) +#define XRDC2_MSC_MSAC_W1_D15ACP_SHIFT (21U) +#define XRDC2_MSC_MSAC_W1_D15ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_D15ACP_SHIFT)) & XRDC2_MSC_MSAC_W1_D15ACP_MASK) +#define XRDC2_MSC_MSAC_W1_EAL_MASK (0x3000000U) +#define XRDC2_MSC_MSAC_W1_EAL_SHIFT (24U) +#define XRDC2_MSC_MSAC_W1_EAL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_EAL_SHIFT)) & XRDC2_MSC_MSAC_W1_EAL_MASK) +#define XRDC2_MSC_MSAC_W1_DL2_MASK (0x60000000U) +#define XRDC2_MSC_MSAC_W1_DL2_SHIFT (29U) +#define XRDC2_MSC_MSAC_W1_DL2(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_DL2_SHIFT)) & XRDC2_MSC_MSAC_W1_DL2_MASK) +#define XRDC2_MSC_MSAC_W1_VLD_MASK (0x80000000U) +#define XRDC2_MSC_MSAC_W1_VLD_SHIFT (31U) +#define XRDC2_MSC_MSAC_W1_VLD(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MSC_MSAC_W1_VLD_SHIFT)) & XRDC2_MSC_MSAC_W1_VLD_MASK) + +/* The count of XRDC2_MSC_MSAC_W1 */ +#define XRDC2_MSC_MSAC_W1_COUNT (128U) + +/*! @name MDAC_MDA_W0 - Master Domain Assignment (W0) */ +#define XRDC2_MDAC_MDA_W0_MASK_MASK (0xFFFFU) +#define XRDC2_MDAC_MDA_W0_MASK_SHIFT (0U) +#define XRDC2_MDAC_MDA_W0_MASK(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W0_MASK_SHIFT)) & XRDC2_MDAC_MDA_W0_MASK_MASK) +#define XRDC2_MDAC_MDA_W0_MATCH_MASK (0xFFFF0000U) +#define XRDC2_MDAC_MDA_W0_MATCH_SHIFT (16U) +#define XRDC2_MDAC_MDA_W0_MATCH(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W0_MATCH_SHIFT)) & XRDC2_MDAC_MDA_W0_MATCH_MASK) + +/* The count of XRDC2_MDAC_MDA_W0 */ +#define XRDC2_MDAC_MDA_W0_COUNT (32U) + +/* The count of XRDC2_MDAC_MDA_W0 */ +#define XRDC2_MDAC_MDA_W0_COUNT2 (32U) + +/*! @name MDAC_MDA_W1 - Master Domain Assignment (W1) */ +#define XRDC2_MDAC_MDA_W1_SID_MASK (0xFFFFU) +#define XRDC2_MDAC_MDA_W1_SID_SHIFT (0U) +#define XRDC2_MDAC_MDA_W1_SID(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_SID_SHIFT)) & XRDC2_MDAC_MDA_W1_SID_MASK) +#define XRDC2_MDAC_MDA_W1_DID_MASK (0xF0000U) +#define XRDC2_MDAC_MDA_W1_DID_SHIFT (16U) +#define XRDC2_MDAC_MDA_W1_DID(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_DID_SHIFT)) & XRDC2_MDAC_MDA_W1_DID_MASK) +#define XRDC2_MDAC_MDA_W1_PA_MASK (0x3000000U) +#define XRDC2_MDAC_MDA_W1_PA_SHIFT (24U) +#define XRDC2_MDAC_MDA_W1_PA(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_PA_SHIFT)) & XRDC2_MDAC_MDA_W1_PA_MASK) +#define XRDC2_MDAC_MDA_W1_SA_MASK (0xC000000U) +#define XRDC2_MDAC_MDA_W1_SA_SHIFT (26U) +#define XRDC2_MDAC_MDA_W1_SA(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_SA_SHIFT)) & XRDC2_MDAC_MDA_W1_SA_MASK) +#define XRDC2_MDAC_MDA_W1_DL_MASK (0x40000000U) +#define XRDC2_MDAC_MDA_W1_DL_SHIFT (30U) +#define XRDC2_MDAC_MDA_W1_DL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_DL_SHIFT)) & XRDC2_MDAC_MDA_W1_DL_MASK) +#define XRDC2_MDAC_MDA_W1_VLD_MASK (0x80000000U) +#define XRDC2_MDAC_MDA_W1_VLD_SHIFT (31U) +#define XRDC2_MDAC_MDA_W1_VLD(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MDAC_MDA_W1_VLD_SHIFT)) & XRDC2_MDAC_MDA_W1_VLD_MASK) + +/* The count of XRDC2_MDAC_MDA_W1 */ +#define XRDC2_MDAC_MDA_W1_COUNT (32U) + +/* The count of XRDC2_MDAC_MDA_W1 */ +#define XRDC2_MDAC_MDA_W1_COUNT2 (32U) + +/*! @name PAC_PDAC_W0 - Peripheral Domain Access Control */ +#define XRDC2_PAC_PDAC_W0_D0ACP_MASK (0x7U) +#define XRDC2_PAC_PDAC_W0_D0ACP_SHIFT (0U) +#define XRDC2_PAC_PDAC_W0_D0ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D0ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D0ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D1ACP_MASK (0x38U) +#define XRDC2_PAC_PDAC_W0_D1ACP_SHIFT (3U) +#define XRDC2_PAC_PDAC_W0_D1ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D1ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D1ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D2ACP_MASK (0x1C0U) +#define XRDC2_PAC_PDAC_W0_D2ACP_SHIFT (6U) +#define XRDC2_PAC_PDAC_W0_D2ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D2ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D2ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D3ACP_MASK (0xE00U) +#define XRDC2_PAC_PDAC_W0_D3ACP_SHIFT (9U) +#define XRDC2_PAC_PDAC_W0_D3ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D3ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D3ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D4ACP_MASK (0x7000U) +#define XRDC2_PAC_PDAC_W0_D4ACP_SHIFT (12U) +#define XRDC2_PAC_PDAC_W0_D4ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D4ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D4ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D5ACP_MASK (0x38000U) +#define XRDC2_PAC_PDAC_W0_D5ACP_SHIFT (15U) +#define XRDC2_PAC_PDAC_W0_D5ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D5ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D5ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D6ACP_MASK (0x1C0000U) +#define XRDC2_PAC_PDAC_W0_D6ACP_SHIFT (18U) +#define XRDC2_PAC_PDAC_W0_D6ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D6ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D6ACP_MASK) +#define XRDC2_PAC_PDAC_W0_D7ACP_MASK (0xE00000U) +#define XRDC2_PAC_PDAC_W0_D7ACP_SHIFT (21U) +#define XRDC2_PAC_PDAC_W0_D7ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_D7ACP_SHIFT)) & XRDC2_PAC_PDAC_W0_D7ACP_MASK) +#define XRDC2_PAC_PDAC_W0_EALO_MASK (0xF000000U) +#define XRDC2_PAC_PDAC_W0_EALO_SHIFT (24U) +#define XRDC2_PAC_PDAC_W0_EALO(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W0_EALO_SHIFT)) & XRDC2_PAC_PDAC_W0_EALO_MASK) + +/* The count of XRDC2_PAC_PDAC_W0 */ +#define XRDC2_PAC_PDAC_W0_COUNT (8U) + +/* The count of XRDC2_PAC_PDAC_W0 */ +#define XRDC2_PAC_PDAC_W0_COUNT2 (256U) + +/*! @name PAC_PDAC_W1 - Peripheral Domain Access Control */ +#define XRDC2_PAC_PDAC_W1_D8ACP_MASK (0x7U) +#define XRDC2_PAC_PDAC_W1_D8ACP_SHIFT (0U) +#define XRDC2_PAC_PDAC_W1_D8ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D8ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D8ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D9ACP_MASK (0x38U) +#define XRDC2_PAC_PDAC_W1_D9ACP_SHIFT (3U) +#define XRDC2_PAC_PDAC_W1_D9ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D9ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D9ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D10ACP_MASK (0x1C0U) +#define XRDC2_PAC_PDAC_W1_D10ACP_SHIFT (6U) +#define XRDC2_PAC_PDAC_W1_D10ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D10ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D10ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D11ACP_MASK (0xE00U) +#define XRDC2_PAC_PDAC_W1_D11ACP_SHIFT (9U) +#define XRDC2_PAC_PDAC_W1_D11ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D11ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D11ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D12ACP_MASK (0x7000U) +#define XRDC2_PAC_PDAC_W1_D12ACP_SHIFT (12U) +#define XRDC2_PAC_PDAC_W1_D12ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D12ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D12ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D13ACP_MASK (0x38000U) +#define XRDC2_PAC_PDAC_W1_D13ACP_SHIFT (15U) +#define XRDC2_PAC_PDAC_W1_D13ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D13ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D13ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D14ACP_MASK (0x1C0000U) +#define XRDC2_PAC_PDAC_W1_D14ACP_SHIFT (18U) +#define XRDC2_PAC_PDAC_W1_D14ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D14ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D14ACP_MASK) +#define XRDC2_PAC_PDAC_W1_D15ACP_MASK (0xE00000U) +#define XRDC2_PAC_PDAC_W1_D15ACP_SHIFT (21U) +#define XRDC2_PAC_PDAC_W1_D15ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_D15ACP_SHIFT)) & XRDC2_PAC_PDAC_W1_D15ACP_MASK) +#define XRDC2_PAC_PDAC_W1_EAL_MASK (0x3000000U) +#define XRDC2_PAC_PDAC_W1_EAL_SHIFT (24U) +#define XRDC2_PAC_PDAC_W1_EAL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_EAL_SHIFT)) & XRDC2_PAC_PDAC_W1_EAL_MASK) +#define XRDC2_PAC_PDAC_W1_DL2_MASK (0x60000000U) +#define XRDC2_PAC_PDAC_W1_DL2_SHIFT (29U) +#define XRDC2_PAC_PDAC_W1_DL2(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_DL2_SHIFT)) & XRDC2_PAC_PDAC_W1_DL2_MASK) +#define XRDC2_PAC_PDAC_W1_VLD_MASK (0x80000000U) +#define XRDC2_PAC_PDAC_W1_VLD_SHIFT (31U) +#define XRDC2_PAC_PDAC_W1_VLD(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_PAC_PDAC_W1_VLD_SHIFT)) & XRDC2_PAC_PDAC_W1_VLD_MASK) + +/* The count of XRDC2_PAC_PDAC_W1 */ +#define XRDC2_PAC_PDAC_W1_COUNT (8U) + +/* The count of XRDC2_PAC_PDAC_W1 */ +#define XRDC2_PAC_PDAC_W1_COUNT2 (256U) + +/*! @name MRC_MRGD_W0 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W0_SRTADDR_MASK (0xFFFFF000U) +#define XRDC2_MRC_MRGD_W0_SRTADDR_SHIFT (12U) +#define XRDC2_MRC_MRGD_W0_SRTADDR(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W0_SRTADDR_SHIFT)) & XRDC2_MRC_MRGD_W0_SRTADDR_MASK) + +/* The count of XRDC2_MRC_MRGD_W0 */ +#define XRDC2_MRC_MRGD_W0_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W0 */ +#define XRDC2_MRC_MRGD_W0_COUNT2 (32U) + +/*! @name MRC_MRGD_W1 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W1_SRTADDR_MASK (0xFU) +#define XRDC2_MRC_MRGD_W1_SRTADDR_SHIFT (0U) +#define XRDC2_MRC_MRGD_W1_SRTADDR(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W1_SRTADDR_SHIFT)) & XRDC2_MRC_MRGD_W1_SRTADDR_MASK) + +/* The count of XRDC2_MRC_MRGD_W1 */ +#define XRDC2_MRC_MRGD_W1_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W1 */ +#define XRDC2_MRC_MRGD_W1_COUNT2 (32U) + +/*! @name MRC_MRGD_W2 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W2_ENDADDR_MASK (0xFFFFF000U) +#define XRDC2_MRC_MRGD_W2_ENDADDR_SHIFT (12U) +#define XRDC2_MRC_MRGD_W2_ENDADDR(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W2_ENDADDR_SHIFT)) & XRDC2_MRC_MRGD_W2_ENDADDR_MASK) + +/* The count of XRDC2_MRC_MRGD_W2 */ +#define XRDC2_MRC_MRGD_W2_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W2 */ +#define XRDC2_MRC_MRGD_W2_COUNT2 (32U) + +/*! @name MRC_MRGD_W3 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W3_ENDADDR_MASK (0xFU) +#define XRDC2_MRC_MRGD_W3_ENDADDR_SHIFT (0U) +#define XRDC2_MRC_MRGD_W3_ENDADDR(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W3_ENDADDR_SHIFT)) & XRDC2_MRC_MRGD_W3_ENDADDR_MASK) + +/* The count of XRDC2_MRC_MRGD_W3 */ +#define XRDC2_MRC_MRGD_W3_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W3 */ +#define XRDC2_MRC_MRGD_W3_COUNT2 (32U) + +/*! @name MRC_MRGD_W4 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W4_RMSG_MASK (0xFU) +#define XRDC2_MRC_MRGD_W4_RMSG_SHIFT (0U) +#define XRDC2_MRC_MRGD_W4_RMSG(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W4_RMSG_SHIFT)) & XRDC2_MRC_MRGD_W4_RMSG_MASK) +#define XRDC2_MRC_MRGD_W4_DET_MASK (0x10000000U) +#define XRDC2_MRC_MRGD_W4_DET_SHIFT (28U) +#define XRDC2_MRC_MRGD_W4_DET(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W4_DET_SHIFT)) & XRDC2_MRC_MRGD_W4_DET_MASK) + +/* The count of XRDC2_MRC_MRGD_W4 */ +#define XRDC2_MRC_MRGD_W4_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W4 */ +#define XRDC2_MRC_MRGD_W4_COUNT2 (32U) + +/*! @name MRC_MRGD_W5 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W5_D0ACP_MASK (0x7U) +#define XRDC2_MRC_MRGD_W5_D0ACP_SHIFT (0U) +#define XRDC2_MRC_MRGD_W5_D0ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D0ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D0ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D1ACP_MASK (0x38U) +#define XRDC2_MRC_MRGD_W5_D1ACP_SHIFT (3U) +#define XRDC2_MRC_MRGD_W5_D1ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D1ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D1ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D2ACP_MASK (0x1C0U) +#define XRDC2_MRC_MRGD_W5_D2ACP_SHIFT (6U) +#define XRDC2_MRC_MRGD_W5_D2ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D2ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D2ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D3ACP_MASK (0xE00U) +#define XRDC2_MRC_MRGD_W5_D3ACP_SHIFT (9U) +#define XRDC2_MRC_MRGD_W5_D3ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D3ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D3ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D4ACP_MASK (0x7000U) +#define XRDC2_MRC_MRGD_W5_D4ACP_SHIFT (12U) +#define XRDC2_MRC_MRGD_W5_D4ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D4ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D4ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D5ACP_MASK (0x38000U) +#define XRDC2_MRC_MRGD_W5_D5ACP_SHIFT (15U) +#define XRDC2_MRC_MRGD_W5_D5ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D5ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D5ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D6ACP_MASK (0x1C0000U) +#define XRDC2_MRC_MRGD_W5_D6ACP_SHIFT (18U) +#define XRDC2_MRC_MRGD_W5_D6ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D6ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D6ACP_MASK) +#define XRDC2_MRC_MRGD_W5_D7ACP_MASK (0xE00000U) +#define XRDC2_MRC_MRGD_W5_D7ACP_SHIFT (21U) +#define XRDC2_MRC_MRGD_W5_D7ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_D7ACP_SHIFT)) & XRDC2_MRC_MRGD_W5_D7ACP_MASK) +#define XRDC2_MRC_MRGD_W5_EALO_MASK (0xF000000U) +#define XRDC2_MRC_MRGD_W5_EALO_SHIFT (24U) +#define XRDC2_MRC_MRGD_W5_EALO(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W5_EALO_SHIFT)) & XRDC2_MRC_MRGD_W5_EALO_MASK) + +/* The count of XRDC2_MRC_MRGD_W5 */ +#define XRDC2_MRC_MRGD_W5_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W5 */ +#define XRDC2_MRC_MRGD_W5_COUNT2 (32U) + +/*! @name MRC_MRGD_W6 - Memory Region Descriptor */ +#define XRDC2_MRC_MRGD_W6_D8ACP_MASK (0x7U) +#define XRDC2_MRC_MRGD_W6_D8ACP_SHIFT (0U) +#define XRDC2_MRC_MRGD_W6_D8ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D8ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D8ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D9ACP_MASK (0x38U) +#define XRDC2_MRC_MRGD_W6_D9ACP_SHIFT (3U) +#define XRDC2_MRC_MRGD_W6_D9ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D9ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D9ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D10ACP_MASK (0x1C0U) +#define XRDC2_MRC_MRGD_W6_D10ACP_SHIFT (6U) +#define XRDC2_MRC_MRGD_W6_D10ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D10ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D10ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D11ACP_MASK (0xE00U) +#define XRDC2_MRC_MRGD_W6_D11ACP_SHIFT (9U) +#define XRDC2_MRC_MRGD_W6_D11ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D11ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D11ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D12ACP_MASK (0x7000U) +#define XRDC2_MRC_MRGD_W6_D12ACP_SHIFT (12U) +#define XRDC2_MRC_MRGD_W6_D12ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D12ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D12ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D13ACP_MASK (0x38000U) +#define XRDC2_MRC_MRGD_W6_D13ACP_SHIFT (15U) +#define XRDC2_MRC_MRGD_W6_D13ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D13ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D13ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D14ACP_MASK (0x1C0000U) +#define XRDC2_MRC_MRGD_W6_D14ACP_SHIFT (18U) +#define XRDC2_MRC_MRGD_W6_D14ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D14ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D14ACP_MASK) +#define XRDC2_MRC_MRGD_W6_D15ACP_MASK (0xE00000U) +#define XRDC2_MRC_MRGD_W6_D15ACP_SHIFT (21U) +#define XRDC2_MRC_MRGD_W6_D15ACP(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_D15ACP_SHIFT)) & XRDC2_MRC_MRGD_W6_D15ACP_MASK) +#define XRDC2_MRC_MRGD_W6_EAL_MASK (0x3000000U) +#define XRDC2_MRC_MRGD_W6_EAL_SHIFT (24U) +#define XRDC2_MRC_MRGD_W6_EAL(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_EAL_SHIFT)) & XRDC2_MRC_MRGD_W6_EAL_MASK) +#define XRDC2_MRC_MRGD_W6_DL2_MASK (0x60000000U) +#define XRDC2_MRC_MRGD_W6_DL2_SHIFT (29U) +#define XRDC2_MRC_MRGD_W6_DL2(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_DL2_SHIFT)) & XRDC2_MRC_MRGD_W6_DL2_MASK) +#define XRDC2_MRC_MRGD_W6_VLD_MASK (0x80000000U) +#define XRDC2_MRC_MRGD_W6_VLD_SHIFT (31U) +#define XRDC2_MRC_MRGD_W6_VLD(x) (((uint32_t)(((uint32_t)(x)) << XRDC2_MRC_MRGD_W6_VLD_SHIFT)) & XRDC2_MRC_MRGD_W6_VLD_MASK) + +/* The count of XRDC2_MRC_MRGD_W6 */ +#define XRDC2_MRC_MRGD_W6_COUNT (32U) + +/* The count of XRDC2_MRC_MRGD_W6 */ +#define XRDC2_MRC_MRGD_W6_COUNT2 (32U) + + +/*! + * @} + */ /* end of group XRDC2_Register_Masks */ + + +/* XRDC2 - Peripheral instance base addresses */ +/** Peripheral XRDC2 base address */ +#define XRDC2_BASE (0u) +/** Peripheral d_ip_xrdc2_syn base pointer */ +#define XRDC2 ((XRDC2_Type *)XRDC2_BASE) +/** Array initializer of XRDC2 peripheral base addresses */ +#define XRDC2_BASE_ADDRS { XRDC2_BASE } +/** Array initializer of XRDC2 peripheral base pointers */ +#define XRDC2_BASE_PTRS { XRDC2 } + +/*! + * @} + */ /* end of group XRDC2_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #pragma pop +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/* No SDK compatibility issues. */ + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* XRDC2_H */ + diff --git a/platform/devices/MX8/fsl_bitaccess.h b/platform/devices/MX8/fsl_bitaccess.h new file mode 100755 index 0000000..1757e0b --- /dev/null +++ b/platform/devices/MX8/fsl_bitaccess.h @@ -0,0 +1,204 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file + * + * Header file containing register access macros. + * + * \addtogroup Peripheral_access_layer (HAL) Device Peripheral Access Layer + * + * @{ + */ + +#ifndef FSL_BITACCESS_H +#define FSL_BITACCESS_H + +/*! + * @addtogroup SCF Register Access Macros + * @{ + */ + +#include +#include + +/******************************************************************************* + * Macros for generic register access + ******************************************************************************/ + +#define wr_l(a,v) (*(volatile uint32_t *)(a) = (v)) +#define rd_l(a) (*(volatile uint32_t *)(a)) + +#define WRITE32(a,v) (*(volatile uint32_t *)(a) = (v)) +#define READ32(a) (*(volatile uint32_t *)(a)) + +/* + * Macros for single instance registers + */ + +#define BF_SET(reg, field) HW_##reg##_SET(BM_##reg##_##field) +#define BF_CLR(reg, field) HW_##reg##_CLR(BM_##reg##_##field) +#define BF_TOG(reg, field) HW_##reg##_TOG(BM_##reg##_##field) + +#define BF_SETV(reg, field, v) HW_##reg##_SET(BF_##reg##_##field(v)) +#define BF_CLRV(reg, field, v) HW_##reg##_CLR(BF_##reg##_##field(v)) +#define BF_TOGV(reg, field, v) HW_##reg##_TOG(BF_##reg##_##field(v)) + +#define BV_FLD(reg, field, sym) BF_##reg##_##field(BV_##reg##_##field##__##sym) +#define BV_VAL(reg, field, sym) BV_##reg##_##field##__##sym + +#define BF_RD(reg, field) HW_##reg.B.field +#define BF_WR(reg, field, v) BW_##reg##_##field(v) + + +/******************************************************************************* + * Macros to create bitfield mask, shift, and width from CMSIS definitions + ******************************************************************************/ + +/* Bitfield Mask */ +#define SCF_BMSK(bitfield) (bitfield ## _MASK) + +/* Bitfield Left Shift */ +#define SCF_BLSH(bitfield) (bitfield ## _SHIFT) + +/* Bitfield Value */ +#define SCF_BVAL(bitfield, val) ((val) << (SCF_BLSH(bitfield))) + + +/******************************************************************************* + * Macros to set, clear, extact, and insert bitfields into register structures + * or local variables + ******************************************************************************/ + +/* Bitfield Set */ +#define SCF_BSET(var, bitfield) ((var) |= (SCF_BMSK(bitfield))) + +/* Bitfield Clear */ +#define SCF_BCLR(var, bitfield) ((var) &= (~(SCF_BMSK(bitfield)))) + +/* Multi Bitfield Set */ +#define SCF_MSET(var, bitfield) ((var) |= (bitfield)) + +/* Multi Bitfield Clear */ +#define SCF_MCLR(var, bitfield) ((var) &= ~(bitfield)) + +/* Bitfield Extract */ +#define SCF_BEXR(var, bitfield) (((var) & (SCF_BMSK(bitfield))) >> (SCF_BLSH(bitfield))) + +/* Bitfield Insert */ +#define SCF_BINS(var, bitfield, val) ((var) = ((var) & (~(SCF_BMSK(bitfield)))) | SCF_BVAL(bitfield, (val))) + +/* Clear bit using write-1-to-clear */ +#define SCF_W1C(var, bitfield) ((var) = (SCF_BMSK(bitfield))) + +#define BSET32(X,Y) \ + *((volatile uint32_t *)(X)) = ((*((volatile uint32_t *)(X))) | (Y)) +#define BCLR32(X,Y) \ + *((volatile uint32_t *)(X)) = ((*((volatile uint32_t *)(X))) & ~(Y)) +#define CAST32(X) (*( volatile uint32_t *)(X)) + +static inline void WAIT_REM32(uint32_t regis, uint32_t val, uint32_t mask, + uint16_t read_attempts) +{ + /* Loop until value */ + while((*((volatile uint32_t *)regis) & mask) != val) + { + ; /* Intentional empty while */ + } +} + +static inline void WRM32(uint32_t address, uint32_t write_data, uint32_t mask) +{ + /* Write long */ + wr_l(address, ((rd_l(address) & ~mask) | (write_data & mask))); +} + +/******************************************************************************* + * Macros to set, clear, extact, and insert bitfields into register structures + * that support SCT + ******************************************************************************/ + +#ifdef NO_DEVICE_ACCESS +/* Simulation does not have SCT hardware and must fallback to non-SCT definitions */ + +/* SCT Bitfield Set */ +#define SCF_SCT_BSET(var, bitfield) (SCF_BSET((var).RW, bitfield)) + +/* SCT Bitfield Clear */ +#define SCF_SCT_BCLR(var, bitfield) (SCF_BCLR((var).RW, bitfield)) + +/* SCT Multi Bitfield Set */ +#define SCF_SCT_MSET(var, bitfield) (SCF_MSET((var).RW, bitfield)) + +/* SCT Multi Bitfield Set */ +#define SCF_SCT_MCLR(var, bitfield) (SCF_MCLR((var).RW, bitfield)) + +/* SCT Bitfield Insert */ +#define SCF_SCT_BINS(var, bitfield, val) (SCF_BINS((var).RW, (bitfield), (val))) + +#else +/* SCT Bitfield Set */ +#define SCF_SCT_BSET(var, bitfield) ((var).SET = SCF_BMSK(bitfield)) + +/* SCT Bitfield Clear */ +#define SCF_SCT_BCLR(var, bitfield) ((var).CLR = SCF_BMSK(bitfield)) + +/* SCT Multi Bitfield Set */ +#define SCF_SCT_MSET(var, bitfield) ((var).SET = (bitfield)) + +/* SCT Multi Bitfield Set */ +#define SCF_SCT_MCLR(var, bitfield) ((var).CLR = (bitfield)) + +/* SCT Bitfield Insert */ +#define SCF_SCT_BINS(var, bitfield, val) (SCF_BINS((var).RW, (bitfield), (val))) + +#endif /* NO_DEVICE_ACCESS */ + +/*! + * @} + */ /* end of group SCF */ + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + +#endif /* FSL_BITACCESS_H */ + +/******************************************************************************/ diff --git a/platform/devices/MX8DXL/MX8DXL.h b/platform/devices/MX8DXL/MX8DXL.h new file mode 100755 index 0000000..26b1d81 --- /dev/null +++ b/platform/devices/MX8DXL/MX8DXL.h @@ -0,0 +1,651 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8DXL.h + * @version 1.7 + * @date 2015-05-16 + * @brief CMSIS Peripheral Access Layer for MX8DXL + * + * CMSIS Peripheral Access Layer for MX8DXL + */ + +#ifndef MX8DXL_H +#define MX8DXL_H /**< Symbol preventing repeated inclusion */ + +/* Check for valid CPU versions */ +#if !defined(SREV_A0) && !defined(SREV_A1) + #error "Invalid SOC revision!\n" +#endif + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100U +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0007U + + +/* ---------------------------------------------------------------------------- + -- Memory Map (SC perspective) + ---------------------------------------------------------------------------- */ + +#define LSIO_SS_BASE1 0x00000000U /* LSIO SS - slot 1 */ +#define OCRAM_ALIAS_BASE (LSIO_SS_BASE1+0x000000U) /* OCRAM alias */ +#define SC_ROM_BASE 0x00000000U /* SC ROM */ +#define OCRAM_BASE (LSIO_SS_BASE1+0x100000U) /* OCRAM */ +#define FSPI0_MEM_BASE (LSIO_SS_BASE1+0x8000000U) /* FlexSPI0 Memory */ +#define TCML_BASE 0x1FFE0000U /* SC TCML */ +#define TCMU_BASE 0x20000000U /* SC TCMU */ +#define CAAM_BASE 0x20400000U /* SC CAAM */ +#define ADM_BASE 0x20520000U /* SC ADM */ +#define OTP_BASE 0x20530000U /* SC OTP */ +#define SNVS_BASE 0x20540000U /* SC SNVS */ +#define MU0_BASE 0x20550000U /* SECO MU 1 */ +#define V2X_SS_BASE1 0x2C000000U /* V2X */ +#define MU7_BASE (V2X_SS_BASE1+0x000000U) /* V2X MU APP0 */ +#define MU8_BASE (V2X_SS_BASE1+0x010000U) /* V2X MU APP1 */ +#define MU9_BASE (V2X_SS_BASE1+0x020000U) /* V2X MU SHE */ +#define MU10_BASE (V2X_SS_BASE1+0x030000U) /* V2X MU HSM1 */ +#define MU11_BASE (V2X_SS_BASE1+0x040000U) /* V2X MU MSH2 */ +#define MU12_BASE (V2X_SS_BASE1+0x050000U) /* V2X MU SCU/DEBUG */ +#define SCU_SS_BASE0 0x30000000U /* SCU SS - slot 0 */ +#define TCML0_BASE (SCU_SS_BASE0+0x00FE0000U) /* SCU TCML */ +#define TCMU0_BASE (SCU_SS_BASE0+0x01000000U) /* SCU TCMU */ +#define MCU_0_SS_BASE0 0x34000000U /* MCU 0 SS - slot 0 */ +#define TCML1_BASE (MCU_0_SS_BASE0+0x0FE0000U) /* MCU 0 TCML */ +#define TCMU1_BASE (MCU_0_SS_BASE0+0x1000000U) /* MCU 0 TCMU */ +#define RGPIOB_BASE (MCU_0_SS_BASE0+0x30F0000U) /* MCU 0 RGPIO */ +#define LPUART1_BASE (MCU_0_SS_BASE0+0x3220000U) /* MCU 0 LPUART */ +#define LPI2C1_BASE (MCU_0_SS_BASE0+0x3230000U) /* MCU 0 LPI2C */ +#define WDOG1_BASE (MCU_0_SS_BASE0+0x3420000U) /* MCU 0 WDOG */ +#define MU13_BASE (MCU_0_SS_BASE0+0x3480000U) /* MCU 0 MU 1A */ +#define SYSCTR_CTRL_BASE 0x40000000U /* SC SYSCTR Control */ +#define SYSCTR_RD_BASE 0x40010000U /* SC SYSCTR Read */ +#define SYSCTR_CMP_BASE 0x40020000U /* SC SYSCTR Compare 0 */ +#define SYSCTR_CMP1_BASE 0x40020100U /* SC SYSCTR Compare 1 */ +#define LPC_BASE 0x40070000U /* SC LPC */ +#define CSGPR_BASE 0x40470000U /* CoreSight GPR */ +#define AP_1_DEBUG_APB_BASE 0x40600000U /* AP_1 Debug APB */ +#define AP_0_DEBUG_APB_BASE 0x40800000U /* AP_0 Debug APB */ +#define AP_2_DEBUG_APB_BASE 0x40800000U /* AP_2 Debug APB */ +#define RGPIOA_BASE 0x410F0000U /* SC RGPIO */ +#define LPIT0_BASE 0x41210000U /* SC LPIT */ +#define LPUART0_BASE 0x41220000U /* SC LPUART */ +#define LPI2C0_BASE 0x41230000U /* SC LPI2C */ +#define ASMC_BASE 0x41410000U /* SC ASMC */ +#define WDOG0_BASE 0x41420000U /* SC WDOG */ +#define MU1_BASE 0x41430000U /* SC MU 0B */ +#define MU2_BASE 0x41440000U /* SC MU 0A0 */ +#define MU3_BASE 0x41450000U /* SC MU 0A1 */ +#define MU4_BASE 0x41460000U /* SC MU 0A2 */ +#define MU5_BASE 0x41470000U /* SC MU 0A3 */ +#define MU6_BASE 0x41480000U /* SC MU 1A */ +#define MSI0_BASE 0x41800000U /* SC DSC MSI Ring 0 */ +#define DSC1_BASE 0x41820000U /* SC SC DSC */ +#define REP2_BASE 0x4182B000U /* SC MBIST MTR */ +#define MSI1_BASE 0x41A00000U /* SC DSC MSI Ring 1 */ +#define DSC19_BASE 0x41A60000U /* SC ADMA DSC */ +#define DSC22_BASE 0x41AC0000U /* SC MCU_0 DSC */ +#define DSC25_BASE 0x41B20000U /* SC CONN DSC */ +#define MSI2_BASE 0x41C00000U /* SC DSC MSI Ring 2 */ +#define DSC36_BASE 0x41C80000U /* SC DRC_0 DSC */ +#define DSC38_BASE 0x41CC0000U /* SC HSIO DSC */ +#define MSI3_BASE 0x41E00000U /* SC DSC MSI Ring 3 */ +#define DSC50_BASE 0x41E40000U /* SC DB DSC */ +#define DSC53_BASE 0x41EA0000U /* SC AP_2 DSC */ +#define DSC56_BASE 0x41F00000U /* SC LSIO DSC */ +#define PAD_BASE 0x41F80000U /* SC Pad */ +#define MSI4_BASE 0x41F9F000U /* SC Pad MSI Ring 0 */ +#define MSI5_BASE 0x41FBF000U /* SC Pad MSI Ring 1 */ +#define MSI6_BASE 0x41FDF000U /* SC Pad MSI Ring 2 */ +#define MSI7_BASE 0x41FFF000U /* SC Pad MSI Ring 3 */ +#define ADMA_SS_BASE2 0x51000000U /* ADMA SS - slot 2 */ +#define IRQSTR_SCU_BASE (ADMA_SS_BASE2+0x060000U) /* IRQSTR.SCU1 */ +#define GIC0_BASE (ADMA_SS_BASE2+0xA00000U) /* GIC 0 */ +#define ADMA_SS_BASE0 0x59000000U /* ADMA SS - slot 0 */ +#define DMA0_BASE (ADMA_SS_BASE0+0x1F0000U) /* ADMA eDMA 0 MP */ +#define ADMA_SS_BASE1 0x5A000000U /* ADMA SS - slot 1 */ +#define LPUART2_BASE (ADMA_SS_BASE1+0x060000U) /* ADMA LPUART 0 */ +#define LPUART3_BASE (ADMA_SS_BASE1+0x070000U) /* ADMA LPUART 1 */ +#define LPUART4_BASE (ADMA_SS_BASE1+0x080000U) /* ADMA LPUART 2 */ +#define LPUART5_BASE (ADMA_SS_BASE1+0x090000U) /* ADMA LPUART 3 */ +#define DMA1_BASE (ADMA_SS_BASE1+0x1F0000U) /* ADMA eDMA 2 MP */ +#define LPI2C2_BASE (ADMA_SS_BASE1+0x800000U) /* ADMA LPI2C 0 */ +#define LPI2C3_BASE (ADMA_SS_BASE1+0x810000U) /* ADMA LPI2C 1 */ +#define LPI2C4_BASE (ADMA_SS_BASE1+0x820000U) /* ADMA LPI2C 2 */ +#define LPI2C5_BASE (ADMA_SS_BASE1+0x830000U) /* ADMA LPI2C 3 */ +#define DMA2_BASE (ADMA_SS_BASE1+0x9F0000U) /* ADMA eDMA 3 MP */ +#define CONN_SS_BASE0 0x5B000000U /* CONN SS - slot 0 */ +#define SDHC0_BASE (CONN_SS_BASE0+0x010000U) /* CONN SDHC 0 */ +#define SDHC1_BASE (CONN_SS_BASE0+0x020000U) /* CONN SDHC 1 */ +#define SDHC2_BASE (CONN_SS_BASE0+0x030000U) /* CONN SDHC 2 */ +#define ENET0_BASE (CONN_SS_BASE0+0x040000U) /* CONN ENET 0 */ +#define ENET1_BASE (CONN_SS_BASE0+0x050000U) /* CONN ENET 1 */ +#define USB_0_BASE (CONN_SS_BASE0+0x0D0000U) /* CONN USB 0 */ +#define USB_1_BASE (CONN_SS_BASE0+0x0E0000U) /* CONN USB 1 */ +#define USB_0_PHY_BASE (CONN_SS_BASE0+0x100000U) /* CONN USB 0 PHY */ +#define USB_1_PHY_BASE (CONN_SS_BASE0+0x110000U) /* CONN USB 1 PHY */ +#define ENET0_LPCG (CONN_SS_BASE0+0x230000U) /* CONN ENET 0 LPCG */ +#define NAND_BASE (CONN_SS_BASE0+0x810000U) /* CONN NAND */ +#define DB_SS_BASE0 0x5C000000U /* DB SS - slot 0 */ +#define DRC_LPCG_2 (DB_SS_BASE0+0x080000U) /* DRC LPCG 2 */ +#define DRC_LPCG_4 (DB_SS_BASE0+0x0B0000U) /* DRC LPCG 4 */ +#define DRC_LPCG_0 (DB_SS_BASE0+0x0C0000U) /* DRC LPCG 0 */ +#define DRC_LPCG_1 (DB_SS_BASE0+0x0D0000U) /* DRC LPCG 1 */ +#define DRC_LPCG_3 (DB_SS_BASE0+0x0F0000U) /* DRC LPCG 3 */ +#define DB_NIC0_GPV (DB_SS_BASE0+0x400000U) /* DB NIC0 GPV */ +#define DB_LPCG_PG0_BASE (DB_SS_BASE0+0x4F0000U) /* DB PG0 LPCG */ +#define DB_LPCG_PG1_BASE (DB_SS_BASE0+0x5F0000U) /* DB PG1 LPCG */ +#define DB_LPCG_PG2_BASE (DB_SS_BASE0+0x6F0000U) /* DB PG2 LPCG */ +#define DB_LPCG_BN_BASE (DB_SS_BASE0+0xAF0000U) /* DB BN LPCG */ +#define LSIO_SS_BASE0 0x5D000000U /* LSIO SS - slot 0 */ +#define PWM0_BASE (LSIO_SS_BASE0+0x000000U) /* LSIO PWM 0 */ +#define PWM1_BASE (LSIO_SS_BASE0+0x010000U) /* LSIO PWM 1 */ +#define PWM2_BASE (LSIO_SS_BASE0+0x020000U) /* LSIO PWM 2 */ +#define PWM3_BASE (LSIO_SS_BASE0+0x030000U) /* LSIO PWM 3 */ +#define PWM4_BASE (LSIO_SS_BASE0+0x040000U) /* LSIO PWM 4 */ +#define PWM5_BASE (LSIO_SS_BASE0+0x050000U) /* LSIO PWM 5 */ +#define PWM6_BASE (LSIO_SS_BASE0+0x060000U) /* LSIO PWM 6 */ +#define PWM7_BASE (LSIO_SS_BASE0+0x070000U) /* LSIO PWM 7 */ +#define GPIO0_BASE (LSIO_SS_BASE0+0x080000U) /* LSIO GPIO 0 */ +#define GPIO1_BASE (LSIO_SS_BASE0+0x090000U) /* LSIO GPIO 1 */ +#define GPIO2_BASE (LSIO_SS_BASE0+0x0A0000U) /* LSIO GPIO 2 */ +#define GPIO3_BASE (LSIO_SS_BASE0+0x0B0000U) /* LSIO GPIO 3 */ +#define GPIO4_BASE (LSIO_SS_BASE0+0x0C0000U) /* LSIO GPIO 4 */ +#define GPIO5_BASE (LSIO_SS_BASE0+0x0D0000U) /* LSIO GPIO 5 */ +#define GPIO6_BASE (LSIO_SS_BASE0+0x0E0000U) /* LSIO GPIO 6 */ +#define GPIO7_BASE (LSIO_SS_BASE0+0x0F0000U) /* LSIO GPIO 7 */ +#define FSPI0_BASE (LSIO_SS_BASE0+0x120000U) /* FSPI0 */ +#define FSPI1_BASE (LSIO_SS_BASE0+0x130000U) /* FSPI1 */ +#define GPT0_BASE (LSIO_SS_BASE0+0x140000U) /* LSIO GPT 0 */ +#define GPT1_BASE (LSIO_SS_BASE0+0x150000U) /* LSIO GPT 1 */ +#define GPT2_BASE (LSIO_SS_BASE0+0x160000U) /* LSIO GPT 2 */ +#define GPT3_BASE (LSIO_SS_BASE0+0x170000U) /* LSIO GPT 3 */ +#define GPT4_BASE (LSIO_SS_BASE0+0x180000U) /* LSIO GPT 4 */ +#define KPP_BASE (LSIO_SS_BASE0+0x1A0000U) /* LSIO KPP */ +#define MU14_BASE (LSIO_SS_BASE0+0x1B0000U) /* LSIO MU 0A */ +#define MU15_BASE (LSIO_SS_BASE0+0x1C0000U) /* LSIO MU 1A */ +#define MU16_BASE (LSIO_SS_BASE0+0x1D0000U) /* LSIO MU 2A */ +#define MU17_BASE (LSIO_SS_BASE0+0x1E0000U) /* LSIO MU 3A */ +#define MU18_BASE (LSIO_SS_BASE0+0x1F0000U) /* LSIO MU 4A */ +#define IEE_BASE (LSIO_SS_BASE0+0x320000U) /* IEE */ +#define IEE_R0_BASE (LSIO_SS_BASE0+0x330000U) /* IEE R0 */ +#define IEE_R1_BASE (LSIO_SS_BASE0+0x340000U) /* IEE R1 */ +#define HSIO_0_SS_BASE0 0x5F000000U /* HSIO 0 SS - slot 0 */ +#define HSIO_0_LPCG_GPIO (HSIO_0_SS_BASE0+0x100000U) /* HSIO 0 GPIO LPCG */ +#define HSIO_0_SS_BASE2 0x70000000U /* HSIO 0 SS - slot 2 */ +#define DDR_BASE0 0x80000000U /* DDR */ +#define MCM_BASE 0xE0080000U /* SC MCM */ +#define LMEM_BASE 0xE0082000U /* SC LMEM */ +#define DDR_BASE0_END 0xFFFFFFFFU /* Top of DDR 0 */ +#define LSIO_SS_BASE2 0x400000000ULL /* LSIO SS - slot 2 */ +#define FSPI1_MEM_BASE (LSIO_SS_BASE2+0x0U) /* FlexSPI1 Memory */ +#define DDR_BASE1 0x880000000ULL /* DDR - high mem */ +#define DDR_BASE1_END 0xFFFFFFFFFULL /* Top of DDR 1 */ + +/* Unused */ + +#define DSC2_BASE 0 +#define DSC3_BASE 0 +#define DSC4_BASE 0 +#define DSC5_BASE 0 +#define DSC6_BASE 0 +#define DSC7_BASE 0 +#define DSC8_BASE 0 +#define DSC9_BASE 0 +#define DSC10_BASE 0 +#define DSC11_BASE 0 +#define DSC12_BASE 0 +#define DSC13_BASE 0 +#define DSC14_BASE 0 +#define DSC15_BASE 0 +#define DSC17_BASE 0 +#define DSC18_BASE 0 +#define DSC20_BASE 0 +#define DSC21_BASE 0 +#define DSC23_BASE 0 +#define DSC24_BASE 0 +#define DSC26_BASE 0 +#define DSC27_BASE 0 +#define DSC28_BASE 0 +#define DSC29_BASE 0 +#define DSC30_BASE 0 +#define DSC31_BASE 0 +#define DSC33_BASE 0 +#define DSC34_BASE 0 +#define DSC35_BASE 0 +#define DSC37_BASE 0 +#define DSC39_BASE 0 +#define DSC40_BASE 0 +#define DSC41_BASE 0 +#define DSC42_BASE 0 +#define DSC43_BASE 0 +#define DSC44_BASE 0 +#define DSC45_BASE 0 +#define DSC46_BASE 0 +#define DSC47_BASE 0 +#define DSC49_BASE 0 +#define DSC51_BASE 0 +#define DSC52_BASE 0 +#define DSC54_BASE 0 +#define DSC55_BASE 0 +#define DSC57_BASE 0 +#define DSC58_BASE 0 +#define DSC59_BASE 0 +#define DSC60_BASE 0 +#define DSC61_BASE 0 +#define DSC62_BASE 0 +#define DSC63_BASE 0 +#define WDOG2_BASE 0 +#define RGPIOC_BASE 0 +#define LPI2C6_BASE 0 +#define LPI2C7_BASE 0 +#define LPI2C8_BASE 0 +#define LPI2C9_BASE 0 +#define LPI2C10_BASE 0 +#define LPI2C11_BASE 0 +#define LPI2C12_BASE 0 +#define LPI2C13_BASE 0 +#define LPI2C14_BASE 0 +#define LPI2C15_BASE 0 +#define LPI2C16_BASE 0 +#define LPI2C17_BASE 0 +#define LPI2C18_BASE 0 +#define LPI2C19_BASE 0 +#define LPI2C20_BASE 0 +#define LPI2C21_BASE 0 +#define LPI2C22_BASE 0 +#define LPI2C23_BASE 0 +#define LPI2C24_BASE 0 +#define LPI2C25_BASE 0 +#define LPUART6_BASE 0 +#define LPUART7_BASE 0 +#define LPUART8_BASE 0 +#define DMA3_BASE 0 +#define DMA4_BASE 0 +#define DMA5_BASE 0 +#define DMA6_BASE 0 +#define ISI0_BASE 0 +#define ISI1_BASE 0 +#define ISI2_BASE 0 +#define ISI3_BASE 0 +#define ISI4_BASE 0 +#define ISI5_BASE 0 +#define ISI6_BASE 0 +#define ISI7_BASE 0 +#define ISI8_BASE 0 +#define ISI9_BASE 0 +#define ISI10_BASE 0 +#define ISI11_BASE 0 +#define ISI12_BASE 0 +#define ISI13_BASE 0 +#define ISI14_BASE 0 +#define ISI15_BASE 0 +#define ISI16_BASE 0 +#define ISI17_BASE 0 +#define ISI18_BASE 0 +#define ISI19_BASE 0 +#define ISI20_BASE 0 +#define ISI21_BASE 0 +#define ISI22_BASE 0 +#define ISI23_BASE 0 +#define MU19_BASE 0 +#define MU20_BASE 0 +#define MU21_BASE 0 +#define MU22_BASE 0 +#define MU23_BASE 0 +#define MU24_BASE 0 +#define STC0_BASE 0 +#define STC1_BASE 0 +#define STC2_BASE 0 +#define STC3_BASE 0 +#define STC4_BASE 0 +#define STC5_BASE 0 +#define STC6_BASE 0 +#define STC7_BASE 0 +#define STC8_BASE 0 +#define STC9_BASE 0 +#define STC10_BASE 0 +#define STC11_BASE 0 +#define STC12_BASE 0 +#define STC13_BASE 0 +#define STC14_BASE 0 +#define STC15_BASE 0 +#define STC16_BASE 0 +#define STC17_BASE 0 +#define STC18_BASE 0 +#define STC19_BASE 0 +#define STC20_BASE 0 +#define STC21_BASE 0 +#define STC22_BASE 0 +#define STC23_BASE 0 + + +/* ---------------------------------------------------------------------------- + -- Device Mapping + ---------------------------------------------------------------------------- */ + +#define DMA_AUDIO0 DMA0 +#define DMA_PERIPH0 DMA1 +#define DMA_PERIPH1 DMA2 +#define DSC_SC DSC1 +#define DSC_ADMA DSC19 +#define DSC_MCU_0 DSC22 +#define DSC_CONN DSC25 +#define DSC_DRC_0 DSC36 +#define DSC_HSIO DSC38 +#define DSC_DB DSC50 +#define DSC_AP_2 DSC53 +#define DSC_LSIO DSC56 +#define GPIO_SC RGPIOA +#define GPIO_MCU_0 RGPIOB +#define LPI2C_SC LPI2C0 +#define LPI2C_MCU_0 LPI2C1 +#define LPI2C_0 LPI2C2 +#define LPI2C_1 LPI2C3 +#define LPI2C_2 LPI2C4 +#define LPI2C_3 LPI2C5 +#define LPIT_SC LPIT0 +#define LPUART_SC LPUART0 +#define LPUART_MCU_0 LPUART1 +#define LPUART_0 LPUART2 +#define LPUART_1 LPUART3 +#define LPUART_2 LPUART4 +#define LPUART_3 LPUART5 +#define MU_SECO MU0 +#define MU_SC_0B MU1 +#define MU_SC_0A0 MU2 +#define MU_SC_0A1 MU3 +#define MU_SC_0A2 MU4 +#define MU_SC_0A3 MU5 +#define MU_SC_1A MU6 +#define MU_V2X_0A MU7 +#define MU_V2X_1A MU8 +#define MU_V2X_2A MU9 +#define MU_V2X_3A MU10 +#define MU_V2X_4A MU11 +#define MU_V2X MU12 +#define MU_MCU_0_1A MU13 +#define MU_LSIO_0A MU14 +#define MU_LSIO_1A MU15 +#define MU_LSIO_2A MU16 +#define MU_LSIO_3A MU17 +#define MU_LSIO_4A MU18 +#define TCMU_SC TCMU0_BASE +#define TCMU_MCU_0 TCMU1_BASE +#define TCML_SC TCML0_BASE +#define TCML_MCU_0 TCML1_BASE +#define WDOG_SC WDOG0 +#define WDOG_MCU_0 WDOG1 + +/* ---------------------------------------------------------------------------- + -- CoreSight Granular Power Requestor Mappings + ---------------------------------------------------------------------------- */ +#define CSGPR_CPWRUPREQ (CSGPR_BASE+0x000U) +#define CSGPR_CPWRUPACK (CSGPR_BASE+0x004U) +#define CSGPR_CLAIMSET (CSGPR_BASE+0xFA0U) +#define CSGPR_CLAIMCLR (CSGPR_BASE+0xFA4U) +#define CSGPR_LAR (CSGPR_BASE+0xFB0U) +#define CSGPR_LSR (CSGPR_BASE+0xFB4U) + +#define CSGPR_IDX_A35 5U +#define CSGPR_IDX_MCU_0 6U + +#define CSGPR_XOR_DSC_REG 1U +#define CSGPR_XOR_DSC_MASK 0x0000FFFFU +#define CSGPR_ACK_DSC_REG 2U +#define CSGPR_ACK_DSC_MASK 0xFFFF0000U + +/* ---------------------------------------------------------------------------- + -- GIC Mappings + ---------------------------------------------------------------------------- */ +#define GICD_BASE (GIC0_BASE+0x000000U) +#define GICR_BASE (GIC0_BASE+0x100000U) + +#define GICD_CTLR_OFS (0x0000U) +#define GICD_CTLR_RWP_MASK (0x80000000U) + +#define GICR_WAKER_OFS (0x0014U) +#define GICR_WAKER_PA_MASK (0x00000002U) +#define GICR_WAKER_CA_MASK (0x00000004U) + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers Interrupt vector numbers + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 256 /**< Number of interrupts in the Vector table */ + + /* Auxiliary constants */ +#define NotAvail_IRQn -128 /**< Not available device specific interrupt */ + + /* Core interrupts */ +#define NonMaskableInt_IRQn -14 /**< Non Maskable Interrupt */ +#define HardFault_IRQn -13 /**< Cortex-M4 SV Hard Fault Interrupt */ +#define MemoryManagement_IRQn -12 /**< Cortex-M4 Memory Management Interrupt */ +#define BusFault_IRQn -11 /**< Cortex-M4 Bus Fault Interrupt */ +#define UsageFault_IRQn -10 /**< Cortex-M4 Usage Fault Interrupt */ +#define SVCall_IRQn -5 /**< Cortex-M4 SV Call Interrupt */ +#define DebugMonitor_IRQn -4 /**< Cortex-M4 Debug Monitor Interrupt */ +#define PendSV_IRQn -2 /**< Cortex-M4 Pend SV Interrupt */ +#define SysTick_IRQn -1 /**< Cortex-M4 System Tick Interrupt */ + + /* Device specific interrupts */ +#define Reserved0_IRQn 0 /**< Reserved interrupt */ +#define Reserved1_IRQn 1 /**< Reserved interrupt */ +#define Reserved2_IRQn 2 /**< Reserved interrupt */ +#define Reserved3_IRQn 3 /**< Reserved interrupt */ +#define Reserved4_IRQn 4 /**< Reserved interrupt */ +#define MCM_IRQn 5 /**< MCM interrupt */ +#define DebugWake_IRQn 6 /**< Debug wake interrupt */ +#define OCOTP_Bank0_IRQn 7 /**< OCOTP bank0 interrupt */ +#define Reserved8_IRQn 8 /**< Reserved interrupt */ +#define Reserved9_IRQn 9 /**< Reserved interrupt */ +#define INTMUX0_8_IRQn 10 /**< INTMUX0_8 interrupt */ +#define INTMUX0_9_IRQn 11 /**< INTMUX0_9 interrupt */ +#define INTMUX0_10_IRQn 12 /**< INTMUX0_10 interrupt */ +#define INTMUX0_11_IRQn 13 /**< INTMUX0_11 interrupt */ +#define INTMUX0_12_IRQn 14 /**< INTMUX0_12 interrupt */ +#define INTMUX0_13_IRQn 15 /**< INTMUX0_13 interrupt */ +#define INTMUX0_14_IRQn 16 /**< INTMUX0_14 interrupt */ +#define INTMUX0_15_IRQn 17 /**< INTMUX0_15 interrupt */ +#define Reserved18_IRQn 18 /**< Reserved interrupt */ +#define TPM0_IRQn 19 /**< TPM0 interrupt */ +#define Reserved20_IRQn 20 /**< Reserved interrupt */ +#define Reserved21_IRQn 21 /**< Reserved interrupt */ +#define LPIT0_IRQn 22 /**< LPIT0 interrupt */ +#define Reserved23_IRQn 23 /**< Reserved interrupt */ +#define Reserved24_IRQn 24 /**< Reserved interrupt */ +#define LPUART0_IRQn 25 /**< LPUART0 interrupt */ +#define Reserved26_IRQn 26 /**< Reserved interrupt */ +#define LPI2C0_IRQn 27 /**< LPI2C0 interrupt */ +#define Reserved28_IRQn 28 /**< Reserved interrupt */ +#define MU0_B0_IRQn 29 /**< MU0_B0 interrupt */ +#define SECO_MU_NMI_IRQn 30 /**< SECO_MU_NMI interrupt */ +#define SECO_MU_IRQn 31 /**< SECO_MU interrupt */ +#define INTMUX0_0_IRQn 32 /**< INTMUX0_0 interrupt */ +#define INTMUX0_1_IRQn 33 /**< INTMUX0_1 interrupt */ +#define INTMUX0_2_IRQn 34 /**< INTMUX0_2 interrupt */ +#define INTMUX0_3_IRQn 35 /**< INTMUX0_3 interrupt */ +#define INTMUX0_4_IRQn 36 /**< INTMUX0_4 interrupt */ +#define INTMUX0_5_IRQn 37 /**< INTMUX0_5 interrupt */ +#define INTMUX0_6_IRQn 38 /**< INTMUX0_6 interrupt */ +#define INTMUX0_7_IRQn 39 /**< INTMUX0_7 interrupt */ +#define SYSCTR_CMP3_IRQn 40 /**< SYSCTR_CMP3 interrupt */ +#define SYSCTR_CMP2_IRQn 41 /**< SYSCTR_CMP2 interrupt */ +#define SYSCTR_CMP1_IRQn 42 /**< SYSCTR_CMP1 interrupt */ +#define SYSCTR_CMP0_IRQn 43 /**< SYSCTR_CMP0 interrupt */ +#define MU0_B1_IRQn 44 /**< MU0_B1 interrupt */ +#define MU0_B2_IRQn 45 /**< MU0_B2 interrupt */ +#define MU0_B3_IRQn 46 /**< MU0_B3 interrupt */ +#define PMIC_INT_IRQn 47 /**< PMIC_INT interrupt */ +#define PMIC_EarlyWarning_IRQn 48 /**< PMIC_EarlyWarning interrupt */ +#define MU1_A_IRQn 49 /**< MU1_A interrupt */ +#define SWI_IRQn 50 /**< Software interrupt */ +#define Reserved51_IRQn 51 /**< Reserved interrupt */ +#define CAAM_IRQ0_IRQn 52 /**< CAAM_IRQ0 interrupt */ +#define CAAM_IRQ1_IRQn 53 /**< CAAM_IRQ1 interrupt */ +#define CAAM_IRQ2_IRQn 54 /**< CAAM_IRQ2 interrupt */ +#define CAAM_IRQ3_IRQn 55 /**< CAAM_IRQ3 interrupt */ +#define CAAM_RTIC_IRQn 56 /**< CAAM_RTIC interrupt */ +#define CAAM_Error_IRQn 57 /**< CAAM_Error interrupt */ +#define SNVS_Functional_IRQn 58 /**< SNVS_Functional interrupt */ +#define SNVS_SecurityViolation_IRQn 59 /**< SNVS_SecurityViolation interrupt */ +#define SNVS_Periodic_IRQn 60 /**< SNVS_Periodic interrupt */ +#define SNVS_Button_IRQn 61 /**< SNVS_Button interrupt */ +#define SNVS_Alarm_IRQn 62 /**< Reserved interrupt */ +#define SNVS_PowerOff_IRQn 63 /**< Reserved interrupt */ +#define DSC00_IRQn 64 /**< DSC0 interrupt */ +#define DSC_SCU_IRQn 64 /**< DSC0 interrupt */ +#define DSC_DB_IRQn 65 /**< DSC1 interrupt */ +#define DSC02_IRQn 66 /**< DSC2 interrupt */ +#define DSC03_IRQn 67 /**< DSC3 interrupt */ +#define DSC_HSIO_IRQn 68 /**< DSC4 interrupt */ +#define DSC05_IRQn 69 /**< DSC5 interrupt */ +#define DSC06_IRQn 70 /**< DSC6 interrupt */ +#define DSC_CM4_0_IRQn 71 /**< DSC7 interrupt */ +#define DSC08_IRQn 72 /**< DSC8 interrupt */ +#define DSC09_IRQn 73 /**< DSC9 interrupt */ +#define DSC_LSIO_IRQn 74 /**< DSC10 interrupt */ +#define DSC11_IRQn 75 /**< DSC11 interrupt */ +#define DSC_CA35_IRQn 76 /**< DSC12 interrupt */ +#define DSC13_IRQn 77 /**< DSC13 interrupt */ +#define DSC14_IRQn 78 /**< DSC14 interrupt */ +#define DSC15_IRQn 79 /**< DSC15 interrupt */ +#define DSC_Connectivity_IRQn 80 /**< DSC16 interrupt */ +#define DSC17_IRQn 81 /**< DSC17 interrupt */ +#define DSC18_IRQn 82 /**< DSC18 interrupt */ +#define DSC19_IRQn 83 /**< DSC19 interrupt */ +#define DSC20_IRQn 84 /**< DSC20 interrupt */ +#define DSC21_IRQn 85 /**< DSC21 interrupt */ +#define DSC_DRC_0_IRQn 86 /**< DSC22 interrupt */ +#define DSC23_IRQn 87 /**< DSC23 interrupt */ +#define DSC24_IRQn 88 /**< DSC24 interrupt */ +#define DSC25_IRQn 89 /**< DSC25 interrupt */ +#define DSC26_IRQn 90 /**< DSC26 interrupt */ +#define DSC27_IRQn 91 /**< DSC27 interrupt */ +#define DSC_ADMA_IRQn 92 /**< DSC28 interrupt */ +#define DSC29_IRQn 93 /**< DSC29 interrupt */ +#define DSC30_IRQn 94 /**< DSC30 interrupt */ +#define DSC31_IRQn 95 /**< DSC31 interrupt */ +#define IOMUX31_IRQn 96 /**< IOMUX31 interrupt */ +#define IOMUX30_IRQn 97 /**< IOMUX30 interrupt */ +#define IOMUX29_IRQn 98 /**< IOMUX29 interrupt */ +#define IOMUX28_IRQn 99 /**< IOMUX28 interrupt */ +#define IOMUX27_IRQn 100 /**< IOMUX27 interrupt */ +#define IOMUX26_IRQn 101 /**< IOMUX26 interrupt */ +#define IOMUX25_IRQn 102 /**< IOMUX25 interrupt */ +#define IOMUX24_IRQn 103 /**< IOMUX24 interrupt */ +#define IOMUX23_IRQn 104 /**< IOMUX23 interrupt */ +#define IOMUX22_IRQn 105 /**< IOMUX22 interrupt */ +#define IOMUX21_IRQn 106 /**< IOMUX21 interrupt */ +#define IOMUX20_IRQn 107 /**< IOMUX20 interrupt */ +#define IOMUX19_IRQn 108 /**< IOMUX19 interrupt */ +#define IOMUX18_IRQn 109 /**< IOMUX18 interrupt */ +#define IOMUX17_IRQn 110 /**< IOMUX17 interrupt */ +#define IOMUX16_IRQn 111 /**< IOMUX16 interrupt */ +#define IOMUX15_IRQn 112 /**< IOMUX15 interrupt */ +#define IOMUX14_IRQn 113 /**< IOMUX14 interrupt */ +#define IOMUX13_IRQn 114 /**< IOMUX13 interrupt */ +#define IOMUX12_IRQn 115 /**< IOMUX12 interrupt */ +#define IOMUX11_IRQn 116 /**< IOMUX11 interrupt */ +#define IOMUX10_IRQn 117 /**< IOMUX10 interrupt */ +#define IOMUX9_IRQn 118 /**< IOMUX9 interrupt */ +#define IOMUX8_IRQn 119 /**< IOMUX8 interrupt */ +#define IOMUX7_IRQn 120 /**< IOMUX7 interrupt */ +#define IOMUX6_IRQn 121 /**< IOMUX6 interrupt */ +#define IOMUX5_IRQn 122 /**< IOMUX5 interrupt */ +#define IOMUX4_IRQn 123 /**< IOMUX4 interrupt */ +#define IOMUX3_IRQn 124 /**< IOMUX3 interrupt */ +#define IOMUX2_IRQn 125 /**< IOMUX2 interrupt */ +#define IOMUX1_IRQn 126 /**< IOMUX1 interrupt */ +#define IOMUX0_IRQn 127 /**< IOMUX0 interrupt */ +#define NUM_NVIC_IRQn 128 /**< Number of NVIC interrupts */ + +typedef int IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers */ + + +/* ---------------------------------------------------------------------------- + -- Cortex M Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex-M Core Configuration + * @{ + */ + +#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 0 /**< Vendor specific implementation of SysTickConfig is defined */ +#define __FPU_PRESENT 1 /**< Defines if an FPU is present or not */ + +#include "core_cm4.h" /* Core Peripheral Access Layer */ +#include "system_MX8DXL.h" /* Device specific configuration file */ + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t LDRD (const __IO uint32_t *addr) +{ + union + { + uint32_t w32[2]; + uint64_t w64; + } llr; + + __ASM volatile ("ldrd %0, %1, %2" : "=r" (llr.w32[0]), "=r" (llr.w32[1]) : "Q" (*addr) ); + + return(llr.w64); +} + +/*! + * @} + */ /* end of group Cortex_Core_Configuration */ + +#endif /* MX8DXL_H */ + +/* MX8DXL.h, eof. */ diff --git a/platform/devices/MX8DXL/MX8DXL_features.h b/platform/devices/MX8DXL/MX8DXL_features.h new file mode 100755 index 0000000..87fdd21 --- /dev/null +++ b/platform/devices/MX8DXL/MX8DXL_features.h @@ -0,0 +1,461 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef MX8_FEATURES_H +#define MX8_FEATURES_H + +/* SOC module features */ + +/* @brief ACMP availability on the SoC. */ +#define FSL_FEATURE_SOC_ACMP_COUNT (0U) +/* @brief ADC16 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC16_COUNT (0U) +/* @brief ADC12 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC12_COUNT (0U) +/* @brief AFE availability on the SoC. */ +#define FSL_FEATURE_SOC_AFE_COUNT (0U) +/* @brief AIPS availability on the SoC. */ +#define FSL_FEATURE_SOC_AIPS_COUNT (0U) +/* @brief AOI availability on the SoC. */ +#define FSL_FEATURE_SOC_AOI_COUNT (0U) +/* @brief AXBS availability on the SoC. */ +#define FSL_FEATURE_SOC_AXBS_COUNT (0U) +/* @brief ASMC availability on the SoC. */ +#define FSL_FEATURE_SOC_ASMC_COUNT (0U) +/* @brief CADC availability on the SoC. */ +#define FSL_FEATURE_SOC_CADC_COUNT (0U) +/* @brief FLEXCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXCAN_COUNT (0U) +/* @brief MMCAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMCAU_COUNT (0U) +/* @brief CMP availability on the SoC. */ +#define FSL_FEATURE_SOC_CMP_COUNT (0U) +/* @brief CMT availability on the SoC. */ +#define FSL_FEATURE_SOC_CMT_COUNT (0U) +/* @brief CNC availability on the SoC. */ +#define FSL_FEATURE_SOC_CNC_COUNT (0U) +/* @brief CRC availability on the SoC. */ +#define FSL_FEATURE_SOC_CRC_COUNT (0U) +/* @brief DAC availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC_COUNT (0U) +/* @brief DAC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC32_COUNT (0U) +/* @brief DCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_DCDC_COUNT (0U) +/* @brief DDR availability on the SoC. */ +#define FSL_FEATURE_SOC_DDR_COUNT (1U) +/* @brief DMA availability on the SoC. */ +#define FSL_FEATURE_SOC_DMA_COUNT (0U) +/* @brief DMAMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_DMAMUX_COUNT (0U) +/* @brief DRY availability on the SoC. */ +#define FSL_FEATURE_SOC_DRY_COUNT (0U) +/* @brief DSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_DSPI_COUNT (0U) +/* @brief EDMA availability on the SoC. */ +#define FSL_FEATURE_SOC_EDMA_COUNT (5U) +/* @brief EMVSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_EMVSIM_COUNT (0U) +/* @brief ENC availability on the SoC. */ +#define FSL_FEATURE_SOC_ENC_COUNT (0U) +/* @brief ENET availability on the SoC. */ +#define FSL_FEATURE_SOC_ENET_COUNT (0U) +/* @brief EWM availability on the SoC. */ +#define FSL_FEATURE_SOC_EWM_COUNT (0U) +/* @brief FB availability on the SoC. */ +#define FSL_FEATURE_SOC_FB_COUNT (0U) +/* @brief FGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FGPIO_COUNT (1U) +/* @brief FLEXIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXIO_COUNT (0U) +/* @brief FMC availability on the SoC. */ +#define FSL_FEATURE_SOC_FMC_COUNT (0U) +/* @brief FSKDT availability on the SoC. */ +#define FSL_FEATURE_SOC_FSKDT_COUNT (0U) +/* @brief FTFA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFA_COUNT (0U) +/* @brief FTFE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFE_COUNT (0U) +/* @brief FTFL availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFL_COUNT (0U) +/* @brief FTM availability on the SoC. */ +#define FSL_FEATURE_SOC_FTM_COUNT (0U) +/* @brief FTMRA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRA_COUNT (0U) +/* @brief FTMRE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRE_COUNT (0U) +/* @brief FTMRH availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRH_COUNT (0U) +/* @brief GPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_GPIO_COUNT (2U) +/* @brief IGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_IGPIO_COUNT (8U) +/* @brief HSADC availability on the SoC. */ +#define FSL_FEATURE_SOC_HSADC_COUNT (0U) +/* @brief I2C availability on the SoC. */ +#define FSL_FEATURE_SOC_I2C_COUNT (0U) +/* @brief I2S availability on the SoC. */ +#define FSL_FEATURE_SOC_I2S_COUNT (0U) +/* @brief ICS availability on the SoC. */ +#define FSL_FEATURE_SOC_ICS_COUNT (0U) +/* @brief IRQ availability on the SoC. */ +#define FSL_FEATURE_SOC_IRQ_COUNT (0U) +/* @brief INTMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_INTMUX_COUNT (0U) +/* @brief KBI availability on the SoC. */ +#define FSL_FEATURE_SOC_KBI_COUNT (0U) +/* @brief SLCD availability on the SoC. */ +#define FSL_FEATURE_SOC_SLCD_COUNT (0U) +/* @brief LCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_LCDC_COUNT (0U) +/* @brief LDO availability on the SoC. */ +#define FSL_FEATURE_SOC_LDO_COUNT (0U) +/* @brief LLWU availability on the SoC. */ +#define FSL_FEATURE_SOC_LLWU_COUNT (0U) +/* @brief LMEM availability on the SoC. */ +#define FSL_FEATURE_SOC_LMEM_COUNT (1U) +/* @brief LPSCI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSCI_COUNT (0U) +/* @brief LPTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTMR_COUNT (0U) +/* @brief LPTPM availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTPM_COUNT (0U) +/* @brief LPUART availability on the SoC. */ +#define FSL_FEATURE_SOC_LPUART_COUNT (6U) +/* @brief LTC availability on the SoC. */ +#define FSL_FEATURE_SOC_LTC_COUNT (0U) +/* @brief LPI2C availability on the SoC. */ +#define FSL_FEATURE_SOC_LPI2C_COUNT (6U) +/* @brief LPSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSPI_COUNT (0U) +/* @brief LPIT availability on the SoC. */ +#define FSL_FEATURE_SOC_LPIT_COUNT (1U) +/* @brief MC availability on the SoC. */ +#define FSL_FEATURE_SOC_MC_COUNT (0U) +/* @brief MCG availability on the SoC. */ +#define FSL_FEATURE_SOC_MCG_COUNT (0U) +/* @brief MCGLITE availability on the SoC. */ +#define FSL_FEATURE_SOC_MCGLITE_COUNT (0U) +/* @brief MCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MCM_COUNT (0U) +/* @brief MMAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMAU_COUNT (0U) +/* @brief MMDVSQ availability on the SoC. */ +#define FSL_FEATURE_SOC_MMDVSQ_COUNT (0U) +/* @brief MPU availability on the SoC. */ +#define FSL_FEATURE_SOC_MPU_COUNT (0U) +/* @brief MSCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCAN_COUNT (0U) +/* @brief MSCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCM_COUNT (0U) +/* @brief MTB availability on the SoC. */ +#define FSL_FEATURE_SOC_MTB_COUNT (0U) +/* @brief MTBDWT availability on the SoC. */ +#define FSL_FEATURE_SOC_MTBDWT_COUNT (0U) +/* @brief MU availability on the SoC. */ +#define FSL_FEATURE_SOC_MU_COUNT (19U) +/* @brief NFC availability on the SoC. */ +#define FSL_FEATURE_SOC_NFC_COUNT (0U) +/* @brief OPAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_OPAMP_COUNT (0U) +/* @brief OSC availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC_COUNT (0U) +/* @brief OSC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC32_COUNT (0U) +/* @brief OTFAD availability on the SoC. */ +#define FSL_FEATURE_SOC_OTFAD_COUNT (0U) +/* @brief PDB availability on the SoC. */ +#define FSL_FEATURE_SOC_PDB_COUNT (0U) +/* @brief PGA availability on the SoC. */ +#define FSL_FEATURE_SOC_PGA_COUNT (0U) +/* @brief PIT availability on the SoC. */ +#define FSL_FEATURE_SOC_PIT_COUNT (0U) +/* @brief PMC availability on the SoC. */ +#define FSL_FEATURE_SOC_PMC_COUNT (0U) +/* @brief PORT availability on the SoC. */ +#define FSL_FEATURE_SOC_PORT_COUNT (0U) +/* @brief PWM availability on the SoC. */ +#define FSL_FEATURE_SOC_PWM_COUNT (0U) +/* @brief PWT availability on the SoC. */ +#define FSL_FEATURE_SOC_PWT_COUNT (0U) +/* @brief PCC availability on the SoC. */ +#define FSL_FEATURE_SOC_PCC_COUNT (0U) +/* @brief QuadSPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_QuadSPIO_COUNT (0U) +/* @brief RCM availability on the SoC. */ +#define FSL_FEATURE_SOC_RCM_COUNT (0U) +/* @brief RFSYS availability on the SoC. */ +#define FSL_FEATURE_SOC_RFSYS_COUNT (0U) +/* @brief RFVBAT availability on the SoC. */ +#define FSL_FEATURE_SOC_RFVBAT_COUNT (0U) +/* @brief RNG availability on the SoC. */ +#define FSL_FEATURE_SOC_RNG_COUNT (0U) +/* @brief RNGB availability on the SoC. */ +#define FSL_FEATURE_SOC_RNGB_COUNT (0U) +/* @brief ROM availability on the SoC. */ +#define FSL_FEATURE_SOC_ROM_COUNT (0U) +/* @brief RSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_RSIM_COUNT (0U) +/* @brief RTC availability on the SoC. */ +#define FSL_FEATURE_SOC_RTC_COUNT (0U) +/* @brief SCI availability on the SoC. */ +#define FSL_FEATURE_SOC_SCI_COUNT (0U) +/* @brief SDHC availability on the SoC. */ +#define FSL_FEATURE_SOC_SDHC_COUNT (0U) +/* @brief SDRAM availability on the SoC. */ +#define FSL_FEATURE_SOC_SDRAM_COUNT (0U) +/* @brief SIM availability on the SoC. */ +#define FSL_FEATURE_SOC_SIM_COUNT (0U) +/* @brief SMC availability on the SoC. */ +#define FSL_FEATURE_SOC_SMC_COUNT (0U) +/* @brief SNVS availability on the SoC. */ +#define FSL_FEATURE_SOC_SNVS_COUNT (1U) +/* @brief SPI availability on the SoC. */ +#define FSL_FEATURE_SOC_SPI_COUNT (0U) +/* @brief SCG availability on the SoC. */ +#define FSL_FEATURE_SOC_SCG_COUNT (0U) +/* @brief SEMA42 availability on the SoC. */ +#define FSL_FEATURE_SOC_SEMA42_COUNT (0U) +/* @brief STC availability on the SoC. */ +#define FSL_FEATURE_SOC_STC_COUNT (12U) +/* @brief TMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TMR_COUNT (0U) +/* @brief TPM availability on the SoC. */ +#define FSL_FEATURE_SOC_TPM_COUNT (0U) +/* @brief TRIAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_TRIAMP_COUNT (0U) +/* @brief TRNG availability on the SoC. */ +#define FSL_FEATURE_SOC_TRNG_COUNT (0U) +/* @brief TSI availability on the SoC. */ +#define FSL_FEATURE_SOC_TSI_COUNT (0U) +/* @brief TRGMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_TRGMUX_COUNT (0U) +/* @brief TSTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TSTMR_COUNT (0U) +/* @brief UART availability on the SoC. */ +#define FSL_FEATURE_SOC_UART_COUNT (0U) +/* @brief USB availability on the SoC. */ +#define FSL_FEATURE_SOC_USB_COUNT (0U) +/* @brief USBDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBDCD_COUNT (0U) +/* @brief USBHSDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBHSDCD_COUNT (0U) +/* @brief USBPHY availability on the SoC. */ +#define FSL_FEATURE_SOC_USBPHY_COUNT (0U) +/* @brief VREF availability on the SoC. */ +#define FSL_FEATURE_SOC_VREF_COUNT (0U) +/* @brief WDOG availability on the SoC. */ +#define FSL_FEATURE_SOC_WDOG_COUNT (2U) +/* @brief XBAR availability on the SoC. */ +#define FSL_FEATURE_SOC_XBAR_COUNT (0U) +/* @brief XCVR availability on the SoC. */ +#define FSL_FEATURE_SOC_XCVR_COUNT (0U) +/* @brief XRDC availability on the SoC. */ +#define FSL_FEATURE_SOC_XRDC_COUNT (0U) +/* @brief ZLL availability on the SoC. */ +#define FSL_FEATURE_SOC_ZLL_COUNT (0U) + +/* LMEM module features */ + +/* @brief Has process identifier support. */ +#define FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE (1U) + +/* LPUART module features */ + +/* @brief Has receive FIFO overflow detection (bit field CFIFO[RXOFE]). */ +#define FSL_FEATURE_LPUART_HAS_IRQ_EXTENDED_FUNCTIONS (0U) +/* @brief Has low power features (can be enabled in wait mode via register bit C1[DOZEEN] or CTRL[DOZEEN] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_LOW_POWER_UART_SUPPORT (1U) +/* @brief Has extended data register ED (or extra flags in the DATA register if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_HAS_FIFO (1U) +/* @brief Has 32-bit register MODIR */ +#define FSL_FEATURE_LPUART_HAS_MODIR (1U) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT (0U) +/* @brief Infrared (modulation) is supported. */ +#define FSL_FEATURE_LPUART_HAS_IR_SUPPORT (0U) +/* @brief 2 bits long stop bit is available. */ +#define FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT (1U) +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT (1U) +/* @brief Baud rate fine adjustment is available. */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_FINE_ADJUST_SUPPORT (0U) +/* @brief Baud rate oversampling is available (has bit fields C4[OSR], C5[BOTHEDGE], C5[RESYNCDIS] or BAUD[OSR], BAUD[BOTHEDGE], BAUD[RESYNCDIS] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (0U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_RX_RESYNC_SUPPORT (1U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (0U) +/* @brief Peripheral type. */ +#define FSL_FEATURE_LPUART_IS_SCI (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_FIFO_SIZEn(x) \ + (((x) == LPUART_SC) ? (32) : \ + (((x) == LPUART_MCU_0) ? (32) : \ + (((x) == LPUART_0) ? (64) : \ + (((x) == LPUART_1) ? (64) : \ + (((x) == LPUART_2) ? (64) : \ + (((x) == LPUART_3) ? (64) : (-1))))))) + +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_NO_PARITY (10U) +/* @brief Maximal data width with parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_PARITY (9U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING (1U) +/* @brief Has transmitter/receiver DMA enable bits C5[TDMAE]/C5[RDMAE] (or BAUD[TDMAE]/BAUD[RDMAE] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_DMA_ENABLE (0U) +/* @brief Has transmitter/receiver DMA select bits C4[TDMAS]/C4[RDMAS], resp. C5[TDMAS]/C5[RDMAS] if IS_SCI = 0. */ +#define FSL_FEATURE_LPUART_HAS_DMA_SELECT (0U) +/* @brief Data character bit order selection is supported (bit field S2[MSBF] or STAT[MSBF] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BIT_ORDER_SELECT (1U) +/* @brief Has smart card (ISO7816 protocol) support and no improved smart card support. */ +#define FSL_FEATURE_LPUART_HAS_SMART_CARD_SUPPORT (0U) +/* @brief Has improved smart card (ISO7816 protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_IMPROVED_SMART_CARD_SUPPORT (0U) +/* @brief Has local operation network (CEA709.1-B protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_LOCAL_OPERATION_NETWORK_SUPPORT (0U) +/* @brief Has 32-bit registers (BAUD, STAT, CTRL, DATA, MATCH, MODIR) instead of 8-bit (BDH, BDL, C1, S1, D, etc.). */ +#define FSL_FEATURE_LPUART_HAS_32BIT_REGISTERS (1U) +/* @brief Lin break detect available (has bit BDH[LBKDIE]). */ +#define FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT (0U) +/* @brief UART stops in Wait mode available (has bit C1[UARTSWAI]). */ +#define FSL_FEATURE_LPUART_HAS_WAIT_MODE_OPERATION (0U) +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPUART_HAS_SEPARATE_DMA_RX_TX_REQn(x) \ + ((x) == 0 ? (0) : (-1)) +/* @brief Has LPAURT_PARAM. */ +#define FSL_FEATURE_LPUART_HAS_PARAM (1U) +/* @brief Has LPUART_VERID. */ +#define FSL_FEATURE_LPUART_HAS_VERID (1U) +/* @brief Has LPUART_GLOBAL. */ +#define FSL_FEATURE_LPUART_HAS_GLOBAL (1U) +/* @brief Has LPUART_PINCFG. */ +#define FSL_FEATURE_LPUART_HAS_PINCFG (1U) +#define FSL_FEATURE_LPUART0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART6_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART7_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART8_HAS_NO_IRQ (1U) + +/* DSC module features */ + +#define FSL_FEATURE_DSC_HAS_PER_RESET (1U) + +/* MU module features */ + +/* @brief MU side for current core */ +#define FSL_FEATURE_MU_SIDE_A (0U) +#define FSL_FEATURE_MU_NO_RSTH (1U) +#define FSL_FEATURE_MU_NO_HR (1U) + +/* WDOG module features */ + +/* @brief Watchdog is available. */ +#define FSL_FEATURE_WDOG_HAS_WATCHDOG (1U) +/* @brief WDOG_CNT can be 32-bit written. */ +#define FSL_FEATURE_WDOG_HAS_32BIT_ACCESS (1U) + +/* LPI2C module features */ + +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPI2C_FIFO_SIZEn(x) (4U) + +#define FSL_FEATURE_I2C_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C6_HAS_NO_IRQ (1U) + +/* PORT module features */ + +#define FSL_FEATURE_PORT_HAS_NO_INTERRUPT (1U) + +/* GPIO module features */ + +#define FSL_FEATURE_GPIO_HAS_NO_INTERRUPT (1U) + +/* PAD module features */ + +/* @brief Pads are for 28LPP. */ +#define FSL_FEATURE_PAD_HAS_28LPP (0U) +/* @brief Pads are for 28FDSOI. */ +#define FSL_FEATURE_PAD_HAS_28FDSOI (1U) + +/* SECO module features */ + +/* @brief SECO protocol version */ +#define FSL_FEATURE_SECO_VER (2U) + +/* OTP module features */ +#define FSL_FEATURE_OTP_16K_1H_OFS_START (16U) +#define FSL_FEATURE_OTP_16K_1H_OFS_END (271U) +#define FSL_FEATURE_OTP_16K_2H_OFS_START (544U) +#define FSL_FEATURE_OTP_16K_2H_OFS_END (799U) + +/* CSR module features */ +#define FSL_FEATURE_CSR_HAS_CSR (0U) +#define FSL_FEATURE_CSR_HAS_CSR2 (1U) +#define FSL_FEATURE_CSR_HAS_CSR3 (1U) +#define FSL_FEATURE_CSR_HAS_LPCG (0U) + +#define FSL_FEATURE_DPLL_VER (18U) +#define FSL_FEATURE_AV_PLL_ENABLE_ALT (0U) + +#define FSL_FEATURE_PCIE_DPLL_SS (1U) + +/* DSC config */ +#define FSL_FEATURE_DSC_SSSLICE_CNT (8U) +#define FSL_FEATURE_DSC_SLSLICE_CNT (17U) +#define FSL_FEATURE_DSC_CSLICE_CNT (1U) +#define FSL_FEATURE_DSC_GPR_CTRL_CNT (3U) + +#endif /* MX8_FEATURES_H */ + diff --git a/platform/devices/MX8DXL/MX8DXL_fuse_map.h b/platform/devices/MX8DXL/MX8DXL_fuse_map.h new file mode 100755 index 0000000..fb11525 --- /dev/null +++ b/platform/devices/MX8DXL/MX8DXL_fuse_map.h @@ -0,0 +1,283 @@ +/* +** ################################################################### +** Processors: MX8DXL +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8DXL +** +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_FUSES_H +#define HW_FUSES_H + +/******************************************************************************* + * Macros + ******************************************************************************/ +#if !defined(NO_DEVICE_ACCESS) + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + ((((uint32_t)(OTP->FUSE[(_REG)].RW)) >> (SHFT)) & (MSK)) +#else + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + (((temp_fuses[(_REG)]) >> (SHFT)) & (MSK)) +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define OTP_CAAM_DIS OTP_GET_FUSE_STATE(0x003U, 0U, 0x00000001U) +#define OTP_IEE_DIS OTP_GET_FUSE_STATE(0x003U, 1U, 0x00000001U) +#define OTP_V2X_ROM_PATCH_EN OTP_GET_FUSE_STATE(0x003U, 2U, 0x00000001U) +#define OTP_V2X_PKC_BA414_DIS OTP_GET_FUSE_STATE(0x003U, 3U, 0x00000001U) +#define OTP_MMCAU_DIS OTP_GET_FUSE_STATE(0x003U, 4U, 0x00000001U) +#define OTP_ARM_CRYPT_EXT OTP_GET_FUSE_STATE(0x003U, 5U, 0x00000001U) +#define OTP_V2X_FW_ENCRYPTED OTP_GET_FUSE_STATE(0x003U, 6U, 0x00000001U) +#define OTP_V2X_FW_SIGNED OTP_GET_FUSE_STATE(0x003U, 7U, 0x00000001U) +#define OTP_V2X_ROM_IMG_VERIFY OTP_GET_FUSE_STATE(0x003U, 8U, 0x00000001U) +#define OTP_SNVS_DIS OTP_GET_FUSE_STATE(0x003U, 10U, 0x00000001U) +#define OTP_V2X_DEBUG_DIS OTP_GET_FUSE_STATE(0x003U, 11U, 0x00000001U) +#define OTP_V2X_DBG_KEY_EXCHG OTP_GET_FUSE_STATE(0x003U, 12U, 0x00000001U) +#define OTP_V2X_DBG_ON_REQ OTP_GET_FUSE_STATE(0x003U, 13U, 0x00000001U) +#define OTP_ATTEST_DIS OTP_GET_FUSE_STATE(0x003U, 14U, 0x00000001U) +#define OTP_PUF_ENB OTP_GET_FUSE_STATE(0x003U, 15U, 0x00000001U) +#define OTP_FUSE_LIFE_CYCLE OTP_GET_FUSE_STATE(0x004U, 0U, 0x000003FFU) +#define OTP_SDP_DIS OTP_GET_FUSE_STATE(0x004U, 10U, 0x00000001U) +#define OTP_SDP_W_ONLY OTP_GET_FUSE_STATE(0x004U, 11U, 0x00000001U) +#define OTP_SREV_XOR OTP_GET_FUSE_STATE(0x004U, 12U, 0x00000007U) +#define OTP_SREV_ROM OTP_GET_FUSE_STATE(0x004U, 15U, 0x00000001U) +#define OTP_SJC_DIS OTP_GET_FUSE_STATE(0x005U, 0U, 0x00000001U) +#define OTP_OEM_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 5U, 0x00000003U) +#define OTP_SCU_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 7U, 0x00000003U) +#define OTP_OTP_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 10U, 0x00000001U) +#define OTP_TZ_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 11U, 0x00000001U) +#define OTP_ARRAY_IS_PROG OTP_GET_FUSE_STATE(0x005U, 15U, 0x00000001U) +#define OTP_AP_2_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x0000000FU) +#define OTP_AP_2_0_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x00000001U) +#define OTP_AP_2_1_DIS OTP_GET_FUSE_STATE(0x006U, 1U, 0x00000001U) +#define OTP_AP_2_MAX_FREQ OTP_GET_FUSE_STATE(0x006U, 8U, 0x0000000FU) +#define OTP_TEMP_GRADE OTP_GET_FUSE_STATE(0x006U, 12U, 0x00000003U) +#define OTP_DSP_DIS OTP_GET_FUSE_STATE(0x008U, 0U, 0x00000001U) +#define OTP_MCU_0_DIS OTP_GET_FUSE_STATE(0x008U, 1U, 0x00000001U) +#define OTP_V2X_DIS OTP_GET_FUSE_STATE(0x008U, 3U, 0x00000001U) +#define OTP_PCIE_B_DIS OTP_GET_FUSE_STATE(0x008U, 5U, 0x00000001U) +#define OTP_USB2_1_DIS OTP_GET_FUSE_STATE(0x008U, 8U, 0x00000001U) +#define OTP_USB2_2_OTG_DIS OTP_GET_FUSE_STATE(0x008U, 9U, 0x00000001U) +#define OTP_ETH_0_DIS OTP_GET_FUSE_STATE(0x008U, 12U, 0x00000001U) +#define OTP_ETH_1_DIS OTP_GET_FUSE_STATE(0x008U, 13U, 0x00000001U) +#define OTP_DRC_0_DIS OTP_GET_FUSE_STATE(0x009U, 8U, 0x0000000FU) +#define OTP_CAN_DIS OTP_GET_FUSE_STATE(0x00AU, 0U, 0x00000001U) +#define OTP_ENET1_FREQ_LIMIT OTP_GET_FUSE_STATE(0x00AU, 1U, 0x00000001U) +#define OTP_ENET2_FREQ_LIMIT OTP_GET_FUSE_STATE(0x00AU, 2U, 0x00000001U) +#define OTP_FIPS_MODE OTP_GET_FUSE_STATE(0x00AU, 3U, 0x00000001U) +#define OTP_FIPS_MODE_DIS OTP_GET_FUSE_STATE(0x00AU, 4U, 0x00000001U) + +#define OTP_PATCH_ALLOC0 OTP_GET_FUSE_STATE(0x00AU, 3U, 0x00000001U) +#define OTP_PATCH_ALLOC1 OTP_GET_FUSE_STATE(0x00AU, 4U, 0x00000001U) +#define OTP_PATCH_ALLOC2 OTP_GET_FUSE_STATE(0x00AU, 5U, 0x00000001U) + +#define OTP_EARLY_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 0U, 0x00000001U) +#define OTP_SCU_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 1U, 0x00000001U) +#define OTP_ALL_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 2U, 0x00000001U) +#define OTP_SECO_OPEN_8E OTP_GET_FUSE_STATE(0x00EU, 3U, 0x00000001U) +#define OTP_SECO_CLOSED_8E OTP_GET_FUSE_STATE(0x00EU, 4U, 0x00000001U) +#define OTP_SECO_SECURED_8E OTP_GET_FUSE_STATE(0x00EU, 5U, 0x00000001U) +#define OTP_ROM_INF_LOOP OTP_GET_FUSE_STATE(0x00EU, 8U, 0x00000001U) +#define OTP_BT_DIR_DIS OTP_GET_FUSE_STATE(0x00EU, 9U, 0x00000001U) +#define OTP_ROM_CONT_BITS OTP_GET_FUSE_STATE(0x00EU, 10U, 0x0000001FU) +#define OTP_SHELF_MODE OTP_GET_FUSE_STATE(0x00EU, 15U, 0x00000001U) + +/******************************************************************************* + * Trim & other fuses + ******************************************************************************/ + +#define OTP_UNIQUE_ID_L OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_UNIQUE_ID_H OTP_GET_FUSE_STATE(0x011U, 0U, 0xFFFFFFFFU) + +#define OTP_LOT_NO_ENC_L OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_LOT_NO_ENC_H OTP_GET_FUSE_STATE(0x011U, 0U, 0x000007FFU) +#define OTP_WAFER_NO OTP_GET_FUSE_STATE(0x011U, 11U, 0x0000001FU) +#define OTP_DIE_Y_COORD OTP_GET_FUSE_STATE(0x011U, 16U, 0x000000FFU) +#define OTP_DIE_X_COORD OTP_GET_FUSE_STATE(0x011U, 24U, 0x000000FFU) + +#define OTP_BT_MODE_FUS OTP_GET_FUSE_STATE(0x012U, 0U, 0x0000003FU) +#define OTP_BT_FUS_SEL OTP_GET_FUSE_STATE(0x012U, 6U, 0x00000001U) +#define OTP_BT_FORCE_COLD OTP_GET_FUSE_STATE(0x012U, 7U, 0x00000001U) + +#define OTP_WDOG_EN OTP_GET_FUSE_STATE(0x012U, 8U, 0x00000001U) +#define OTP_WDOG_TO OTP_GET_FUSE_STATE(0x012U, 9U, 0x00000003U) +#define OTP_SCU_DCACHE_DIS OTP_GET_FUSE_STATE(0x012U, 11U, 0x00000001U) +#define OTP_SCU_ICACHE_DIS OTP_GET_FUSE_STATE(0x012U, 12U, 0x00000001U) +#define OTP_AP_MMU_DCACHE_DIS OTP_GET_FUSE_STATE(0x012U, 13U, 0x00000001U) +#define OTP_AP_ICACHE_DIS OTP_GET_FUSE_STATE(0x012U, 14U, 0x00000001U) +#define OTP_SDMMC_MAN_DIS OTP_GET_FUSE_STATE(0x012U, 18U, 0x00000001U) +#define OTP_REC_BOOT_EN OTP_GET_FUSE_STATE(0x012U, 19U, 0x00000001U) +#define OTP_SCU_BT_F_GPIO_SEL OTP_GET_FUSE_STATE(0x012U, 20U, 0x00000007U) +#define OTP_SCU_BT_F_IND OTP_GET_FUSE_STATE(0x012U, 23U, 0x00000001U) +#define OTP_FLEXSPI_DLL OTP_GET_FUSE_STATE(0x012U, 24U, 0x0000000FU) +#define OTP_OVR_NAND OTP_GET_FUSE_STATE(0x012U, 28U, 0x00000001U) +#define OTP_OVR_NAND_VAL OTP_GET_FUSE_STATE(0x012U, 29U, 0x00000001U) +#define OTP_OVR_FLX_SPI OTP_GET_FUSE_STATE(0x012U, 30U, 0x00000001U) +#define OTP_OVR_FLX_SPI_VAL OTP_GET_FUSE_STATE(0x012U, 31U, 0x00000001U) +#define OTP_FAST_BOOT OTP_GET_FUSE_STATE(0x013U, 0U, 0x00000001U) +#define OTP_FAST_BOOT_ACK OTP_GET_FUSE_STATE(0x013U, 1U, 0x00000001U) +#define OTP_USDHC_BT_SPD OTP_GET_FUSE_STATE(0x013U, 2U, 0x00000003U) +#define OTP_MMC_BUS_W OTP_GET_FUSE_STATE(0x013U, 4U, 0x00000003U) +#define OTP_FAST_FRZ_DIS OTP_GET_FUSE_STATE(0x013U, 6U, 0x00000001U) + +#define OTP_USDHC_CYC_DLY OTP_GET_FUSE_STATE(0x013U, 8U, 0x00000001U) +#define OTP_USDHC_CYC_INT OTP_GET_FUSE_STATE(0x013U, 9U, 0x00000001U) +#define OTP_USDHC_CYC_EN OTP_GET_FUSE_STATE(0x013U, 10U, 0x00000001U) +#define OTP_USDHC_DLL_EN OTP_GET_FUSE_STATE(0x013U, 11U, 0x00000001U) +#define OTP_SD_LOOPBCK OTP_GET_FUSE_STATE(0x013U, 12U, 0x00000001U) +#define OTP_USDHC_PD_PULLDWN OTP_GET_FUSE_STATE(0x013U, 13U, 0x00000001U) +#define OTP_SD_CAL_STEP OTP_GET_FUSE_STATE(0x013U, 14U, 0x00000003U) +#define OTP_USDHC_DLL_DLY OTP_GET_FUSE_STATE(0x013U, 16U, 0x0000007FU) +#define OTP_USDHC_DLL_SEL OTP_GET_FUSE_STATE(0x013U, 23U, 0x00000001U) +#define OTP_USDHC_PD_SET_OVR OTP_GET_FUSE_STATE(0x013U, 24U, 0x00000007U) +#define OTP_NAND_PD_SET_OVR OTP_GET_FUSE_STATE(0x013U, 27U, 0x00000007U) +#define OTP_CS_NUM_NAND OTP_GET_FUSE_STATE(0x013U, 30U, 0x00000003U) + +#define OTP_DBGEN_DBGEN OTP_GET_FUSE_STATE(0x016U, 0U, 0x000000FFU) +#define OTP_DBGEN_NIDEN OTP_GET_FUSE_STATE(0x016U, 8U, 0x000000FFU) +#define OTP_DBGEN_SPIDEN OTP_GET_FUSE_STATE(0x016U, 16U, 0x000000FFU) +#define OTP_DBGEN_SPNIDEN OTP_GET_FUSE_STATE(0x016U, 24U, 0x000000FFU) + +#define OTP_DPLL_CALIB_V2 OTP_GET_FUSE_STATE(0x01BU, 3U, 0x00000001U) + +#define OTP_OSC_CAP_TRIM OTP_GET_FUSE_STATE(0x01EU, 0U, 0x0000000FU) +#define OTP_TMP_MON_TRM_LO OTP_GET_FUSE_STATE(0x01EU, 4U, 0x0000003FU) +#define OTP_TMP_MON_TRM_HI OTP_GET_FUSE_STATE(0x01EU, 10U, 0x0000003FU) +#define OTP_TMP_MON_TRM_SHLF_LO OTP_GET_FUSE_STATE(0x01EU, 20U, 0x0000003FU) +#define OTP_TMP_MON_TRM_SHLF_HI OTP_GET_FUSE_STATE(0x01EU, 26U, 0x0000003FU) +#define OTP_BANDGAP_TRM OTP_GET_FUSE_STATE(0x01FU, 0U, 0x0000001FU) +#define OTP_32K_INT_IRC_TRM OTP_GET_FUSE_STATE(0x01FU, 5U, 0x0000001FU) +#define OTP_CLK_MON_TRM_LO OTP_GET_FUSE_STATE(0x01FU, 10U, 0x0000000FU) +#define OTP_CLK_MON_TRM_HI OTP_GET_FUSE_STATE(0x01FU, 14U, 0x0000000FU) +#define OTP_V_MON_TRM_LO OTP_GET_FUSE_STATE(0x01FU, 18U, 0x0000000FU) +#define OTP_V_MON_TRM_HI OTP_GET_FUSE_STATE(0x01FU, 22U, 0x0000000FU) +#define OTP_V_MON_TAM_DIS OTP_GET_FUSE_STATE(0x01FU, 26U, 0x00000001U) +#define OTP_CLK_MON_DIS OTP_GET_FUSE_STATE(0x01FU, 27U, 0x00000001U) +#define OTP_TMP_MON_DIS OTP_GET_FUSE_STATE(0x01FU, 28U, 0x00000001U) +#define OTP_SNVS_C_V_TRM OTP_GET_FUSE_STATE(0x01FU, 30U, 0x00000003U) + +#define OTP_SCU_REFGEN OTP_GET_FUSE_STATE(0x064U, 0U, 0x000000FFU) +#define OTP_AP_2_REFGEN OTP_GET_FUSE_STATE(0x064U, 8U, 0x000000FFU) +#define OTP_DRC_REFGEN OTP_GET_FUSE_STATE(0x064U, 24U, 0x000000FFU) +#define OTP_GPU_0_REFGEN OTP_GET_FUSE_STATE(0x065U, 8U, 0x000000FFU) +#define OTP_ADMA_REFGEN OTP_GET_FUSE_STATE(0x065U, 24U, 0x000000FFU) +#define OTP_CONN_REFGEN OTP_GET_FUSE_STATE(0x066U, 0U, 0x000000FFU) +#define OTP_HSIO_REFGEN OTP_GET_FUSE_STATE(0x066U, 24U, 0x000000FFU) + +#define OTP_USB_PHY_TRM OTP_GET_FUSE_STATE(0x067U, 0U, 0x000FFFFFU) +#define OTP_CSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x069U, 8U, 0x00000003U) +#define OTP_DSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 20U, 0x00000003U) +#define OTP_DSI_1_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 22U, 0x00000003U) + +#define OTP_TMP_SENS_SCU OTP_GET_FUSE_STATE(0x06AU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_3 OTP_GET_FUSE_STATE(0x06AU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_4 OTP_GET_FUSE_STATE(0x06AU, 22U, 0x000003FFU) +#define OTP_TMP_SENS_DRC0 OTP_GET_FUSE_STATE(0x06BU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_6 OTP_GET_FUSE_STATE(0x06BU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_7 OTP_GET_FUSE_STATE(0x06BU, 22U, 0x000003FFU) + +#define OTP_ROM_PATCH 0x070U +#define OTP_ROM_PATCH_SIZE 62U +#define OTP_SECO_PATCH 0x0D0U +#define OTP_SECO_PATCH_SIZE 32U +#define OTP_SECO_PATCH2 0x190U +#define OTP_SECO_PATCH2_SIZE 32U +#define OTP_V2X_PATCH 0x1F2U +#define OTP_V2X_PATCH_SIZE 11U + +#define OTP_DERATE_DLL_FRQ OTP_GET_FUSE_STATE(0x0AEU, 0U, 0x00000001U) +#define OTP_EXT_OSC_SEL OTP_GET_FUSE_STATE(0x0AEU, 1U, 0x00000001U) +#define OTP_USE_INT_OSC OTP_GET_FUSE_STATE(0x0AEU, 2U, 0x00000001U) +#define OTP_SINGLE_END_CLK OTP_GET_FUSE_STATE(0x0AEU, 3U, 0x00000001U) + +#define OTP_24MHZ_REGH_LV OTP_GET_FUSE_STATE(0x100U, 0U, 0x00000007U) +#define OTP_24MHZ_REGL_LV OTP_GET_FUSE_STATE(0x100U, 3U, 0x00000007U) +#define OTP_ROSC_FREQ_OFF OTP_GET_FUSE_STATE(0x100U, 8U, 0x00FFFFFFU) + +#define OTP_DPLL_TRM OTP_GET_FUSE_STATE(0x101U, 0U, 0xFFFFFFFFU) +#define OTP_DPLL_TRM_VALID OTP_GET_FUSE_STATE(0x101U, 0U, 0x00800000U) + +#define OTP_24MHZ_DIFF_VALID OTP_GET_FUSE_STATE(0x102U, 31U, 0x00000001U) +#define OTP_24MHZ_DIFF_DRV0 OTP_GET_FUSE_STATE(0x102U, 0U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV1 OTP_GET_FUSE_STATE(0x102U, 4U, 0x00000003U) +#define OTP_24MHZ_DIFF_TERM_RES OTP_GET_FUSE_STATE(0x102U, 8U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV_IN OTP_GET_FUSE_STATE(0x102U, 10U, 0x00000003U) +#define OTP_24MHZ_DIFF_SQRUP OTP_GET_FUSE_STATE(0x102U, 12U, 0x00000003U) +#define OTP_SCU_REG_TRIM OTP_GET_FUSE_STATE(0x102U, 16U, 0x00000007U) + +#define OTP_DSI_0_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 0U, 0x00000007U) +#define OTP_DSI_0_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 3U, 0x00000007U) +#define OTP_DSI_0_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 6U, 0x00000007U) +#define OTP_DSI_0_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 9U, 0x00000007U) +#define OTP_DSI_0_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 12U, 0x00000007U) +#define OTP_DSI_1_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 16U, 0x00000007U) +#define OTP_DSI_1_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 19U, 0x00000007U) +#define OTP_DSI_1_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 22U, 0x00000007U) +#define OTP_DSI_1_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 25U, 0x00000007U) +#define OTP_DSI_1_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 28U, 0x00000007U) + +#define OTP_ROM_LITERAL 0x10CU +#define OTP_ROM_LITERAL_SIZE 4U + +#define OTP_24MHZ_CL_TUNE_VALID OTP_GET_FUSE_STATE(0x1F0U, 31U, 0x00000001U) +#define OTP_24MHZ_CL_TUNE_LV OTP_GET_FUSE_STATE(0x1F0U, 0U, 0x000000FFU) + +#define OTP_DPLL_TABLE_SELECT_VALID OTP_GET_FUSE_STATE(0x1FDU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_SELECT_BITS OTP_GET_FUSE_STATE(0x1FDU, 0U, 0x003FFFFFU) + +#define OTP_DPLL_TABLE_0_VALID OTP_GET_FUSE_STATE(0x1FEU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_0_V6 OTP_GET_FUSE_STATE(0x1FEU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V5 OTP_GET_FUSE_STATE(0x1FEU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V4 OTP_GET_FUSE_STATE(0x1FEU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V3 OTP_GET_FUSE_STATE(0x1FEU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V2 OTP_GET_FUSE_STATE(0x1FEU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V1 OTP_GET_FUSE_STATE(0x1FEU, 0U, 0x0000003FU) + +#define OTP_DPLL_TABLE_1_VALID OTP_GET_FUSE_STATE(0x1FFU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_1_V6 OTP_GET_FUSE_STATE(0x1FFU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V5 OTP_GET_FUSE_STATE(0x1FFU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V4 OTP_GET_FUSE_STATE(0x1FFU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V3 OTP_GET_FUSE_STATE(0x1FFU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V2 OTP_GET_FUSE_STATE(0x1FFU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V1 OTP_GET_FUSE_STATE(0x1FFU, 0U, 0x0000003FU) + +#define OTP_TMP_SENS_SCU_OFS OTP_GET_FUSE_STATE(0x1F1U, 0U, 0x000000FFU) +#define OTP_TMP_SENS_DRC0_OFS OTP_GET_FUSE_STATE(0x1F1U, 8U, 0x000000FFU) + +#endif /* HW_FUSES_H */ + diff --git a/platform/devices/MX8DXL/MX8DXL_otp.h b/platform/devices/MX8DXL/MX8DXL_otp.h new file mode 100755 index 0000000..9145340 --- /dev/null +++ b/platform/devices/MX8DXL/MX8DXL_otp.h @@ -0,0 +1,318 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_OTP_REGISTERS_H +#define HW_OTP_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- OTP Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Peripheral_Access_Layer OTP Peripheral Access Layer + * @{ + */ + +/** OTP - Register Layout Typedef */ +typedef struct +{ + __IO uint32_t RW; + __IO uint32_t SET; + __IO uint32_t CLR; + __IO uint32_t TOG; +} OTP_Reg; + +typedef struct +{ + OTP_Reg CTRL; + OTP_Reg PDN; + OTP_Reg DATA; + OTP_Reg READ_CTRL; + OTP_Reg READ_FUSE_DATA; + OTP_Reg SW_STICKY; + OTP_Reg SCS; + OTP_Reg CRC_ADDR; + OTP_Reg CRC_VALUE; + OTP_Reg STATUS; + __I uint32_t STARTWORD; + uint8_t RESERVED_0[12]; + __I uint32_t VERSION; + uint8_t RESERVED_1[1356]; + struct { + __I uint32_t RW; + __I uint32_t SET; + __I uint32_t CLR; + __I uint32_t TOG; + } LOCKED[17]; + uint8_t RESERVED_3[240]; + OTP_Reg FUSE[528]; +} OTP_Type; + +/* ---------------------------------------------------------------------------- + -- OTP Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Register_Masks OTP Register Masks + * @{ + */ + +/*! @name OTP Register */ +#define OTP_BIT0_MASK (0x00000001U) +#define OTP_BIT0_SHIFT (0U) +#define OTP_BIT0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT1_MASK (0x00000002U) +#define OTP_BIT1_SHIFT (1U) +#define OTP_BIT1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT2_MASK (0x00000004U) +#define OTP_BIT2_SHIFT (2U) +#define OTP_BIT2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT3_MASK (0x00000008U) +#define OTP_BIT3_SHIFT (3U) +#define OTP_BIT3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT4_MASK (0x00000010U) +#define OTP_BIT4_SHIFT (4U) +#define OTP_BIT4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT5_MASK (0x00000020U) +#define OTP_BIT5_SHIFT (5U) +#define OTP_BIT5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT6_MASK (0x00000040U) +#define OTP_BIT6_SHIFT (6U) +#define OTP_BIT6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT7_MASK (0x00000080U) +#define OTP_BIT7_SHIFT (7U) +#define OTP_BIT7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT8_MASK (0x00000100U) +#define OTP_BIT8_SHIFT (8U) +#define OTP_BIT8(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT9_MASK (0x00000200U) +#define OTP_BIT9_SHIFT (9U) +#define OTP_BIT9(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT10_MASK (0x00000400U) +#define OTP_BIT10_SHIFT (10U) +#define OTP_BIT10(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT11_MASK (0x00000800U) +#define OTP_BIT11_SHIFT (11U) +#define OTP_BIT11(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT12_MASK (0x00001000U) +#define OTP_BIT12_SHIFT (12U) +#define OTP_BIT12(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT13_MASK (0x00002000U) +#define OTP_BIT13_SHIFT (13U) +#define OTP_BIT13(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT14_MASK (0x00004000U) +#define OTP_BIT14_SHIFT (14U) +#define OTP_BIT14(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT15_MASK (0x00008000U) +#define OTP_BIT15_SHIFT (15U) +#define OTP_BIT15(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT16_MASK (0x00010000U) +#define OTP_BIT16_SHIFT (16U) +#define OTP_BIT16(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT17_MASK (0x00020000U) +#define OTP_BIT17_SHIFT (17U) +#define OTP_BIT17(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT18_MASK (0x00040000U) +#define OTP_BIT18_SHIFT (18U) +#define OTP_BIT18(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT19_MASK (0x00080000U) +#define OTP_BIT19_SHIFT (19U) +#define OTP_BIT19(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT20_MASK (0x00100000U) +#define OTP_BIT20_SHIFT (20U) +#define OTP_BIT20(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT21_ASK (0x00200000U) +#define OTP_BIT21_SHIFT (21U) +#define OTP_BIT21(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT22_MASK (0x00400000U) +#define OTP_BIT22_SHIFT (22U) +#define OTP_BIT22(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT23_MASK (0x00800000U) +#define OTP_BIT23_SHIFT (23U) +#define OTP_BIT23(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT24_MASK (0x01000000U) +#define OTP_BIT24_SHIFT (24U) +#define OTP_BIT24(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT25_MASK (0x02000000U) +#define OTP_BIT25_SHIFT (25U) +#define OTP_BIT25(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT26_MASK (0x04000000U) +#define OTP_BIT26_SHIFT (26U) +#define OTP_BIT26(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT27_MASK (0x08000000U) +#define OTP_BIT27_SHIFT (27U) +#define OTP_BIT27(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT28_MASK (0x10000000U) +#define OTP_BIT28_SHIFT (28U) +#define OTP_BIT28(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT29_MASK (0x20000000U) +#define OTP_BIT29_SHIFT (29U) +#define OTP_BIT29(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT30_MASK (0x40000000U) +#define OTP_BIT30_SHIFT (30U) +#define OTP_BIT30(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT31_MASK (0x80000000U) +#define OTP_BIT31_SHIFT (31U) +#define OTP_BIT31(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE0_MASK (0x0000000FU) +#define OTP_NIBBLE0_SHIFT (0U) +#define OTP_NIBBLE0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE1_MASK (0x000000F0U) +#define OTP_NIBBLE1_SHIFT (4U) +#define OTP_NIBBLE1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE2_MASK (0x00000F00U) +#define OTP_NIBBLE2_SHIFT (8U) +#define OTP_NIBBLE2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE3_MASK (0x0000F000U) +#define OTP_NIBBLE3_SHIFT (12U) +#define OTP_NIBBLE3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE4_MASK (0x000F0000U) +#define OTP_NIBBLE4_SHIFT (16U) +#define OTP_NIBBLE4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE5_MASK (0x00F00000U) +#define OTP_NIBBLE5_SHIFT (20U) +#define OTP_NIBBLE5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE6_MASK (0x0F000000U) +#define OTP_NIBBLE6_SHIFT (24U) +#define OTP_NIBBLE6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE7_MASK (0xF0000000U) +#define OTP_NIBBLE7_SHIFT (28U) +#define OTP_NIBBLE7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! + * @} + */ /* end of group OTP_Register_Masks */ + +/* OTP - Peripheral instance base addresses */ +/** Peripheral OTPA base pointer */ +#define OTP ((OTP_Type *)OTP_BASE) +/** Array initializer of OTP peripheral base addresses */ +#define OTP_BASE_ADDRS { OTP_BASE } +/** Array initializer of OTP peripheral base pointers */ +#define OTP_BASE_PTRS { OTP } + +/*! + * @} + */ /* end of group OTP_Peripheral_Access_Layer */ + +#endif /* HW_OTP_REGISTERS_H */ diff --git a/platform/devices/MX8DXL/Makefile b/platform/devices/MX8DXL/Makefile new file mode 100755 index 0000000..42e08cc --- /dev/null +++ b/platform/devices/MX8DXL/Makefile @@ -0,0 +1,14 @@ + +objs_mx8 := system_MX8DXL.o handlers_MX8DXL.o + +ifdef ROM +objs_mx8 += gcc/startup_rom_MX8DXL.o +else +objs_mx8 += gcc/startup_MX8DXL.o +endif + +OBJS += \ + $(foreach object,$(objs_mx8),$(OUT)/devices/MX8DXL/$(object)) + +DIRS += $(OUT)/devices/MX8DXL/gcc + diff --git a/platform/devices/MX8DXL/fsl_clock.h b/platform/devices/MX8DXL/fsl_clock.h new file mode 100755 index 0000000..ed09101 --- /dev/null +++ b/platform/devices/MX8DXL/fsl_clock.h @@ -0,0 +1,367 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_CLOCKS_H +#define HW_CLOCKS_H + +#include + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SC_XTAL32K_FREQ_HZ 32768U +#define SC_XTAL24M_FREQ_HZ 24000000U +#define SC_ROSC_FREQ_HZ 200000000U +#define SC_PLL0_STARTUP_FREQ_HZ 1056000000U + +#define SC_MSLICE_ROOT0_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (CAAM) +#define SC_MSLICE_ROOT3_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (MSI) + +#define SC_MSLICE_ROOT0_STARTUP_DIV 4U // 1056 MHz / 4 = 264 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_STARTUP_DIV 8U // 1056 MHz / 8 = 132 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_STARTUP_DIV 3U // 1056 MHz / 3 = 352 MHz (CAAM) +#define SC_MSLICE_ROOT3_STARTUP_DIV 5U // 1056 MHz / 5 = 211 MHz (MSI) + +#define SC_MCU_STARTUP_FREQ_HZ (SC_PLL0_STARTUP_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_STARTUP_FREQ_MHZ (SC_MCU_STARTUP_FREQ_HZ/1000000U) +#define SC_MCU_LPM_FREQ_HZ (SC_ROSC_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_LPM_FREQ_MHZ (SC_MCU_LPM_FREQ_HZ/1000000U) +#define SC_SYSTICK_NSEC_TO_TICKS(nsec) ((SC_MCU_STARTUP_FREQ_MHZ * (nsec)) / 1000U) + +#define SC_LPIT_ROOT_FREQ_HZ 24000000U +#define SC_LPIT_ROOT_DIV 3U +#define SC_LPIT_FREQ_HZ (SC_LPIT_ROOT_FREQ_HZ / SC_LPIT_ROOT_DIV) +#define SC_LPIT_MSEC_TO_TICKS(msec) (SC_LPIT_FREQ_HZ * (msec) / 1000U) + +#define SC_BG_SVC_MSEC 10U // Background service interval in msec +#define SC_WDOG_SVC_MSEC 5U // WDOG service interval in msec +#define SC_BG_TIMEOUT_MSEC 100U // Background timeout in msec +#define SC_BG_TIMEOUT (SC_BG_TIMEOUT_MSEC / SC_WDOG_SVC_MSEC) + +/*! @brief Clock ip name array for LPUART. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPUART_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPUART_CLOCKS {kCLOCK_LPUART_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/*! @brief Clock ip name array for LPI2C. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPI2C_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPI2C_CLOCKS {kCLOCK_LPI2C_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_IGPIO_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define GPIO_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_MU_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define MU_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid} + +/*! @brief Clock name used to get clock frequency. */ +typedef enum _clock_name +{ + kCLOCK_NmInvalid = 0U, +} clock_name_t; + +/*! + * @brief Clock source for peripherals that support various clock selections. + */ +typedef enum _clock_ip_src +{ + kCLOCK_SrcInvalid = 0U, +} clock_ip_src_t; + +/*! + * @brief Peripheral clock name difinition used for clock gate, clock source + * and clock divider setting. It is defined as the corresponding register address. + */ +typedef enum _clock_ip_name +{ + kCLOCK_IpInvalid = 0U, + kCLOCK_TCMC_SC = LPCG__SS_SCU__CM4__TCMC_HCLK__BASE, + kCLOCK_MMCAU_SC = LPCG__SS_SCU__CM4__MMCAU_HCLK__BASE, + kCLOCK_TPM_SC = LPCG__SS_SCU__TPM1__IPG_CLK__BASE, + kCLOCK_LPIT_SC = LPCG__SS_SCU__LPIT1__IPG_CLK__BASE, + kCLOCK_LPUART_SC = LPCG__SS_SCU__LPUART1__IPG_CLK__BASE, + kCLOCK_LPI2C_SC = LPCG__SS_SCU__LPI2C1__IPG_CLK__BASE +} clock_ip_name_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief Enable the clock for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + volatile uint32_t lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enable the hardware clock gating for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableHWCG(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + uint32_t lpcgVal = (1UL << LPCG__SS_SCU__PER_CLK__HWEN); + + *((volatile uint32_t *) (uint32_t) name) |= lpcgVal; + } +#endif +} + +/*! + * @brief Enable the clock for specific IP using exclusive access. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClockEx(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Use exclusive access to enable IPG and BAUD clocks */ + uint32_t volatile lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + do + { + lpcgVal |= __LDREXW((volatile uint32_t *) (uint32_t) name); + } while (__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)) != 0U); + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + } +#endif +} + +/*! + * @brief Disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Disable IPG and BAUD clocks */ + uint32_t lpcgVal = 0U; + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enter exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline uint32_t CLOCK_DisableClockExEnter(clock_ip_name_t name) +{ +#ifndef SIMU + /* Use exclusive access to disable IPG and BAUD clocks */ + uint32_t lpcgVal = ~((1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN)); + + if (name != kCLOCK_IpInvalid) + { + lpcgVal = __LDREXW((volatile uint32_t *) (uint32_t) name); + } + + return lpcgVal; +#else + return 0U; +#endif +} + +/*! + * @brief Leave exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClockExLeave(clock_ip_name_t name, + uint32_t lpcgVal) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + (void)__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)); + } +#endif +} + +/*! + * @brief Check whether the clock is already enabled and configured by + * any other core. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @return True if clock is already enabled, otherwise false. + */ +static inline bool CLOCK_IsEnabledByOtherCore(clock_ip_name_t name) +{ + return false; +} + +/*! + * @brief Set the clock source for specific IP module. + * + * Set the clock source for specific IP, not all modules need to set the + * clock source, should only use this function for the modules need source + * setting. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + */ +static inline void CLOCK_SetIpSrc(clock_ip_name_t name, clock_ip_src_t src) +{ +} + +/*! + * @brief Set the clock source and divider for specific IP module. + * + * Set the clock source and divider for specific IP, not all modules need to + * set the clock source and divider, should only use this function for the + * modules need source and divider setting. + * + * Divider output clock = Divider input clock x [(fracValue+1)/(divValue+1)]). + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + * @param divValue The divider value. + * @param fracValue The fraction multiply value. + */ +static inline void CLOCK_SetIpSrcDiv(clock_ip_name_t name, clock_ip_src_t src, uint8_t divValue, uint8_t fracValue) +{ +} + +/*! + * @brief Gets the clock frequency for a specific clock name. + * + * This function checks the current clock configurations and then calculates + * the clock frequency for a specific clock name defined in clock_name_t. + * + * @param clockName Clock names defined in clock_name_t + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetFreq(clock_name_t clockName); + +/*! + * @brief Gets the clock frequency for a specific IP module. + * + * This function gets the IP module clock frequency based on PCC registers. It is + * only used for the IP modules which could select clock source by PCC[PCS]. + * + * @param name Which peripheral to get, see \ref clock_ip_name_t. + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetIpFreq(clock_ip_name_t name); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +#endif /* HW_CLOCKS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8DXL/handlers_MX8DXL.h b/platform/devices/MX8DXL/handlers_MX8DXL.h new file mode 100755 index 0000000..9a063a9 --- /dev/null +++ b/platform/devices/MX8DXL/handlers_MX8DXL.h @@ -0,0 +1,98 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Header for handlers. + */ + +#ifndef HANDLERS_H +#define HANDLERS_H + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Functions */ + +void sc_handlers_init(void); +void DefaultISR(void); +void NMI_IRQHandler(uint32_t *sp); +void MCM_IRQHandler(uint32_t *sp); +void DebugWake_IRQHandler(void); +void SWI_IRQHandler(void); +void LPIT_SCU_IRQHandler(uint32_t *sp); +void DSC_SCU_IRQHandler(void); +void DSC_DB_IRQHandler(void); +void DSC_LSIO_IRQHandler(void); +void DSC_CM4_0_IRQHandler(void); +void DSC_CA35_IRQHandler(void); +void DSC_DRC_0_IRQHandler(void); +void DSC_ADMA_IRQHandler(void); +void IOMUX_CommonHandler(uint8_t irq, uint8_t ring, uint8_t group); +void IOMUX0_IRQHandler(void); +void IOMUX1_IRQHandler(void); +void IOMUX2_IRQHandler(void); +void IOMUX3_IRQHandler(void); +void IOMUX4_IRQHandler(void); +void IOMUX5_IRQHandler(void); +void IOMUX6_IRQHandler(void); +void IOMUX7_IRQHandler(void); +void IOMUX8_IRQHandler(void); +void IOMUX9_IRQHandler(void); +void SYSCTR_CMP0_IRQHandler(void); +void SYSCTR_CMP1_IRQHandler(void); +void ss_earlywdog_handler_sc(void); +void ss_csreq_handler_a35(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_mcu(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_dbgpwrup(uint32_t idx, uint32_t cpwrupreq); +void SNVS_Functional_IRQHandler(void); +#if HAS_SS_AP_2 +sc_bool_t ss_dbg_status_a35(sc_dsc_t dsc); +void ss_dbg_resume_a35(sc_dsc_t dsc); +#endif + +/* Global Variables */ + +extern uint32_t gLPITcnt; + +#endif /* #if !defined(HANDLERS_H) */ + diff --git a/platform/devices/MX8DXL/linker/gcc/MX8DXL_flash.ld b/platform/devices/MX8DXL/linker/gcc/MX8DXL_flash.ld new file mode 100755 index 0000000..ea63e74 --- /dev/null +++ b/platform/devices/MX8DXL/linker/gcc/MX8DXL_flash.ld @@ -0,0 +1,61 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Specify the memory areas */ +MEMORY +{ + m_rom (RX) : ORIGIN = 0x00000000, LENGTH = 0x00018000 +} + +/* Define output sections */ +SECTIONS +{ + /* Vector table and code to emulate ROM */ + .rom : + { + . = ALIGN(8); + KEEP(*(.rom)) + . = ALIGN(0x80); + } > m_rom +} + diff --git a/platform/devices/MX8DXL/linker/gcc/MX8DXL_overlay.t.ld b/platform/devices/MX8DXL/linker/gcc/MX8DXL_overlay.t.ld new file mode 100755 index 0000000..7b1d0b1 --- /dev/null +++ b/platform/devices/MX8DXL/linker/gcc/MX8DXL_overlay.t.ld @@ -0,0 +1,312 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* DO NOT EDIT - This file auto generated by $cmd */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_ocram (RX) : ORIGIN = 0x00100000, LENGTH = 0x00040000 + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002ED80 + m_ovl (RX) : ORIGIN = 0x2000F000, LENGTH = 0x00000FF0 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + OVERLAY : NOCROSSREFS + { +<% $counter = 0 %> +<%OV_LIST%> + .test$counter { */test_$tests[$counter].o(.text*) */test_$tests[$counter].o(.rodata*) } +<% $counter++; return 'OV_LIST' if $counter < scalar(@tests); '' %> + } > m_ovl AT> m_ocram + + .test_ovly_table : + { + . = ALIGN(4); + __ovly_table = .; + LONG(0x34982933); LONG(0); LONG($last); +<% $counter = 0 %> +<%TB_LIST%> + LONG(ABSOLUTE(ADDR(.test$counter))); LONG(SIZEOF(.test$counter)); LONG(LOADADDR(.test$counter)); +<% $counter++; return 'TB_LIST' if $counter < scalar(@tests); '' %> + LONG(0); LONG(0); LONG(0); + } > m_ocram + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8DXL/linker/gcc/MX8DXL_tcm.ld b/platform/devices/MX8DXL/linker/gcc/MX8DXL_tcm.ld new file mode 100755 index 0000000..55984d3 --- /dev/null +++ b/platform/devices/MX8DXL/linker/gcc/MX8DXL_tcm.ld @@ -0,0 +1,288 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002fd70 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8DXL/system_MX8DXL.h b/platform/devices/MX8DXL/system_MX8DXL.h new file mode 100755 index 0000000..ade2b54 --- /dev/null +++ b/platform/devices/MX8DXL/system_MX8DXL.h @@ -0,0 +1,198 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2017- 2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#ifndef SYSTEM_H +#define SYSTEM_H /**< Symbol preventing repeated inclusion */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Defines */ + +/* Reset requires 32 cycles of xtal24M to propagate. SysTick clocked from + ROSC will be used for delay. + + ROSC @ 200 MHz +*/ +#define RESET_WAIT_ROSC_CYCLES (((SC_ROSC_FREQ_HZ / SC_XTAL24M_FREQ_HZ) + 1U) * 32U) + +/* Define delay for top-level top-level SSI power switch chains. + */ +#define SYSCTR_NSEC_TO_CYCLES(nsec) ((((nsec) * SC_MCU_STARTUP_FREQ_MHZ) + 999U) / 1000U) +#define SSI_CHAIN_LF_CYCLES (SYSCTR_NSEC_TO_CYCLES(500U)) +#define SSI_CHAIN_HF_CYCLES (SYSCTR_NSEC_TO_CYCLES(2000U)) + +/* OSC24M lock spec unknown, use conservative 4ms */ +#define OSC24M_WAIT_ROSC_CYCLES (4*SC_ROSC_FREQ_HZ/1000U) + +/* Address for environment event trigger */ +#define SC_ENV_TRIG_ADDR 0x2000FFF0U + +/* Query to determine if firmware loaded by ROM */ +#ifndef SIMU +#define SCFW_LOADED_BY_ROM ((DSC_SC->GPR_CTRL[0].RW & BIT(31))) +#else +#define SCFW_LOADED_BY_ROM (0x80000000U) +#endif + +/* Query to determine boot mode + * BOOT_MODE[7:0] tied to DSC.GPR_STAT[0] bits [23:16] + */ +#define SC_BOOT_MODE ((DSC_SC->GPR_STAT[0].RW & 0x00FF0000U) >> 16U) + +/* BOOT_MODE = Infinite loop mode = bXXXX1110 = 0x0E */ +#define SC_BOOT_MODE_INF_LOOP 0x0EU + +/* Margin to wake system early from LLS for WDOG servicing */ +#define SC_WAKE_MARGIN_MSEC 5U + +#ifdef DEBUG +extern uint32_t __DEBUG_DATA[]; +#define SCFW_DBG_READY (__DEBUG_DATA[0]) +#define SCFW_DBG_SKIPS (__DEBUG_DATA[1]) +#define SCFW_DBG_DUMP_PTR (&(__DEBUG_DATA[2])) +#define SCFW_DBG_DUMP_R0 (__DEBUG_DATA[2]) +#define SCFW_DBG_DUMP_R1 (__DEBUG_DATA[3]) +#define SCFW_DBG_DUMP_R2 (__DEBUG_DATA[4]) +#define SCFW_DBG_DUMP_R3 (__DEBUG_DATA[5]) +#define SCFW_DBG_DUMP_R12 (__DEBUG_DATA[6]) +#define SCFW_DBG_DUMP_LR (__DEBUG_DATA[7]) +#define SCFW_DBG_DUMP_PC (__DEBUG_DATA[8]) +#define SCFW_DBG_DUMP_PSR (__DEBUG_DATA[9]) +#define SCFW_DBG_SCTR_TICKS (__DEBUG_DATA[10]) +#define SCFW_DBG_RSVD0 (__DEBUG_DATA[11]) +#define SCFW_DBG_TX_PTR (&__DEBUG_DATA[12]) +#define SCFW_DBG_RX_PTR (&__DEBUG_DATA[13]) +#endif + +#define SC_ENV_TRIG_DUMP 0xc0ffee10U //!< Start dump +#define SC_ENV_TRIG_KILL 0xc0ffee20U //!< Kill execution + +/* Types */ + +/*! + * This type is used to indicate the trigger event. + */ +typedef uint32_t sc_env_trig_event_t; + +/** + * @brief Generate environment event trigger + * + */ +void SystemEventTrigger (sc_env_trig_event_t event); + +/** + * @brief Enter firmware critical section. + * + */ +void SystemEnterCS(void); + +/** + * @brief Exit firmware critical section. + * + */ +void SystemExitCS(void); + +/** + * @brief Get active exception. + * + */ +uint32_t SystemGetActiveException(void); + +/** + * @brief Setup the microcontroller system. + * + * Typically this function configures the oscillator (PLL) that is part of the + * microcontroller device. For systems with variable clock speed it also updates + * the variable SystemCoreClock. SystemInit is called from startup_device file. + */ +void SystemInit(void); + +void SystemInitPostCRT(void); + +/** + * @brief Prepares to enter Low-Power Mode (LPM) + * + */ +void SystemPrepareLPM(void); + +void SystemEnterLPM(void); + +/** + * @brief Delays the specified number of usec + * + */ +void SystemTimeDelay(uint32_t usec); + +void SystemDebugWaitAttach(void); + +void CommonFault_Handler(uint32_t *sp); + +void SystemDebugHalt(void); + +void SystemExit(void); + +void HardFault_Handler(uint32_t *sp); + +void MemManage_Handler(uint32_t *sp); + +void BusFault_Handler(uint32_t *sp); + +void UsageFault_Handler(uint32_t *sp); + +void SystemDebugResume(void); + +#if defined(DEBUG) || defined(HAS_TEST) +uint32_t SystemMemoryProbe(void *addr, void *val, uint8_t width); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* #if !defined(SYSTEM_H_) */ diff --git a/platform/devices/MX8QM/MX8QM.h b/platform/devices/MX8QM/MX8QM.h new file mode 100755 index 0000000..77b0ec0 --- /dev/null +++ b/platform/devices/MX8QM/MX8QM.h @@ -0,0 +1,757 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8QM.h + * @version 1.7 + * @date 2015-05-16 + * @brief CMSIS Peripheral Access Layer for MX8QM + * + * CMSIS Peripheral Access Layer for MX8QM + */ + +#ifndef MX8QM_H +#define MX8QM_H /**< Symbol preventing repeated inclusion */ + +/* Check for valid CPU versions */ +#if !defined(SREV_B0) + #error "Invalid SOC revision!\n" +#endif + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100U +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0007U + + +/* ---------------------------------------------------------------------------- + -- Memory Map (SC perspective) + ---------------------------------------------------------------------------- */ + +#define LSIO_SS_BASE1 0x00000000U /* LSIO SS - slot 1 */ +#define OCRAM_ALIAS_BASE (LSIO_SS_BASE1+0x000000U) /* OCRAM alias */ +#define SC_ROM_BASE 0x00000000U /* SC ROM */ +#define OCRAM_BASE (LSIO_SS_BASE1+0x100000U) /* OCRAM */ +#define FSPI0_MEM_BASE (LSIO_SS_BASE1+0x8000000U) /* FlexSPI0 Memory */ +#define TCML_BASE 0x1FFE0000U /* SC TCML */ +#define TCMU_BASE 0x20000000U /* SC TCMU */ +#define CAAM_BASE 0x20400000U /* SC CAAM */ +#define ADM_BASE 0x20520000U /* SC ADM */ +#define OTP_BASE 0x20530000U /* SC OTP */ +#define SNVS_BASE 0x20540000U /* SC SNVS */ +#define MU0_BASE 0x20550000U /* SECO MU 1 */ +#define VPU_SS_BASE1 0x2C000000U /* VPU SS - slot 1 */ +#define VPU_SCB_BASE (VPU_SS_BASE1+0x0070000U) /* VPU SCB */ +#define VPU_MFD_BASE (VPU_SS_BASE1+0x01B0000U) /* VPU Decoder */ +#define LPUART1_BASE (VPU_SS_BASE1+0x0200000U) /* VPU LPUART */ +#define MU7_BASE (VPU_SS_BASE1+0x1010000U) /* VPU MU 0 */ +#define MU8_BASE (VPU_SS_BASE1+0x1030000U) /* VPU MU 1 */ +#define SCU_SS_BASE0 0x30000000U /* SCU SS - slot 0 */ +#define TCML0_BASE (SCU_SS_BASE0+0x00FE0000U) /* SCU TCML */ +#define TCMU0_BASE (SCU_SS_BASE0+0x01000000U) /* SCU TCMU */ +#define MCU_0_SS_BASE0 0x34000000U /* MCU 0 SS - slot 0 */ +#define TCML1_BASE (MCU_0_SS_BASE0+0x0FE0000U) /* MCU 0 TCML */ +#define TCMU1_BASE (MCU_0_SS_BASE0+0x1000000U) /* MCU 0 TCMU */ +#define RGPIOB_BASE (MCU_0_SS_BASE0+0x30F0000U) /* MCU 0 RGPIO */ +#define LPUART2_BASE (MCU_0_SS_BASE0+0x3220000U) /* MCU 0 LPUART */ +#define LPI2C1_BASE (MCU_0_SS_BASE0+0x3230000U) /* MCU 0 LPI2C */ +#define WDOG1_BASE (MCU_0_SS_BASE0+0x3420000U) /* MCU 0 WDOG */ +#define MU9_BASE (MCU_0_SS_BASE0+0x3480000U) /* MCU 0 MU 1A */ +#define MCU_1_SS_BASE0 0x38000000U /* MCU 1 SS - slot 0 */ +#define TCML2_BASE (MCU_1_SS_BASE0+0x0FE0000U) /* MCU 1 TCML */ +#define TCMU2_BASE (MCU_1_SS_BASE0+0x1000000U) /* MCU 1 TCMU */ +#define RGPIOC_BASE (MCU_1_SS_BASE0+0x30F0000U) /* MCU 1 RGPIO */ +#define LPUART3_BASE (MCU_1_SS_BASE0+0x3220000U) /* MCU 1 LPUART */ +#define LPI2C2_BASE (MCU_1_SS_BASE0+0x3230000U) /* MCU 1 LPI2C */ +#define WDOG2_BASE (MCU_1_SS_BASE0+0x3420000U) /* MCU 1 WDOG */ +#define MU10_BASE (MCU_1_SS_BASE0+0x3480000U) /* MCU 1 MU 1A */ +#define SYSCTR_CTRL_BASE 0x40000000U /* SC SYSCTR Control */ +#define SYSCTR_RD_BASE 0x40010000U /* SC SYSCTR Read */ +#define SYSCTR_CMP_BASE 0x40020000U /* SC SYSCTR Compare 0 */ +#define SYSCTR_CMP1_BASE 0x40020100U /* SC SYSCTR Compare 1 */ +#define LPC_BASE 0x40070000U /* SC LPC */ +#define CSGPR_BASE 0x40470000U /* CoreSight GPR */ +#define AP_1_DEBUG_APB_BASE 0x40600000U /* AP_1 Debug APB */ +#define AP_0_DEBUG_APB_BASE 0x40800000U /* AP_0 Debug APB */ +#define AP_2_DEBUG_APB_BASE 0x40800000U /* AP_2 Debug APB */ +#define RGPIOA_BASE 0x410F0000U /* SC RGPIO */ +#define LPIT0_BASE 0x41210000U /* SC LPIT */ +#define LPUART0_BASE 0x41220000U /* SC LPUART */ +#define LPI2C0_BASE 0x41230000U /* SC LPI2C */ +#define ASMC_BASE 0x41410000U /* SC ASMC */ +#define WDOG0_BASE 0x41420000U /* SC WDOG */ +#define MU1_BASE 0x41430000U /* SC MU 0B */ +#define MU2_BASE 0x41440000U /* SC MU 0A0 */ +#define MU3_BASE 0x41450000U /* SC MU 0A1 */ +#define MU4_BASE 0x41460000U /* SC MU 0A2 */ +#define MU5_BASE 0x41470000U /* SC MU 0A3 */ +#define MU6_BASE 0x41480000U /* SC MU 1A */ +#define MSI0_BASE 0x41800000U /* SC DSC MSI Ring 0 */ +#define DSC1_BASE 0x41820000U /* SC SC DSC */ +#define REP2_BASE 0x4182B000U /* SC MBIST MTR */ +#define MSI1_BASE 0x41A00000U /* SC DSC MSI Ring 1 */ +#define DSC17_BASE 0x41A20000U /* SC MCU_0 DSC */ +#define DSC18_BASE 0x41A40000U /* SC DRC_0 DSC */ +#define DSC19_BASE 0x41A60000U /* SC DC_1 DSC */ +#define DSC20_BASE 0x41A80000U /* SC MCU_1 DSC */ +#define DSC21_BASE 0x41AA0000U /* SC GPU_1 DSC */ +#define DSC22_BASE 0x41AC0000U /* SC CONN DSC */ +#define DSC23_BASE 0x41AE0000U /* SC VPU DSC */ +#define DSC25_BASE 0x41B20000U /* SC CCI DSC */ +#define MSI2_BASE 0x41C00000U /* SC DSC MSI Ring 2 */ +#define DSC33_BASE 0x41C20000U /* SC AP_1 DSC */ +#define DSC34_BASE 0x41C40000U /* SC DB DSC */ +#define DSC35_BASE 0x41C60000U /* SC AP_0 DSC */ +#define DSC36_BASE 0x41C80000U /* SC HSIO DSC */ +#define DSC37_BASE 0x41CA0000U /* SC LSIO DSC */ +#define DSC38_BASE 0x41CC0000U /* SC GPU_0 DSC */ +#define DSC39_BASE 0x41CE0000U /* SC DC_0 DSC */ +#define DSC40_BASE 0x41D00000U /* SC DRC_1 DSC */ +#define DSC41_BASE 0x41D20000U /* SC DMA DSC */ +#define MSI3_BASE 0x41E00000U /* SC DSC MSI Ring 3 */ +#define DSC49_BASE 0x41E20000U /* SC DBLOG DSC */ +#define DSC50_BASE 0x41E40000U /* SC IMG DSC */ +#define DSC51_BASE 0x41E60000U /* SC AUDIO DSC */ +#define DSC52_BASE 0x41E80000U /* SC HDMI DSC */ +#define DSC53_BASE 0x41EA0000U /* SC HDMI_RX DSC */ +#define DSC54_BASE 0x41EC0000U /* SC CSI_1 DSC */ +#define DSC55_BASE 0x41EE0000U /* SC CSI_0 DSC */ +#define DSC56_BASE 0x41F00000U /* SC MIPI_1 DSC */ +#define DSC57_BASE 0x41F20000U /* SC MIPI_0 DSC */ +#define DSC58_BASE 0x41F40000U /* SC LVDS_1 DSC */ +#define DSC59_BASE 0x41F60000U /* SC LVDS_0 DSC */ +#define PAD_BASE 0x41F80000U /* SC Pad */ +#define MSI4_BASE 0x41F9F000U /* SC Pad MSI Ring 0 */ +#define MSI5_BASE 0x41FBF000U /* SC Pad MSI Ring 1 */ +#define MSI6_BASE 0x41FDF000U /* SC Pad MSI Ring 2 */ +#define MSI7_BASE 0x41FFF000U /* SC Pad MSI Ring 3 */ +#define DBLOG_SS_BASE0 0x51000000U /* DBLOGIC SS - slot 0 */ +#define IRQSTR_SCU_BASE (DBLOG_SS_BASE0+0x060000U) /* IRQSTR.SCU1 */ +#define SMMU0_BASE (DBLOG_SS_BASE0+0x400000U) /* SMMU 0 */ +#define GIC0_BASE (DBLOG_SS_BASE0+0xA00000U) /* GIC 0 */ +#define AP_SS_BASE0 0x52000000U /* AP SS - slot 0 */ +#define CCI_BASE (AP_SS_BASE0+0x90000U) /* CCI */ +#define GPU_0_SS_BASE0 0x53000000U /* GPU 0 SS - slot 0 */ +#define GPU_1_SS_BASE0 0x54000000U /* GPU 1 SS - slot 0 */ +#define VPU_SS_BASE0 0x55000000U /* VPU SS - slot 0 */ +#define DSP_DRAM_BASE (VPU_SS_BASE0+0x6E8000U) /* DSP DRAM */ +#define DSP_DRAM1_BASE (VPU_SS_BASE0+0x6F0000U) /* DSP DRAM 1 */ +#define DSP_IRAM_BASE (VPU_SS_BASE0+0x6F8000U) /* DSP IRAM */ +#define DSP_OCRAM_BASE (VPU_SS_BASE0+0x700000U) /* DSP OCRAM */ +#define DC_0_SS_BASE0 0x56000000U /* DC 0 SS - slot 0 */ +#define DC_0_ADDR_0 (DC_0_SS_BASE0+0x00000U) /* DC 0 test addr 0 */ +#define DC_0_ADDR_1 (DC_0_SS_BASE0+0x10000U) /* DC 0 test addr 1 */ +#define DC_0_MSI_BASE (DC_0_SS_BASE0+0x200000U) /* DC_0 MSI CTRL */ +#define MIPI_0_SS_BASE (DC_0_SS_BASE0+0x220000U) /* MIPI 0 */ +#define LPI2C3_BASE (MIPI_0_SS_BASE+0x6000U) /* MIPI 0 LPI2C 0 */ +#define LPI2C4_BASE (MIPI_0_SS_BASE+0x7000U) /* MIPI 0 LPI2C 1 */ +#define LVDS_0_SS_BASE (DC_0_SS_BASE0+0x240000U) /* LVDS 0 */ +#define LPI2C5_BASE (LVDS_0_SS_BASE+0x6000U) /* LVDS 0 LPI2C 0 */ +#define LPI2C6_BASE (LVDS_0_SS_BASE+0x7000U) /* LVDS 0 LPI2C 1 */ +#define HDMI_SS_BASE (DC_0_SS_BASE0+0x260000U) /* HDMI */ +#define LPI2C7_BASE (HDMI_SS_BASE+0x6000U) /* HDMI LPI2C */ +#define DC_1_SS_BASE0 0x57000000U /* DC 1 SS - slot 0 */ +#define DC_1_ADDR_0 (DC_1_SS_BASE0+0x00000U) /* DC 1 test addr 0 */ +#define DC_1_ADDR_1 (DC_1_SS_BASE0+0x10000U) /* DC 1 test addr 1 */ +#define DC_1_MSI_BASE (DC_1_SS_BASE0+0x200000U) /* DC_1 MSI CTRL */ +#define MIPI_1_SS_BASE (DC_1_SS_BASE0+0x220000U) /* MIPI 1 */ +#define LPI2C8_BASE (MIPI_1_SS_BASE+0x6000U) /* MIPI 1 LPI2C 0 */ +#define LPI2C9_BASE (MIPI_1_SS_BASE+0x7000U) /* MIPI 1 LPI2C 1 */ +#define LVDS_1_SS_BASE (DC_1_SS_BASE0+0x240000U) /* LVDS 1 */ +#define LPI2C10_BASE (LVDS_1_SS_BASE+0x6000U) /* LVDS 1 LPI2C 0 */ +#define LPI2C11_BASE (LVDS_1_SS_BASE+0x7000U) /* LVDS 1 LPI2C 1 */ +#define IMG_SS_BASE0 0x58000000U /* IMG SS - slot 0 */ +#define IMG_0_GPIO_BASE (IMG_SS_BASE0+0x000000U) /* IMG GPIO */ +#define ISI0_BASE (IMG_SS_BASE0+0x100000U) /* IMG CH0 */ +#define ISI1_BASE (IMG_SS_BASE0+0x110000U) /* IMG CH1 */ +#define ISI2_BASE (IMG_SS_BASE0+0x120000U) /* IMG CH2 */ +#define ISI3_BASE (IMG_SS_BASE0+0x130000U) /* IMG CH3 */ +#define ISI4_BASE (IMG_SS_BASE0+0x140000U) /* IMG CH4 */ +#define ISI5_BASE (IMG_SS_BASE0+0x150000U) /* IMG CH5 */ +#define ISI6_BASE (IMG_SS_BASE0+0x160000U) /* IMG CH6 */ +#define ISI7_BASE (IMG_SS_BASE0+0x170000U) /* IMG CH7 */ +#define IMG_0_MSI_BASE (IMG_SS_BASE0+0x200000U) /* IMG MSI CTRL */ +#define CSI_0_SS_BASE (IMG_SS_BASE0+0x220000U) /* CSI 0 */ +#define LPI2C12_BASE (CSI_0_SS_BASE+0x6000U) /* CSI 0 LPI2C 0 */ +#define CSI_1_SS_BASE (IMG_SS_BASE0+0x240000U) /* CSI 1 */ +#define LPI2C13_BASE (CSI_1_SS_BASE+0x6000U) /* CSI 1 LPI2C 0 */ +#define HDMI_RX_SS_BASE (IMG_SS_BASE0+0x260000U) /* HDMI RX */ +#define LPI2C14_BASE (HDMI_RX_SS_BASE+0x6000U) /* HDMI RX LPI2C */ +#define AUDIO_SS_BASE0 0x59000000U /* AUDIO SS - slot 0 */ +#define DMA0_BASE (AUDIO_SS_BASE0+0x1F0000U) /* Audio eDMA 0 MP */ +#define DMA1_BASE (AUDIO_SS_BASE0+0x9F0000U) /* Audio eDMA 1 MP */ +#define DMA_SS_BASE0 0x5A000000U /* DMA SS - slot 0 */ +#define LPUART4_BASE (DMA_SS_BASE0+0x060000U) /* DMA LPUART 0 */ +#define LPUART5_BASE (DMA_SS_BASE0+0x070000U) /* DMA LPUART 1 */ +#define LPUART6_BASE (DMA_SS_BASE0+0x080000U) /* DMA LPUART 2 */ +#define LPUART7_BASE (DMA_SS_BASE0+0x090000U) /* DMA LPUART 3 */ +#define LPUART8_BASE (DMA_SS_BASE0+0x0A0000U) /* DMA LPUART 4 */ +#define DMA2_BASE (DMA_SS_BASE0+0x1F0000U) /* DMA eDMA 0 MP */ +#define LPI2C15_BASE (DMA_SS_BASE0+0x800000U) /* DMA LPI2C 0 */ +#define LPI2C16_BASE (DMA_SS_BASE0+0x810000U) /* DMA LPI2C 1 */ +#define LPI2C17_BASE (DMA_SS_BASE0+0x820000U) /* DMA LPI2C 2 */ +#define LPI2C18_BASE (DMA_SS_BASE0+0x830000U) /* DMA LPI2C 3 */ +#define LPI2C19_BASE (DMA_SS_BASE0+0x840000U) /* DMA LPI2C 4 */ +#define DMA3_BASE (DMA_SS_BASE0+0x9F0000U) /* DMA eDMA 1 MP */ +#define CONN_SS_BASE0 0x5B000000U /* CONN SS - slot 0 */ +#define SDHC0_BASE (CONN_SS_BASE0+0x010000U) /* CONN SDHC 0 */ +#define SDHC1_BASE (CONN_SS_BASE0+0x020000U) /* CONN SDHC 1 */ +#define SDHC2_BASE (CONN_SS_BASE0+0x030000U) /* CONN SDHC 2 */ +#define ENET0_BASE (CONN_SS_BASE0+0x040000U) /* CONN ENET 0 */ +#define ENET1_BASE (CONN_SS_BASE0+0x050000U) /* CONN ENET 1 */ +#define DMA4_BASE (CONN_SS_BASE0+0x070000U) /* CONN eDMA MP */ +#define USB_0_BASE (CONN_SS_BASE0+0x0D0000U) /* CONN USB 0 */ +#define USB_1_BASE (CONN_SS_BASE0+0x0E0000U) /* CONN USB 1 */ +#define USB_0_PHY_BASE (CONN_SS_BASE0+0x100000U) /* CONN USB 0 PHY */ +#define USB_1_PHY_BASE (CONN_SS_BASE0+0x110000U) /* CONN USB 1 PHY */ +#define ENET0_LPCG (CONN_SS_BASE0+0x230000U) /* CONN ENET 0 LPCG */ +#define NAND_BASE (CONN_SS_BASE0+0x810000U) /* CONN NAND */ +#define DB_SS_BASE0 0x5C000000U /* DB SS - slot 0 */ +#define DRC_0_LPCG_0 (DB_SS_BASE0+0x0C0000U) /* DRC 0 LPCG 0 */ +#define DRC_0_LPCG_1 (DB_SS_BASE0+0x0D0000U) /* DRC 0 LPCG 1 */ +#define DRC_0_LPCG_2 (DB_SS_BASE0+0x0E0000U) /* DRC 0 LPCG 2 */ +#define DRC_0_LPCG_3 (DB_SS_BASE0+0x0F0000U) /* DRC 0 LPCG 3 */ +#define DRC_1_LPCG_0 (DB_SS_BASE0+0x1C0000U) /* DRC 1 LPCG 0 */ +#define DRC_1_LPCG_1 (DB_SS_BASE0+0x1D0000U) /* DRC 1 LPCG 1 */ +#define DRC_1_LPCG_2 (DB_SS_BASE0+0x1E0000U) /* DRC 1 LPCG 2 */ +#define DRC_1_LPCG_3 (DB_SS_BASE0+0x1F0000U) /* DRC 1 LPCG 3 */ +#define STC0_BASE (DB_SS_BASE0+0x400000U) /* DB PG0 STC 0 */ +#define STC1_BASE (DB_SS_BASE0+0x410000U) /* DB PG0 STC 1 */ +#define STC2_BASE (DB_SS_BASE0+0x420000U) /* DB PG0 STC 2 */ +#define STC3_BASE (DB_SS_BASE0+0x430000U) /* DB PG0 STC 3 */ +#define DB_LPCG_PG0_BASE (DB_SS_BASE0+0x4F0000U) /* DB PG0 LPCG */ +#define STC4_BASE (DB_SS_BASE0+0x500000U) /* DB PG1 STC 0 */ +#define STC5_BASE (DB_SS_BASE0+0x510000U) /* DB PG1 STC 1 */ +#define STC6_BASE (DB_SS_BASE0+0x520000U) /* DB PG1 STC 2 */ +#define STC7_BASE (DB_SS_BASE0+0x530000U) /* DB PG1 STC 3 */ +#define DB_LPCG_PG1_BASE (DB_SS_BASE0+0x5F0000U) /* DB PG1 LPCG */ +#define STC8_BASE (DB_SS_BASE0+0x600000U) /* DB PG2 STC 0 */ +#define STC9_BASE (DB_SS_BASE0+0x610000U) /* DB PG2 STC 1 */ +#define STC10_BASE (DB_SS_BASE0+0x620000U) /* DB PG2 STC 2 */ +#define STC11_BASE (DB_SS_BASE0+0x630000U) /* DB PG2 STC 3 */ +#define DB_LPCG_PG2_BASE (DB_SS_BASE0+0x6F0000U) /* DB PG2 LPCG */ +#define STC12_BASE (DB_SS_BASE0+0x700000U) /* DB PG3 STC 0 */ +#define STC13_BASE (DB_SS_BASE0+0x710000U) /* DB PG3 STC 1 */ +#define STC14_BASE (DB_SS_BASE0+0x720000U) /* DB PG3 STC 2 */ +#define STC15_BASE (DB_SS_BASE0+0x730000U) /* DB PG3 STC 3 */ +#define DB_LPCG_PG3_BASE (DB_SS_BASE0+0x7F0000U) /* DB PG3 LPCG */ +#define DB_LPCG_BN_BASE (DB_SS_BASE0+0xAF0000U) /* DB BN LPCG */ +#define LSIO_SS_BASE0 0x5D000000U /* LSIO SS - slot 0 */ +#define PWM0_BASE (LSIO_SS_BASE0+0x000000U) /* LSIO PWM 0 */ +#define PWM1_BASE (LSIO_SS_BASE0+0x010000U) /* LSIO PWM 1 */ +#define PWM2_BASE (LSIO_SS_BASE0+0x020000U) /* LSIO PWM 2 */ +#define PWM3_BASE (LSIO_SS_BASE0+0x030000U) /* LSIO PWM 3 */ +#define PWM4_BASE (LSIO_SS_BASE0+0x040000U) /* LSIO PWM 4 */ +#define PWM5_BASE (LSIO_SS_BASE0+0x050000U) /* LSIO PWM 5 */ +#define PWM6_BASE (LSIO_SS_BASE0+0x060000U) /* LSIO PWM 6 */ +#define PWM7_BASE (LSIO_SS_BASE0+0x070000U) /* LSIO PWM 7 */ +#define GPIO0_BASE (LSIO_SS_BASE0+0x080000U) /* LSIO GPIO 0 */ +#define GPIO1_BASE (LSIO_SS_BASE0+0x090000U) /* LSIO GPIO 1 */ +#define GPIO2_BASE (LSIO_SS_BASE0+0x0A0000U) /* LSIO GPIO 2 */ +#define GPIO3_BASE (LSIO_SS_BASE0+0x0B0000U) /* LSIO GPIO 3 */ +#define GPIO4_BASE (LSIO_SS_BASE0+0x0C0000U) /* LSIO GPIO 4 */ +#define GPIO5_BASE (LSIO_SS_BASE0+0x0D0000U) /* LSIO GPIO 5 */ +#define GPIO6_BASE (LSIO_SS_BASE0+0x0E0000U) /* LSIO GPIO 6 */ +#define GPIO7_BASE (LSIO_SS_BASE0+0x0F0000U) /* LSIO GPIO 7 */ +#define FSPI0_BASE (LSIO_SS_BASE0+0x120000U) /* FSPI0 */ +#define FSPI1_BASE (LSIO_SS_BASE0+0x130000U) /* FSPI1 */ +#define GPT0_BASE (LSIO_SS_BASE0+0x140000U) /* LSIO GPT 0 */ +#define GPT1_BASE (LSIO_SS_BASE0+0x150000U) /* LSIO GPT 1 */ +#define GPT2_BASE (LSIO_SS_BASE0+0x160000U) /* LSIO GPT 2 */ +#define GPT3_BASE (LSIO_SS_BASE0+0x170000U) /* LSIO GPT 3 */ +#define GPT4_BASE (LSIO_SS_BASE0+0x180000U) /* LSIO GPT 4 */ +#define KPP_BASE (LSIO_SS_BASE0+0x1A0000U) /* LSIO KPP */ +#define MU11_BASE (LSIO_SS_BASE0+0x1B0000U) /* LSIO MU 0A */ +#define MU12_BASE (LSIO_SS_BASE0+0x1C0000U) /* LSIO MU 1A */ +#define MU13_BASE (LSIO_SS_BASE0+0x1D0000U) /* LSIO MU 2A */ +#define MU14_BASE (LSIO_SS_BASE0+0x1E0000U) /* LSIO MU 3A */ +#define MU15_BASE (LSIO_SS_BASE0+0x1F0000U) /* LSIO MU 4A */ +#define IEE_BASE (LSIO_SS_BASE0+0x320000U) /* IEE */ +#define IEE_R0_BASE (LSIO_SS_BASE0+0x330000U) /* IEE R0 */ +#define IEE_R1_BASE (LSIO_SS_BASE0+0x340000U) /* IEE R1 */ +#define HSIO_0_SS_BASE0 0x5F000000U /* HSIO 0 SS - slot 0 */ +#define HSIO_0_LPCG_GPIO (HSIO_0_SS_BASE0+0x100000U) /* HSIO 0 GPIO LPCG */ +#define HSIO_0_SS_BASE1 0x60000000U /* HSIO 0 SS - slot 1 */ +#define HSIO_0_SS_BASE2 0x70000000U /* HSIO 0 SS - slot 2 */ +#define DDR_BASE0 0x80000000U /* DDR */ +#define MCM_BASE 0xE0080000U /* SC MCM */ +#define LMEM_BASE 0xE0082000U /* SC LMEM */ +#define DDR_BASE0_END 0xFFFFFFFFU /* Top of DDR 0 */ +#define LSIO_SS_BASE2 0x400000000ULL /* LSIO SS - slot 2 */ +#define FSPI1_MEM_BASE (LSIO_SS_BASE2+0x0U) /* FlexSPI1 Memory */ +#define DDR_BASE1 0x880000000ULL /* DDR - Hi */ +#define DDR_BASE1_END 0xFFFFFFFFFULL /* Top of DDR 1 */ + +/* Unused */ + +#define DSC2_BASE 0 +#define DSC3_BASE 0 +#define DSC4_BASE 0 +#define DSC5_BASE 0 +#define DSC6_BASE 0 +#define DSC7_BASE 0 +#define DSC8_BASE 0 +#define DSC9_BASE 0 +#define DSC10_BASE 0 +#define DSC11_BASE 0 +#define DSC12_BASE 0 +#define DSC13_BASE 0 +#define DSC14_BASE 0 +#define DSC15_BASE 0 +#define DSC24_BASE 0 +#define DSC26_BASE 0 +#define DSC27_BASE 0 +#define DSC28_BASE 0 +#define DSC29_BASE 0 +#define DSC30_BASE 0 +#define DSC31_BASE 0 +#define DSC42_BASE 0 +#define DSC43_BASE 0 +#define DSC44_BASE 0 +#define DSC45_BASE 0 +#define DSC46_BASE 0 +#define DSC47_BASE 0 +#define DSC60_BASE 0 +#define DSC61_BASE 0 +#define DSC62_BASE 0 +#define DSC63_BASE 0 +#define LPI2C20_BASE 0 +#define LPI2C21_BASE 0 +#define LPI2C22_BASE 0 +#define LPI2C23_BASE 0 +#define LPI2C24_BASE 0 +#define LPI2C25_BASE 0 +#define DMA5_BASE 0 +#define DMA6_BASE 0 +#define ISI8_BASE 0 +#define ISI9_BASE 0 +#define ISI10_BASE 0 +#define ISI11_BASE 0 +#define ISI12_BASE 0 +#define ISI13_BASE 0 +#define ISI14_BASE 0 +#define ISI15_BASE 0 +#define ISI16_BASE 0 +#define ISI17_BASE 0 +#define ISI18_BASE 0 +#define ISI19_BASE 0 +#define ISI20_BASE 0 +#define ISI21_BASE 0 +#define ISI22_BASE 0 +#define ISI23_BASE 0 +#define MU16_BASE 0 +#define MU17_BASE 0 +#define MU18_BASE 0 +#define MU19_BASE 0 +#define MU20_BASE 0 +#define MU21_BASE 0 +#define MU22_BASE 0 +#define MU23_BASE 0 +#define MU24_BASE 0 +#define STC16_BASE 0 +#define STC17_BASE 0 +#define STC18_BASE 0 +#define STC19_BASE 0 +#define STC20_BASE 0 +#define STC21_BASE 0 +#define STC22_BASE 0 +#define STC23_BASE 0 + + +/* ---------------------------------------------------------------------------- + -- Device Mapping + ---------------------------------------------------------------------------- */ + +#define DMA_AUDIO0 DMA0 +#define DMA_AUDIO1 DMA1 +#define DMA_PERIPH0 DMA2 +#define DMA_PERIPH1 DMA3 +#define DMA_CONN DMA4 +#define DSC_SC DSC1 +#define DSC_MCU_0 DSC17 +#define DSC_DRC_0 DSC18 +#define DSC_DC_1 DSC19 +#define DSC_MCU_1 DSC20 +#define DSC_GPU_1 DSC21 +#define DSC_CONN DSC22 +#define DSC_VPU DSC23 +#define DSC_CCI DSC25 +#define DSC_AP_1 DSC33 +#define DSC_DB DSC34 +#define DSC_AP_0 DSC35 +#define DSC_HSIO DSC36 +#define DSC_LSIO DSC37 +#define DSC_GPU_0 DSC38 +#define DSC_DC_0 DSC39 +#define DSC_DRC_1 DSC40 +#define DSC_DMA DSC41 +#define DSC_DBLOG DSC49 +#define DSC_IMG DSC50 +#define DSC_AUDIO DSC51 +#define DSC_HDMI DSC52 +#define DSC_HDMI_RX DSC53 +#define DSC_CSI_1 DSC54 +#define DSC_CSI_0 DSC55 +#define DSC_MIPI_1 DSC56 +#define DSC_MIPI_0 DSC57 +#define DSC_LVDS_1 DSC58 +#define DSC_LVDS_0 DSC59 +#define GPIO_SC RGPIOA +#define GPIO_MCU_0 RGPIOB +#define GPIO_MCU_1 RGPIOC +#define ISI_IMG_0_CH0 ISI0 +#define ISI_IMG_0_CH1 ISI1 +#define ISI_IMG_0_CH2 ISI2 +#define ISI_IMG_0_CH3 ISI3 +#define ISI_IMG_0_CH4 ISI4 +#define ISI_IMG_0_CH5 ISI5 +#define ISI_IMG_0_CH6 ISI6 +#define ISI_IMG_0_CH7 ISI7 +#define LPI2C_SC LPI2C0 +#define LPI2C_MCU_0 LPI2C1 +#define LPI2C_MCU_1 LPI2C2 +#define LPI2C_MIPI0_0 LPI2C3 +#define LPI2C_MIPI0_1 LPI2C4 +#define LPI2C_LVDS0_0 LPI2C5 +#define LPI2C_LVDS0_1 LPI2C6 +#define LPI2C_HDMI LPI2C7 +#define LPI2C_MIPI1_0 LPI2C8 +#define LPI2C_MIPI1_1 LPI2C9 +#define LPI2C_LVDS1_0 LPI2C10 +#define LPI2C_LVDS1_1 LPI2C11 +#define LPI2C_CSI0_0 LPI2C12 +#define LPI2C_CSI1_0 LPI2C13 +#define LPI2C_HDMI_RX LPI2C14 +#define LPI2C_0 LPI2C15 +#define LPI2C_1 LPI2C16 +#define LPI2C_2 LPI2C17 +#define LPI2C_3 LPI2C18 +#define LPI2C_4 LPI2C19 +#define LPIT_SC LPIT0 +#define LPUART_SC LPUART0 +#define LPUART_VPU_0 LPUART1 +#define LPUART_MCU_0 LPUART2 +#define LPUART_MCU_1 LPUART3 +#define LPUART_0 LPUART4 +#define LPUART_1 LPUART5 +#define LPUART_2 LPUART6 +#define LPUART_3 LPUART7 +#define LPUART_4 LPUART8 +#define MU_SECO MU0 +#define MU_SC_0B MU1 +#define MU_SC_0A0 MU2 +#define MU_SC_0A1 MU3 +#define MU_SC_0A2 MU4 +#define MU_SC_0A3 MU5 +#define MU_SC_1A MU6 +#define MU_VPU_0 MU7 +#define MU_VPU_1 MU8 +#define MU_MCU_0_1A MU9 +#define MU_MCU_1_1A MU10 +#define MU_LSIO_0A MU11 +#define MU_LSIO_1A MU12 +#define MU_LSIO_2A MU13 +#define MU_LSIO_3A MU14 +#define MU_LSIO_4A MU15 +#define STC_PG0_0 STC0 +#define STC_PG0_1 STC1 +#define STC_PG0_2 STC2 +#define STC_PG0_3 STC3 +#define STC_PG1_0 STC4 +#define STC_PG1_1 STC5 +#define STC_PG1_2 STC6 +#define STC_PG1_3 STC7 +#define STC_PG2_0 STC8 +#define STC_PG2_1 STC9 +#define STC_PG2_2 STC10 +#define STC_PG2_3 STC11 +#define STC_PG3_0 STC12 +#define STC_PG3_1 STC13 +#define STC_PG3_2 STC14 +#define STC_PG3_3 STC15 +#define TCMU_SC TCMU0_BASE +#define TCMU_MCU_0 TCMU1_BASE +#define TCMU_MCU_1 TCMU2_BASE +#define TCML_SC TCML0_BASE +#define TCML_MCU_0 TCML1_BASE +#define TCML_MCU_1 TCML2_BASE +#define WDOG_SC WDOG0 +#define WDOG_MCU_0 WDOG1 +#define WDOG_MCU_1 WDOG2 + +/* ---------------------------------------------------------------------------- + -- CoreSight Granular Power Requestor Mappings + ---------------------------------------------------------------------------- */ +#define CSGPR_CPWRUPREQ (CSGPR_BASE+0x000U) +#define CSGPR_CPWRUPACK (CSGPR_BASE+0x004U) +#define CSGPR_CLAIMSET (CSGPR_BASE+0xFA0U) +#define CSGPR_CLAIMCLR (CSGPR_BASE+0xFA4U) +#define CSGPR_LAR (CSGPR_BASE+0xFB0U) +#define CSGPR_LSR (CSGPR_BASE+0xFB4U) + +#define CSGPR_IDX_A72 4U +#define CSGPR_IDX_A53 5U +#define CSGPR_IDX_MCU_0 6U +#define CSGPR_IDX_MCU_1 7U +#define CSGPR_IDX_VPU 8U + +#define CSGPR_XOR_DSC_REG 1U +#define CSGPR_XOR_DSC_MASK 0x0000FFFFU +#define CSGPR_ACK_DSC_REG 2U +#define CSGPR_ACK_DSC_MASK 0xFFFF0000U + +/* ---------------------------------------------------------------------------- + -- GIC Mappings + ---------------------------------------------------------------------------- */ +#define GICD_BASE (GIC0_BASE+0x000000U) +#define GICR_BASE (GIC0_BASE+0x100000U) + +#define GICD_CTLR_OFS (0x0000U) +#define GICD_CTLR_RWP_MASK (0x80000000U) + +#define GICR_WAKER_OFS (0x0014U) +#define GICR_WAKER_PA_MASK (0x00000002U) +#define GICR_WAKER_CA_MASK (0x00000004U) + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers Interrupt vector numbers + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 256 /**< Number of interrupts in the Vector table */ + +/* Auxiliary constants */ +#define NotAvail_IRQn -128 /**< Not available device specific interrupt */ + +/* Core interrupts */ +#define NonMaskableInt_IRQn -14 /**< Non Maskable Interrupt */ +#define HardFault_IRQn -13 /**< Cortex-M4 SV Hard Fault Interrupt */ +#define MemoryManagement_IRQn -12 /**< Cortex-M4 Memory Management Interrupt */ +#define BusFault_IRQn -11 /**< Cortex-M4 Bus Fault Interrupt */ +#define UsageFault_IRQn -10 /**< Cortex-M4 Usage Fault Interrupt */ +#define SVCall_IRQn -5 /**< Cortex-M4 SV Call Interrupt */ +#define DebugMonitor_IRQn -4 /**< Cortex-M4 Debug Monitor Interrupt */ +#define PendSV_IRQn -2 /**< Cortex-M4 Pend SV Interrupt */ +#define SysTick_IRQn -1 /**< Cortex-M4 System Tick Interrupt */ + +/* Device specific interrupts */ +#define Reserved0_IRQn 0 /**< Reserved interrupt */ +#define Reserved1_IRQn 1 /**< Reserved interrupt */ +#define Reserved2_IRQn 2 /**< Reserved interrupt */ +#define Reserved3_IRQn 3 /**< Reserved interrupt */ +#define Reserved4_IRQn 4 /**< Reserved interrupt */ +#define MCM_IRQn 5 /**< MCM interrupt */ +#define DebugWake_IRQn 6 /**< Debug wake interrupt */ +#define OCOTP_Bank0_IRQn 7 /**< OCOTP bank0 interrupt */ +#define OCOTP_Bank1_IRQn 8 /**< OCOTP bank1 interrupt */ +#define Reserved9_IRQn 9 /**< Reserved interrupt */ +#define INTMUX0_8_IRQn 10 /**< INTMUX0_8 interrupt */ +#define INTMUX0_9_IRQn 11 /**< INTMUX0_9 interrupt */ +#define INTMUX0_10_IRQn 12 /**< INTMUX0_10 interrupt */ +#define INTMUX0_11_IRQn 13 /**< INTMUX0_11 interrupt */ +#define INTMUX0_12_IRQn 14 /**< INTMUX0_12 interrupt */ +#define INTMUX0_13_IRQn 15 /**< INTMUX0_13 interrupt */ +#define INTMUX0_14_IRQn 16 /**< INTMUX0_14 interrupt */ +#define INTMUX0_15_IRQn 17 /**< INTMUX0_15 interrupt */ +#define Reserved18_IRQn 18 /**< Reserved interrupt */ +#define TPM0_IRQn 19 /**< TPM0 interrupt */ +#define Reserved20_IRQn 20 /**< Reserved interrupt */ +#define Reserved21_IRQn 21 /**< Reserved interrupt */ +#define LPIT0_IRQn 22 /**< LPIT0 interrupt */ +#define Reserved23_IRQn 23 /**< Reserved interrupt */ +#define Reserved24_IRQn 24 /**< Reserved interrupt */ +#define LPUART0_IRQn 25 /**< LPUART0 interrupt */ +#define Reserved26_IRQn 26 /**< Reserved interrupt */ +#define LPI2C0_IRQn 27 /**< LPI2C0 interrupt */ +#define Reserved28_IRQn 28 /**< Reserved interrupt */ +#define MU0_B0_IRQn 29 /**< MU0_B0 interrupt */ +#define SECO_MU_NMI_IRQn 30 /**< SECO_MU_NMI interrupt */ +#define SECO_MU_IRQn 31 /**< SECO_MU interrupt */ +#define INTMUX0_0_IRQn 32 /**< INTMUX0_0 interrupt */ +#define INTMUX0_1_IRQn 33 /**< INTMUX0_1 interrupt */ +#define INTMUX0_2_IRQn 34 /**< INTMUX0_2 interrupt */ +#define INTMUX0_3_IRQn 35 /**< INTMUX0_3 interrupt */ +#define INTMUX0_4_IRQn 36 /**< INTMUX0_4 interrupt */ +#define INTMUX0_5_IRQn 37 /**< INTMUX0_5 interrupt */ +#define INTMUX0_6_IRQn 38 /**< INTMUX0_6 interrupt */ +#define INTMUX0_7_IRQn 39 /**< INTMUX0_7 interrupt */ +#define SYSCTR_CMP3_IRQn 40 /**< SYSCTR_CMP3 interrupt */ +#define SYSCTR_CMP2_IRQn 41 /**< SYSCTR_CMP2 interrupt */ +#define SYSCTR_CMP1_IRQn 42 /**< SYSCTR_CMP1 interrupt */ +#define SYSCTR_CMP0_IRQn 43 /**< SYSCTR_CMP0 interrupt */ +#define MU0_B1_IRQn 44 /**< MU0_B1 interrupt */ +#define MU0_B2_IRQn 45 /**< MU0_B2 interrupt */ +#define MU0_B3_IRQn 46 /**< MU0_B3 interrupt */ +#define PMIC_INT_IRQn 47 /**< PMIC_INT interrupt */ +#define PMIC_EarlyWarning_IRQn 48 /**< PMIC_EarlyWarning interrupt */ +#define MU1_A_IRQn 49 /**< MU1_A interrupt */ +#define SWI_IRQn 50 /**< Software interrupt */ +#define SWI_DQS2DQ_IRQn 51 /**< DQS2DQ Software interrupt */ +#define CAAM_IRQ0_IRQn 52 /**< CAAM_IRQ0 interrupt */ +#define CAAM_IRQ1_IRQn 53 /**< CAAM_IRQ1 interrupt */ +#define CAAM_IRQ2_IRQn 54 /**< CAAM_IRQ2 interrupt */ +#define CAAM_IRQ3_IRQn 55 /**< CAAM_IRQ3 interrupt */ +#define CAAM_RTIC_IRQn 56 /**< CAAM_RTIC interrupt */ +#define CAAM_Error_IRQn 57 /**< CAAM_Error interrupt */ +#define SNVS_Functional_IRQn 58 /**< SNVS_Functional interrupt */ +#define SNVS_SecurityViolation_IRQn 59 /**< SNVS_SecurityViolation interrupt */ +#define SNVS_Periodic_IRQn 60 /**< SNVS_Periodic interrupt */ +#define SNVS_Button_IRQn 61 /**< SNVS_Button interrupt */ +#define SNVS_Alarm_IRQn 62 /**< Reserved interrupt */ +#define SNVS_PowerOff_IRQn 63 /**< Reserved interrupt */ +#define DSC00_IRQn 64 /**< DSC0 interrupt */ +#define DSC_SCU_IRQn 64 /**< DSC0 interrupt */ +#define DSC_DB_IRQn 65 /**< DSC1 interrupt */ +#define DSC_DRC_1_IRQn 66 /**< DSC2 interrupt */ +#define DSC03_IRQn 67 /**< DSC3 interrupt */ +#define DSC_HSIO_IRQn 68 /**< DSC4 interrupt */ +#define DSC_CA72_IRQn 69 /**< DSC5 interrupt */ +#define DSC_CCI_IRQn 70 /**< DSC6 interrupt */ +#define DSC_CM4_0_IRQn 71 /**< DSC7 interrupt */ +#define DSC_CM4_1_IRQn 72 /**< DSC8 interrupt */ +#define DSC_GPU_1_IRQn 73 /**< DSC9 interrupt */ +#define DSC_LSIO_IRQn 74 /**< DSC10 interrupt */ +#define DSC_GPU_0_IRQn 75 /**< DSC11 interrupt */ +#define DSC_CA53_IRQn 76 /**< DSC12 interrupt */ +#define DSC_DBLOG_IRQn 77 /**< DSC13 interrupt */ +#define DSC_DC_1_IRQn 78 /**< DSC14 interrupt */ +#define DSC_VPUCORE_IRQn 79 /**< DSC15 interrupt */ +#define DSC_Connectivity_IRQn 80 /**< DSC16 interrupt */ +#define DSC_DI_LVDS_0_IRQn 81 /**< DSC17 interrupt */ +#define DSC_DI_LVDS_1_IRQn 82 /**< DSC18 interrupt */ +#define DSC_DMA_IRQn 83 /**< DSC19 interrupt */ +#define DSC_VPU_IRQn 84 /**< DSC20 interrupt */ +#define DSC21_IRQn 85 /**< DSC21 interrupt */ +#define DSC_DRC_0_IRQn 86 /**< DSC22 interrupt */ +#define DSC_DC_0_IRQn 87 /**< DSC23 interrupt */ +#define DSC_MIPI_CSI_0_IRQn 88 /**< DSC24 interrupt */ +#define DSC_MIPI_CSI_1_IRQn 89 /**< DSC25 interrupt */ +#define DSC_RX_HDMI_IRQn 90 /**< DSC26 interrupt */ +#define DSC_Imaging_IRQn 91 /**< DSC27 interrupt */ +#define DSC_Audio_IRQn 92 /**< DSC28 interrupt */ +#define DSC_DI_HDMI_IRQn 93 /**< DSC29 interrupt */ +#define DSC_DI_MIPI_0_IRQn 94 /**< DSC30 interrupt */ +#define DSC_DI_MIPI_1_IRQn 95 /**< DSC31 interrupt */ +#define DSC31_IRQn 95 /**< DSC31 interrupt */ +#define IOMUX31_IRQn 96 /**< IOMUX31 interrupt */ +#define IOMUX30_IRQn 97 /**< IOMUX30 interrupt */ +#define IOMUX29_IRQn 98 /**< IOMUX29 interrupt */ +#define IOMUX28_IRQn 99 /**< IOMUX28 interrupt */ +#define IOMUX27_IRQn 100 /**< IOMUX27 interrupt */ +#define IOMUX26_IRQn 101 /**< IOMUX26 interrupt */ +#define IOMUX25_IRQn 102 /**< IOMUX25 interrupt */ +#define IOMUX24_IRQn 103 /**< IOMUX24 interrupt */ +#define IOMUX23_IRQn 104 /**< IOMUX23 interrupt */ +#define IOMUX22_IRQn 105 /**< IOMUX22 interrupt */ +#define IOMUX21_IRQn 106 /**< IOMUX21 interrupt */ +#define IOMUX20_IRQn 107 /**< IOMUX20 interrupt */ +#define IOMUX19_IRQn 108 /**< IOMUX19 interrupt */ +#define IOMUX18_IRQn 109 /**< IOMUX18 interrupt */ +#define IOMUX17_IRQn 110 /**< IOMUX17 interrupt */ +#define IOMUX16_IRQn 111 /**< IOMUX16 interrupt */ +#define IOMUX15_IRQn 112 /**< IOMUX15 interrupt */ +#define IOMUX14_IRQn 113 /**< IOMUX14 interrupt */ +#define IOMUX13_IRQn 114 /**< IOMUX13 interrupt */ +#define IOMUX12_IRQn 115 /**< IOMUX12 interrupt */ +#define IOMUX11_IRQn 116 /**< IOMUX11 interrupt */ +#define IOMUX10_IRQn 117 /**< IOMUX10 interrupt */ +#define IOMUX9_IRQn 118 /**< IOMUX9 interrupt */ +#define IOMUX8_IRQn 119 /**< IOMUX8 interrupt */ +#define IOMUX7_IRQn 120 /**< IOMUX7 interrupt */ +#define IOMUX6_IRQn 121 /**< IOMUX6 interrupt */ +#define IOMUX5_IRQn 122 /**< IOMUX5 interrupt */ +#define IOMUX4_IRQn 123 /**< IOMUX4 interrupt */ +#define IOMUX3_IRQn 124 /**< IOMUX3 interrupt */ +#define IOMUX2_IRQn 125 /**< IOMUX2 interrupt */ +#define IOMUX1_IRQn 126 /**< IOMUX1 interrupt */ +#define IOMUX0_IRQn 127 /**< IOMUX0 interrupt */ +#define NUM_NVIC_IRQn 128 /**< Number of NVIC interrupts */ + +typedef int IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers */ + + +/* ---------------------------------------------------------------------------- + -- Cortex-M Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex-M Core Configuration + * @{ + */ + +#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 0 /**< Vendor specific implementation of SysTickConfig is defined */ +#define __FPU_PRESENT 1 /**< Defines if an FPU is present or not */ + +#include "core_cm4.h" /* Core Peripheral Access Layer */ +#include "system_MX8QM.h" /* Device specific configuration file */ + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t LDRD (const __IO uint32_t *addr) +{ + union + { + uint32_t w32[2]; + uint64_t w64; + } llr; + + __ASM volatile ("ldrd %0, %1, %2" : "=r" (llr.w32[0]), "=r" (llr.w32[1]) : "Q" (*addr) ); + + return(llr.w64); +} + +/*! + * @} + */ /* end of group Cortex_Core_Configuration */ + +#endif /* MX8QM_H */ + +/* MX8QM.h, eof. */ diff --git a/platform/devices/MX8QM/MX8QM_features.h b/platform/devices/MX8QM/MX8QM_features.h new file mode 100755 index 0000000..3142674 --- /dev/null +++ b/platform/devices/MX8QM/MX8QM_features.h @@ -0,0 +1,460 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef MX8_FEATURES_H +#define MX8_FEATURES_H + +/* SOC module features */ + +/* @brief ACMP availability on the SoC. */ +#define FSL_FEATURE_SOC_ACMP_COUNT (0U) +/* @brief ADC16 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC16_COUNT (0U) +/* @brief ADC12 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC12_COUNT (0U) +/* @brief AFE availability on the SoC. */ +#define FSL_FEATURE_SOC_AFE_COUNT (0U) +/* @brief AIPS availability on the SoC. */ +#define FSL_FEATURE_SOC_AIPS_COUNT (0U) +/* @brief AOI availability on the SoC. */ +#define FSL_FEATURE_SOC_AOI_COUNT (0U) +/* @brief AXBS availability on the SoC. */ +#define FSL_FEATURE_SOC_AXBS_COUNT (0U) +/* @brief ASMC availability on the SoC. */ +#define FSL_FEATURE_SOC_ASMC_COUNT (0U) +/* @brief CADC availability on the SoC. */ +#define FSL_FEATURE_SOC_CADC_COUNT (0U) +/* @brief FLEXCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXCAN_COUNT (0U) +/* @brief MMCAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMCAU_COUNT (0U) +/* @brief CMP availability on the SoC. */ +#define FSL_FEATURE_SOC_CMP_COUNT (0U) +/* @brief CMT availability on the SoC. */ +#define FSL_FEATURE_SOC_CMT_COUNT (0U) +/* @brief CNC availability on the SoC. */ +#define FSL_FEATURE_SOC_CNC_COUNT (0U) +/* @brief CRC availability on the SoC. */ +#define FSL_FEATURE_SOC_CRC_COUNT (0U) +/* @brief DAC availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC_COUNT (0U) +/* @brief DAC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC32_COUNT (0U) +/* @brief DCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_DCDC_COUNT (0U) +/* @brief DDR availability on the SoC. */ +#define FSL_FEATURE_SOC_DDR_COUNT (2U) +/* @brief DMA availability on the SoC. */ +#define FSL_FEATURE_SOC_DMA_COUNT (0U) +/* @brief DMAMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_DMAMUX_COUNT (0U) +/* @brief DRY availability on the SoC. */ +#define FSL_FEATURE_SOC_DRY_COUNT (0U) +/* @brief DSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_DSPI_COUNT (0U) +/* @brief EDMA availability on the SoC. */ +#define FSL_FEATURE_SOC_EDMA_COUNT (5U) +/* @brief EMVSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_EMVSIM_COUNT (0U) +/* @brief ENC availability on the SoC. */ +#define FSL_FEATURE_SOC_ENC_COUNT (0U) +/* @brief ENET availability on the SoC. */ +#define FSL_FEATURE_SOC_ENET_COUNT (0U) +/* @brief EWM availability on the SoC. */ +#define FSL_FEATURE_SOC_EWM_COUNT (0U) +/* @brief FB availability on the SoC. */ +#define FSL_FEATURE_SOC_FB_COUNT (0U) +/* @brief FGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FGPIO_COUNT (1U) +/* @brief FLEXIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXIO_COUNT (0U) +/* @brief FMC availability on the SoC. */ +#define FSL_FEATURE_SOC_FMC_COUNT (0U) +/* @brief FSKDT availability on the SoC. */ +#define FSL_FEATURE_SOC_FSKDT_COUNT (0U) +/* @brief FTFA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFA_COUNT (0U) +/* @brief FTFE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFE_COUNT (0U) +/* @brief FTFL availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFL_COUNT (0U) +/* @brief FTM availability on the SoC. */ +#define FSL_FEATURE_SOC_FTM_COUNT (0U) +/* @brief FTMRA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRA_COUNT (0U) +/* @brief FTMRE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRE_COUNT (0U) +/* @brief FTMRH availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRH_COUNT (0U) +/* @brief GPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_GPIO_COUNT (3U) +/* @brief IGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_IGPIO_COUNT (8U) +/* @brief HSADC availability on the SoC. */ +#define FSL_FEATURE_SOC_HSADC_COUNT (0U) +/* @brief I2C availability on the SoC. */ +#define FSL_FEATURE_SOC_I2C_COUNT (0U) +/* @brief I2S availability on the SoC. */ +#define FSL_FEATURE_SOC_I2S_COUNT (0U) +/* @brief ICS availability on the SoC. */ +#define FSL_FEATURE_SOC_ICS_COUNT (0U) +/* @brief IRQ availability on the SoC. */ +#define FSL_FEATURE_SOC_IRQ_COUNT (0U) +/* @brief INTMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_INTMUX_COUNT (0U) +/* @brief KBI availability on the SoC. */ +#define FSL_FEATURE_SOC_KBI_COUNT (0U) +/* @brief SLCD availability on the SoC. */ +#define FSL_FEATURE_SOC_SLCD_COUNT (0U) +/* @brief LCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_LCDC_COUNT (0U) +/* @brief LDO availability on the SoC. */ +#define FSL_FEATURE_SOC_LDO_COUNT (0U) +/* @brief LLWU availability on the SoC. */ +#define FSL_FEATURE_SOC_LLWU_COUNT (0U) +/* @brief LMEM availability on the SoC. */ +#define FSL_FEATURE_SOC_LMEM_COUNT (1U) +/* @brief LPSCI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSCI_COUNT (0U) +/* @brief LPTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTMR_COUNT (0U) +/* @brief LPTPM availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTPM_COUNT (0U) +/* @brief LPUART availability on the SoC. */ +#define FSL_FEATURE_SOC_LPUART_COUNT (8U) +/* @brief LTC availability on the SoC. */ +#define FSL_FEATURE_SOC_LTC_COUNT (0U) +/* @brief LPI2C availability on the SoC. */ +#define FSL_FEATURE_SOC_LPI2C_COUNT (20U) +/* @brief LPSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSPI_COUNT (0U) +/* @brief LPIT availability on the SoC. */ +#define FSL_FEATURE_SOC_LPIT_COUNT (1U) +/* @brief MC availability on the SoC. */ +#define FSL_FEATURE_SOC_MC_COUNT (0U) +/* @brief MCG availability on the SoC. */ +#define FSL_FEATURE_SOC_MCG_COUNT (0U) +/* @brief MCGLITE availability on the SoC. */ +#define FSL_FEATURE_SOC_MCGLITE_COUNT (0U) +/* @brief MCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MCM_COUNT (0U) +/* @brief MMAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMAU_COUNT (0U) +/* @brief MMDVSQ availability on the SoC. */ +#define FSL_FEATURE_SOC_MMDVSQ_COUNT (0U) +/* @brief MPU availability on the SoC. */ +#define FSL_FEATURE_SOC_MPU_COUNT (0U) +/* @brief MSCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCAN_COUNT (0U) +/* @brief MSCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCM_COUNT (0U) +/* @brief MTB availability on the SoC. */ +#define FSL_FEATURE_SOC_MTB_COUNT (0U) +/* @brief MTBDWT availability on the SoC. */ +#define FSL_FEATURE_SOC_MTBDWT_COUNT (0U) +/* @brief MU availability on the SoC. */ +#define FSL_FEATURE_SOC_MU_COUNT (16U) +/* @brief NFC availability on the SoC. */ +#define FSL_FEATURE_SOC_NFC_COUNT (0U) +/* @brief OPAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_OPAMP_COUNT (0U) +/* @brief OSC availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC_COUNT (0U) +/* @brief OSC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC32_COUNT (0U) +/* @brief OTFAD availability on the SoC. */ +#define FSL_FEATURE_SOC_OTFAD_COUNT (0U) +/* @brief PDB availability on the SoC. */ +#define FSL_FEATURE_SOC_PDB_COUNT (0U) +/* @brief PGA availability on the SoC. */ +#define FSL_FEATURE_SOC_PGA_COUNT (0U) +/* @brief PIT availability on the SoC. */ +#define FSL_FEATURE_SOC_PIT_COUNT (0U) +/* @brief PMC availability on the SoC. */ +#define FSL_FEATURE_SOC_PMC_COUNT (0U) +/* @brief PORT availability on the SoC. */ +#define FSL_FEATURE_SOC_PORT_COUNT (0U) +/* @brief PWM availability on the SoC. */ +#define FSL_FEATURE_SOC_PWM_COUNT (0U) +/* @brief PWT availability on the SoC. */ +#define FSL_FEATURE_SOC_PWT_COUNT (0U) +/* @brief PCC availability on the SoC. */ +#define FSL_FEATURE_SOC_PCC_COUNT (0U) +/* @brief QuadSPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_QuadSPIO_COUNT (0U) +/* @brief RCM availability on the SoC. */ +#define FSL_FEATURE_SOC_RCM_COUNT (0U) +/* @brief RFSYS availability on the SoC. */ +#define FSL_FEATURE_SOC_RFSYS_COUNT (0U) +/* @brief RFVBAT availability on the SoC. */ +#define FSL_FEATURE_SOC_RFVBAT_COUNT (0U) +/* @brief RNG availability on the SoC. */ +#define FSL_FEATURE_SOC_RNG_COUNT (0U) +/* @brief RNGB availability on the SoC. */ +#define FSL_FEATURE_SOC_RNGB_COUNT (0U) +/* @brief ROM availability on the SoC. */ +#define FSL_FEATURE_SOC_ROM_COUNT (0U) +/* @brief RSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_RSIM_COUNT (0U) +/* @brief RTC availability on the SoC. */ +#define FSL_FEATURE_SOC_RTC_COUNT (0U) +/* @brief SCI availability on the SoC. */ +#define FSL_FEATURE_SOC_SCI_COUNT (0U) +/* @brief SDHC availability on the SoC. */ +#define FSL_FEATURE_SOC_SDHC_COUNT (0U) +/* @brief SDRAM availability on the SoC. */ +#define FSL_FEATURE_SOC_SDRAM_COUNT (0U) +/* @brief SIM availability on the SoC. */ +#define FSL_FEATURE_SOC_SIM_COUNT (0U) +/* @brief SMC availability on the SoC. */ +#define FSL_FEATURE_SOC_SMC_COUNT (0U) +/* @brief SNVS availability on the SoC. */ +#define FSL_FEATURE_SOC_SNVS_COUNT (1U) +/* @brief SPI availability on the SoC. */ +#define FSL_FEATURE_SOC_SPI_COUNT (0U) +/* @brief SCG availability on the SoC. */ +#define FSL_FEATURE_SOC_SCG_COUNT (0U) +/* @brief SEMA42 availability on the SoC. */ +#define FSL_FEATURE_SOC_SEMA42_COUNT (0U) +/* @brief STC availability on the SoC. */ +#define FSL_FEATURE_SOC_STC_COUNT (16U) +/* @brief TMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TMR_COUNT (0U) +/* @brief TPM availability on the SoC. */ +#define FSL_FEATURE_SOC_TPM_COUNT (0U) +/* @brief TRIAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_TRIAMP_COUNT (0U) +/* @brief TRNG availability on the SoC. */ +#define FSL_FEATURE_SOC_TRNG_COUNT (0U) +/* @brief TSI availability on the SoC. */ +#define FSL_FEATURE_SOC_TSI_COUNT (0U) +/* @brief TRGMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_TRGMUX_COUNT (0U) +/* @brief TSTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TSTMR_COUNT (0U) +/* @brief UART availability on the SoC. */ +#define FSL_FEATURE_SOC_UART_COUNT (0U) +/* @brief USB availability on the SoC. */ +#define FSL_FEATURE_SOC_USB_COUNT (0U) +/* @brief USBDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBDCD_COUNT (0U) +/* @brief USBHSDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBHSDCD_COUNT (0U) +/* @brief USBPHY availability on the SoC. */ +#define FSL_FEATURE_SOC_USBPHY_COUNT (0U) +/* @brief VREF availability on the SoC. */ +#define FSL_FEATURE_SOC_VREF_COUNT (0U) +/* @brief WDOG availability on the SoC. */ +#define FSL_FEATURE_SOC_WDOG_COUNT (3U) +/* @brief XBAR availability on the SoC. */ +#define FSL_FEATURE_SOC_XBAR_COUNT (0U) +/* @brief XCVR availability on the SoC. */ +#define FSL_FEATURE_SOC_XCVR_COUNT (0U) +/* @brief XRDC availability on the SoC. */ +#define FSL_FEATURE_SOC_XRDC_COUNT (0U) +/* @brief ZLL availability on the SoC. */ +#define FSL_FEATURE_SOC_ZLL_COUNT (0U) + +/* LMEM module features */ + +/* @brief Has process identifier support. */ +#define FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE (1U) + +/* LPUART module features */ + +/* @brief Has receive FIFO overflow detection (bit field CFIFO[RXOFE]). */ +#define FSL_FEATURE_LPUART_HAS_IRQ_EXTENDED_FUNCTIONS (0U) +/* @brief Has low power features (can be enabled in wait mode via register bit C1[DOZEEN] or CTRL[DOZEEN] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_LOW_POWER_UART_SUPPORT (1U) +/* @brief Has extended data register ED (or extra flags in the DATA register if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_HAS_FIFO (1U) +/* @brief Has 32-bit register MODIR */ +#define FSL_FEATURE_LPUART_HAS_MODIR (1U) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT (0U) +/* @brief Infrared (modulation) is supported. */ +#define FSL_FEATURE_LPUART_HAS_IR_SUPPORT (0U) +/* @brief 2 bits long stop bit is available. */ +#define FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT (1U) +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT (1U) +/* @brief Baud rate fine adjustment is available. */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_FINE_ADJUST_SUPPORT (0U) +/* @brief Baud rate oversampling is available (has bit fields C4[OSR], C5[BOTHEDGE], C5[RESYNCDIS] or BAUD[OSR], BAUD[BOTHEDGE], BAUD[RESYNCDIS] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (0U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_RX_RESYNC_SUPPORT (1U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (0U) +/* @brief Peripheral type. */ +#define FSL_FEATURE_LPUART_IS_SCI (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_FIFO_SIZEn(x) \ + (((x) == LPUART_SC) ? (32) : \ + (((x) == LPUART_MCU_0) ? (32) : \ + (((x) == LPUART_MCU_1) ? (32) : \ + (((x) == LPUART_0) ? (64) : \ + (((x) == LPUART_1) ? (64) : \ + (((x) == LPUART_2) ? (64) : \ + (((x) == LPUART_3) ? (64) : \ + (((x) == LPUART_4) ? (64) : (-1))))))))) + +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_NO_PARITY (10U) +/* @brief Maximal data width with parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_PARITY (9U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING (1U) +/* @brief Has transmitter/receiver DMA enable bits C5[TDMAE]/C5[RDMAE] (or BAUD[TDMAE]/BAUD[RDMAE] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_DMA_ENABLE (0U) +/* @brief Has transmitter/receiver DMA select bits C4[TDMAS]/C4[RDMAS], resp. C5[TDMAS]/C5[RDMAS] if IS_SCI = 0. */ +#define FSL_FEATURE_LPUART_HAS_DMA_SELECT (0U) +/* @brief Data character bit order selection is supported (bit field S2[MSBF] or STAT[MSBF] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BIT_ORDER_SELECT (1U) +/* @brief Has smart card (ISO7816 protocol) support and no improved smart card support. */ +#define FSL_FEATURE_LPUART_HAS_SMART_CARD_SUPPORT (0U) +/* @brief Has improved smart card (ISO7816 protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_IMPROVED_SMART_CARD_SUPPORT (0U) +/* @brief Has local operation network (CEA709.1-B protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_LOCAL_OPERATION_NETWORK_SUPPORT (0U) +/* @brief Has 32-bit registers (BAUD, STAT, CTRL, DATA, MATCH, MODIR) instead of 8-bit (BDH, BDL, C1, S1, D, etc.). */ +#define FSL_FEATURE_LPUART_HAS_32BIT_REGISTERS (1U) +/* @brief Lin break detect available (has bit BDH[LBKDIE]). */ +#define FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT (0U) +/* @brief UART stops in Wait mode available (has bit C1[UARTSWAI]). */ +#define FSL_FEATURE_LPUART_HAS_WAIT_MODE_OPERATION (0U) +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPUART_HAS_SEPARATE_DMA_RX_TX_REQn(x) \ + ((x) == 0 ? (0) : (-1)) +/* @brief Has LPAURT_PARAM. */ +#define FSL_FEATURE_LPUART_HAS_PARAM (1U) +/* @brief Has LPUART_VERID. */ +#define FSL_FEATURE_LPUART_HAS_VERID (1U) +/* @brief Has LPUART_GLOBAL. */ +#define FSL_FEATURE_LPUART_HAS_GLOBAL (1U) +/* @brief Has LPUART_PINCFG. */ +#define FSL_FEATURE_LPUART_HAS_PINCFG (1U) +#define FSL_FEATURE_LPUART0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART6_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART7_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART8_HAS_NO_IRQ (1U) + +/* MU module features */ + +/* @brief MU side for current core */ +#define FSL_FEATURE_MU_SIDE_A (0U) +#define FSL_FEATURE_MU_NO_RSTH (1U) +#define FSL_FEATURE_MU_NO_HR (1U) + +/* WDOG module features */ + +/* @brief Watchdog is available. */ +#define FSL_FEATURE_WDOG_HAS_WATCHDOG (1U) +/* @brief WDOG_CNT can be 32-bit written. */ +#define FSL_FEATURE_WDOG_HAS_32BIT_ACCESS (1U) + +/* LPI2C module features */ + +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPI2C_FIFO_SIZEn(x) (4U) + +#define FSL_FEATURE_I2C_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C6_HAS_NO_IRQ (1U) + +/* PORT module features */ + +#define FSL_FEATURE_PORT_HAS_NO_INTERRUPT (1U) + +/* GPIO module features */ + +#define FSL_FEATURE_GPIO_HAS_NO_INTERRUPT (1U) + +/* PAD module features */ + +/* @brief Pads are for 28LPP. */ +#define FSL_FEATURE_PAD_HAS_28LPP (0U) +/* @brief Pads are for 28FDSOI. */ +#define FSL_FEATURE_PAD_HAS_28FDSOI (1U) + +/* SECO module features */ + +/* @brief SECO protocol version */ +#define FSL_FEATURE_SECO_VER (1U) + +/* OTP module features */ + +#define FSL_FEATURE_OTP_8K_OFS_START (16U) +#define FSL_FEATURE_OTP_8K_OFS_END (271U) +#define FSL_FEATURE_OTP_16K_OFS_START (288U) +#define FSL_FEATURE_OTP_16K_OFS_END (799U) + +#define FSL_FEATURE_DPLL_VER (18U) +#define FSL_FEATURE_AV_PLL_ENABLE_ALT (1U) + +#define FSL_FEATURE_PCIE_DPLL_SS (0U) + +/* CSR module features */ +#define FSL_FEATURE_CSR_HAS_CSR (0U) +#define FSL_FEATURE_CSR_HAS_CSR2 (1U) +#define FSL_FEATURE_CSR_HAS_CSR3 (1U) +#define FSL_FEATURE_CSR_HAS_LPCG (0U) + +/* DSC config */ +#define FSL_FEATURE_DSC_SSSLICE_CNT (8U) +#define FSL_FEATURE_DSC_SLSLICE_CNT (17U) +#define FSL_FEATURE_DSC_CSLICE_CNT (1U) +#define FSL_FEATURE_DSC_GPR_CTRL_CNT (3U) + +#endif /* MX8_FEATURES_H_ */ + diff --git a/platform/devices/MX8QM/MX8QM_fuse_map.h b/platform/devices/MX8QM/MX8QM_fuse_map.h new file mode 100755 index 0000000..08284b8 --- /dev/null +++ b/platform/devices/MX8QM/MX8QM_fuse_map.h @@ -0,0 +1,307 @@ +/* +** ################################################################### +** Processors: MX8QM +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8QM +** +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_FUSES_H +#define HW_FUSES_H + +/******************************************************************************* + * Macros + ******************************************************************************/ + +#if !defined(NO_DEVICE_ACCESS) + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + ((((uint32_t)(OTP->FUSE[(_REG)].RW)) >> (SHFT)) & (MSK)) +#else + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + (((temp_fuses[(_REG)]) >> (SHFT)) & (MSK)) +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define OTP_CAAM_DIS OTP_GET_FUSE_STATE(0x003U, 0U, 0x00000001U) +#define OTP_IEE_DIS OTP_GET_FUSE_STATE(0x003U, 1U, 0x00000001U) +#define OTP_DTCP_DIS OTP_GET_FUSE_STATE(0x003U, 2U, 0x00000001U) +#define OTP_HDCP_DIS OTP_GET_FUSE_STATE(0x003U, 3U, 0x00000001U) +#define OTP_MMCAU_DIS OTP_GET_FUSE_STATE(0x003U, 4U, 0x00000001U) +#define OTP_ARM_CRYPT_EXT OTP_GET_FUSE_STATE(0x003U, 5U, 0x00000001U) +#define OTP_SNVS_DIS OTP_GET_FUSE_STATE(0x003U, 10U, 0x00000001U) +#define OTP_SECO_CLOSED_83 OTP_GET_FUSE_STATE(0x003U, 12U, 0x00000001U) +#define OTP_SECO_SECURED_83 OTP_GET_FUSE_STATE(0x003U, 13U, 0x00000001U) +#define OTP_ATTEST_DIS OTP_GET_FUSE_STATE(0x003U, 14U, 0x00000001U) +#define OTP_PUF_ENB OTP_GET_FUSE_STATE(0x003U, 15U, 0x00000001U) +#define OTP_FUSE_LIFE_CYCLE OTP_GET_FUSE_STATE(0x004U, 0U, 0x000003FFU) +#define OTP_SDP_DIS OTP_GET_FUSE_STATE(0x004U, 10U, 0x00000001U) +#define OTP_SDP_W_ONLY OTP_GET_FUSE_STATE(0x004U, 11U, 0x00000001U) +#define OTP_SREV_XOR OTP_GET_FUSE_STATE(0x004U, 12U, 0x00000007U) +#define OTP_SREV_ROM OTP_GET_FUSE_STATE(0x004U, 15U, 0x00000001U) +#define OTP_SJC_DIS OTP_GET_FUSE_STATE(0x005U, 0U, 0x00000001U) +#define OTP_JTAG_SEC_MODE OTP_GET_FUSE_STATE(0x005U, 1U, 0x00000003U) +#define OTP_TZ_DBG_DIS OTP_GET_FUSE_STATE(0x005U, 3U, 0x00000001U) +#define OTP_OEM_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 5U, 0x00000003U) +#define OTP_SCU_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 7U, 0x00000003U) +#define OTP_SECO_GLITCH_DET OTP_GET_FUSE_STATE(0x005U, 9U, 0x00000001U) +#define OTP_OTP_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 10U, 0x00000001U) +#define OTP_TZ_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 11U, 0x00000001U) +#define OTP_ARRAY_IS_PROG OTP_GET_FUSE_STATE(0x005U, 15U, 0x00000001U) +#define OTP_AP_0_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x0000000FU) +#define OTP_AP_0_0_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x00000001U) +#define OTP_AP_0_1_DIS OTP_GET_FUSE_STATE(0x006U, 1U, 0x00000001U) +#define OTP_AP_0_2_DIS OTP_GET_FUSE_STATE(0x006U, 2U, 0x00000001U) +#define OTP_AP_0_3_DIS OTP_GET_FUSE_STATE(0x006U, 3U, 0x00000001U) +#define OTP_AP_1_DIS OTP_GET_FUSE_STATE(0x006U, 4U, 0x00000003U) +#define OTP_AP_1_0_DIS OTP_GET_FUSE_STATE(0x006U, 4U, 0x00000001U) +#define OTP_AP_1_1_DIS OTP_GET_FUSE_STATE(0x006U, 5U, 0x00000001U) +#define OTP_AP_0_MAX_FREQ OTP_GET_FUSE_STATE(0x006U, 8U, 0x0000000FU) +#define OTP_AP_1_MAX_FREQ OTP_GET_FUSE_STATE(0x006U, 12U, 0x0000000FU) +#define OTP_GPU_0_DIS OTP_GET_FUSE_STATE(0x007U, 0U, 0x00000001U) +#define OTP_GPU_1_DIS OTP_GET_FUSE_STATE(0x007U, 1U, 0x00000001U) +#define OTP_GPU_MAX_FREQ OTP_GET_FUSE_STATE(0x007U, 4U, 0x0000000FU) +#define OTP_DC_0_DIS OTP_GET_FUSE_STATE(0x007U, 8U, 0x00000003U) +#define OTP_DC_1_DIS OTP_GET_FUSE_STATE(0x007U, 10U, 0x00000003U) +#define OTP_VPU_DIS OTP_GET_FUSE_STATE(0x007U, 12U, 0x0000000FU) +#define OTP_VPU_ENC0_DIS OTP_GET_FUSE_STATE(0x007U, 12U, 0x00000001U) +#define OTP_VPU_ENC1_DIS OTP_GET_FUSE_STATE(0x007U, 13U, 0x00000001U) +#define OTP_VPU_DEC_DIS OTP_GET_FUSE_STATE(0x007U, 14U, 0x00000003U) +#define OTP_DSP_DIS OTP_GET_FUSE_STATE(0x008U, 0U, 0x00000001U) +#define OTP_MCU_0_DIS OTP_GET_FUSE_STATE(0x008U, 1U, 0x00000001U) +#define OTP_MCU_1_DIS OTP_GET_FUSE_STATE(0x008U, 2U, 0x00000001U) +#define OTP_SATA_DIS OTP_GET_FUSE_STATE(0x008U, 4U, 0x00000001U) +#define OTP_PCIE_A_DIS OTP_GET_FUSE_STATE(0x008U, 5U, 0x00000001U) +#define OTP_PCIE_B_DIS OTP_GET_FUSE_STATE(0x008U, 6U, 0x00000001U) +#define OTP_USB2_1_DIS OTP_GET_FUSE_STATE(0x008U, 8U, 0x00000001U) +#define OTP_USB2_2_OTG_DIS OTP_GET_FUSE_STATE(0x008U, 9U, 0x00000001U) +#define OTP_USB_SS_DIS OTP_GET_FUSE_STATE(0x008U, 10U, 0x00000001U) +#define OTP_USB2_3_OTG_DIS OTP_GET_FUSE_STATE(0x008U, 11U, 0x00000001U) +#define OTP_ETH_0_DIS OTP_GET_FUSE_STATE(0x008U, 12U, 0x00000001U) +#define OTP_ETH_1_DIS OTP_GET_FUSE_STATE(0x008U, 13U, 0x00000001U) +#define OTP_HDMI_TX_DIS OTP_GET_FUSE_STATE(0x009U, 0U, 0x00000001U) +#define OTP_MIPI_0_DIS OTP_GET_FUSE_STATE(0x009U, 1U, 0x00000001U) +#define OTP_MIPI_1_DIS OTP_GET_FUSE_STATE(0x009U, 2U, 0x00000001U) +#define OTP_HDMI_RX_DIS OTP_GET_FUSE_STATE(0x009U, 4U, 0x00000001U) +#define OTP_CSI_0_DIS OTP_GET_FUSE_STATE(0x009U, 5U, 0x00000001U) +#define OTP_CSI_1_DIS OTP_GET_FUSE_STATE(0x009U, 6U, 0x00000001U) +#define OTP_CSI_2_DIS OTP_GET_FUSE_STATE(0x009U, 7U, 0x00000001U) +#define OTP_DRC_0_DIS OTP_GET_FUSE_STATE(0x009U, 8U, 0x0000000FU) +#define OTP_DRC_1_DIS OTP_GET_FUSE_STATE(0x009U, 12U, 0x0000000FU) +#define OTP_CAN_DIS OTP_GET_FUSE_STATE(0x00AU, 0U, 0x00000001U) +#define OTP_FIPS_MODE OTP_GET_FUSE_STATE(0x00AU, 3U, 0x00000001U) +#define OTP_FIPS_MODE_DIS OTP_GET_FUSE_STATE(0x00AU, 4U, 0x00000001U) + +///////////////////////////////////////////////////////////////////////////// +#define OTP_ADM_SECURITY_MSKL OTP_GET_FUSE_STATE(0x00CU, 0U, 0x0000FFFFU) +#define OTP_ADM_SECURITY_MSKU OTP_GET_FUSE_STATE(0x00DU, 0U, 0x0000FFFFU) + +#define OTP_FUSES_VALID OTP_GET_FUSE_STATE(0x00EU, 0U, 0x00000007U) + +#define OTP_ROM_CONTROL OTP_GET_FUSE_STATE(0x00EU, 8U, 0x000000FFU) + +#define OTP_READ_LOCKS OTP_GET_FUSE_STATE(0x00FU, 0U, 0x000080FFU) + +#define OTP_UNIQUE_ID_L OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_UNIQUE_ID_H OTP_GET_FUSE_STATE(0x011U, 0U, 0xFFFFFFFFU) + +#define OTP_LOT_NUM_ENCL OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_LOT_NUM_ENCU OTP_GET_FUSE_STATE(0x011U, 0U, 0xFFFFFFFFU) + +#define OTP_BOOT_MODE_FUSES OTP_GET_FUSE_STATE(0x012U, 0U, 0xFFFFFFFFU) +#define OTP_USDHC_OPTIONS OTP_GET_FUSE_STATE(0x013U, 0U, 0xFFFFFFFFU) +///////////////////////////////////////////////////////////////redo + +#define OTP_PROG_FUSE_VERSION_AP_1_OPP OTP_GET_FUSE_STATE(0x01bU, 0U, 0x00000001U) +#define OTP_PROG_FUSE_VERSION_SQRUP OTP_GET_FUSE_STATE(0x01bU, 1U, 0x00000001U) +#define OTP_PROG_FUSE_VERSION_1_7V_CAL OTP_GET_FUSE_STATE(0x01bU, 2U, 0x00000001U) +#define OTP_DPLL_CALIB_V2 OTP_GET_FUSE_STATE(0x01bU, 3U, 0x00000001U) +#define OTP_PROG_FUSE_TRIM_LDO OTP_GET_FUSE_STATE(0x01bU, 4U, 0x00000001U) +#define OTP_PROG_FUSE_GPU_NM_625 OTP_GET_FUSE_STATE(0x01bU, 7U, 0x00000001U) + +#define OTP_OSC_CAP_TRM_32K OTP_GET_FUSE_STATE(0x01eU, 0U, 0x0000000FU) +#define OTP_TMP_MON_TRM_LO OTP_GET_FUSE_STATE(0x01eU, 4U, 0x0000003FU) +#define OTP_TMP_MON_TRM_HI OTP_GET_FUSE_STATE(0x01eU, 10U, 0x0000003FU) +#define OTP_TMP_MON_TRM_RES OTP_GET_FUSE_STATE(0x01eU, 16U, 0x0000000FU) +#define OTP_TMP_MON_TRM_SHLF_LO OTP_GET_FUSE_STATE(0x01eU, 20U, 0x0000003FU) +#define OTP_TMP_MON_TRM_SHLF_HI OTP_GET_FUSE_STATE(0x01eU, 26U, 0x0000003FU) +#define OTP_SNVS_BNDGAP_TRM OTP_GET_FUSE_STATE(0x01fU, 0U, 0x0000001FU) +#define OTP_32K_IRC_TRM OTP_GET_FUSE_STATE(0x01fU, 5U, 0x0000001FU) +#define OTP_CLK_MON_TRM_LO OTP_GET_FUSE_STATE(0x01fU, 10U, 0x0000000FU) +#define OTP_CLK_MON_TRM_HI OTP_GET_FUSE_STATE(0x01fU, 14U, 0x0000000FU) +#define OTP_V_MON_TRM_LO OTP_GET_FUSE_STATE(0x01fU, 18U, 0x0000000FU) +#define OTP_V_MON_TRM_HI OTP_GET_FUSE_STATE(0x01fU, 22U, 0x0000000FU) +#define OTP_V_MON_TAMP_DIS OTP_GET_FUSE_STATE(0x01fU, 26U, 0x00000001U) +#define OTP_CLK_MON_DIS OTP_GET_FUSE_STATE(0x01fU, 27U, 0x00000001U) +#define OTP_TMP_MON_DIS OTP_GET_FUSE_STATE(0x01fU, 28U, 0x00000001U) +#define OTP_SNVS_CORE_V_TRM OTP_GET_FUSE_STATE(0x01fU, 30U, 0x00000002U) + +#define OTP_REFGEN_SCU OTP_GET_FUSE_STATE(0x064U, 0U, 0x000000FFU) +#define OTP_REFGEN_AP_0 OTP_GET_FUSE_STATE(0x064U, 8U, 0x000000FFU) +#define OTP_REFGEN_AP_1 OTP_GET_FUSE_STATE(0x064U, 16U, 0x000000FFU) +#define OTP_REFGEN_DRC0 OTP_GET_FUSE_STATE(0x064U, 24U, 0x000000FFU) +#define OTP_REFGEN_DRC1 OTP_GET_FUSE_STATE(0x065U, 0U, 0x000000FFU) +#define OTP_REFGEN_GPU0 OTP_GET_FUSE_STATE(0x065U, 8U, 0x000000FFU) +#define OTP_REFGEN_GPU1 OTP_GET_FUSE_STATE(0x065U, 16U, 0x000000FFU) +#define OTP_REFGEN_DMA OTP_GET_FUSE_STATE(0x065U, 24U, 0x000000FFU) +#define OTP_REFGEN_DI_CNCT OTP_GET_FUSE_STATE(0x066U, 0U, 0x000000FFU) +#define OTP_REFGEN_DI_HDMI OTP_GET_FUSE_STATE(0x066U, 8U, 0x000000FFU) +#define OTP_REFGEN_RX_HDMI OTP_GET_FUSE_STATE(0x066U, 16U, 0x000000FFU) +#define OTP_REFGEN_HSIO OTP_GET_FUSE_STATE(0x066U, 24U, 0x000000FFU) +#define OTP_REFGEN_VPU OTP_GET_FUSE_STATE(0x069U, 0U, 0x000000FFU) + +#define OTP_USB_PHY_TRM OTP_GET_FUSE_STATE(0x067U, 0U, 0x000FFFFFU) +#define OTP_DSI0_TRM OTP_GET_FUSE_STATE(0x067U, 20U, 0x00000003U) +#define OTP_DSI1_TRM OTP_GET_FUSE_STATE(0x067U, 22U, 0x00000003U) +#define OTP_CHARGE_PUMP OTP_GET_FUSE_STATE(0x067U, 27U, 0x0000001FU) +#define OTP_WLEVEL_BIAS_AP_0 OTP_GET_FUSE_STATE(0x068U, 0U, 0x000000FFU) +#define OTP_WLEVEL_BIAS_AP_1 OTP_GET_FUSE_STATE(0x068U, 8U, 0x000000FFU) +#define OTP_WLEVEL_BIAS_GPU0 OTP_GET_FUSE_STATE(0x068U, 16U, 0x000000FFU) +#define OTP_WLEVEL_BIAS_GPU1 OTP_GET_FUSE_STATE(0x068U, 24U, 0x000000FFU) +#define OTP_CSI0_TRM OTP_GET_FUSE_STATE(0x069U, 8U, 0x00000003U) +#define OTP_CSI1_TRM OTP_GET_FUSE_STATE(0x069U, 10U, 0x00000003U) +#define OTP_TMP_SENS_SCU OTP_GET_FUSE_STATE(0x069U, 12U, 0x000003FFU) +#define OTP_TMP_SENS_AP_0 OTP_GET_FUSE_STATE(0x069U, 22U, 0x000003FFU) +#define OTP_TMP_SENS_AP_1 OTP_GET_FUSE_STATE(0x06aU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_GPU0 OTP_GET_FUSE_STATE(0x06aU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_GPU1 OTP_GET_FUSE_STATE(0x06aU, 22U, 0x000003FFU) +#define OTP_TMP_SENS_DRC0 OTP_GET_FUSE_STATE(0x06bU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_DRC1 OTP_GET_FUSE_STATE(0x06bU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_VPU OTP_GET_FUSE_STATE(0x06bU, 22U, 0x000003FFU) + +#define OTP_BIAS_AP_0_OD_COLD OTP_GET_FUSE_STATE(0x06CU, 0U, 0x000000FFU) +#define OTP_BIAS_AP_1_OD_COLD OTP_GET_FUSE_STATE(0x06CU, 8U, 0x000000FFU) +#define OTP_BIAS_GPX0_OD_COLD OTP_GET_FUSE_STATE(0x06CU, 16U, 0x000000FFU) +#define OTP_BIAS_GPX1_OD_COLD OTP_GET_FUSE_STATE(0x06CU, 24U, 0x000000FFU) +#define OTP_BIAS_GPX0_NM_COLD OTP_GET_FUSE_STATE(0x06DU, 16U, 0x000000FFU) +#define OTP_BIAS_GPX1_NM_COLD OTP_GET_FUSE_STATE(0x06DU, 24U, 0x000000FFU) + +#define OTP_BIAS_AP_0_OD_HOT OTP_GET_FUSE_STATE(0x06EU, 0U, 0x000000FFU) +#define OTP_BIAS_AP_1_OD_HOT OTP_GET_FUSE_STATE(0x06EU, 8U, 0x000000FFU) +#define OTP_BIAS_GPX0_OD_HOT OTP_GET_FUSE_STATE(0x06EU, 16U, 0x000000FFU) +#define OTP_BIAS_GPX1_OD_HOT OTP_GET_FUSE_STATE(0x06EU, 24U, 0x000000FFU) +#define OTP_BIAS_GPX0_NM_HOT OTP_GET_FUSE_STATE(0x06FU, 16U, 0x000000FFU) +#define OTP_BIAS_GPX1_NM_HOT OTP_GET_FUSE_STATE(0x06FU, 24U, 0x000000FFU) + +#define OTP_ROM_PATCH 0x070U +#define OTP_ROM_PATCH_SIZE 62U +#define OTP_V2X_PATCH_SIZE 0U + +#define OTP_SINGLE_END_CLK OTP_GET_FUSE_STATE(0x0AEU, 4U, 0x00000001U) + +#define OTP_24MHZ_REGH_LV OTP_GET_FUSE_STATE(0x100U, 0U, 0x00000007U) +#define OTP_24MHZ_REGL_LV OTP_GET_FUSE_STATE(0x100U, 3U, 0x00000007U) +#define OTP_ROSC_FREQ_OFF OTP_GET_FUSE_STATE(0x100U, 8U, 0x00FFFFFFU) + +#define OTP_DPLL_TRM OTP_GET_FUSE_STATE(0x101U, 0U, 0xFFFFFFFFU) +#define OTP_DPLL_TRM_VALID OTP_GET_FUSE_STATE(0x101U, 0U, 0x00800000U) +#define OTP_t_SNVS_BNDGAP_TRM OTP_GET_FUSE_STATE(0x104U, 8U, 0x0000001FU) +#define OTP_t_32K_INT_TRM OTP_GET_FUSE_STATE(0x104U, 13U, 0x0000001FU) +#define OTP_t_TMP_SENS_SCU_0 OTP_GET_FUSE_STATE(0x104U, 20U, 0x000003FFU) +#define OTP_t_TMP_SENS_AP_0_1 OTP_GET_FUSE_STATE(0x105U, 6U, 0x000003FFU) +#define OTP_t_CHARGE_PUMP OTP_GET_FUSE_STATE(0x105U, 27U, 0x0000001FU) +#define OTP_t_OSC_CAP_TRIM_32K OTP_GET_FUSE_STATE(0x106U, 0U, 0x0000000FU) +#define OTP_t_TMP_MON_TRM_LO OTP_GET_FUSE_STATE(0x106U, 4U, 0x0000003FU) +#define OTP_t_TMP_MON_TRM_HI OTP_GET_FUSE_STATE(0x106U, 10U, 0x0000003FU) +#define OTP_t_TMP_MON_TRM_RES OTP_GET_FUSE_STATE(0x106U, 16U, 0x0000000FU) +#define OTP_t_TMP_MON_SHLF_LO OTP_GET_FUSE_STATE(0x106U, 20U, 0x0000003FU) +#define OTP_t_TMP_MON_SHLF_HI OTP_GET_FUSE_STATE(0x106U, 26U, 0x0000003FU) +#define OTP_t_CLK_MON_TRM_LO OTP_GET_FUSE_STATE(0x107U, 10U, 0x0000000FU) +#define OTP_t_CLK_MON_TRM_HI OTP_GET_FUSE_STATE(0x107U, 14U, 0x0000000FU) +#define OTP_t_V_MON_TRM_LO OTP_GET_FUSE_STATE(0x107U, 18U, 0x0000000FU) +#define OTP_t_V_MON_TRM_HI OTP_GET_FUSE_STATE(0x107U, 22U, 0x0000000FU) +#define OTP_t_SNVS_CORE_V_TRM OTP_GET_FUSE_STATE(0x107U, 30U, 0x0000000CU) + +#define OTP_24MHZ_DIFF_VALID OTP_GET_FUSE_STATE(0x102U, 31U, 0x00000001U) +#define OTP_24MHZ_DIFF_DRV0 OTP_GET_FUSE_STATE(0x102U, 0U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV1 OTP_GET_FUSE_STATE(0x102U, 4U, 0x00000003U) +#define OTP_24MHZ_DIFF_TERM_RES OTP_GET_FUSE_STATE(0x102U, 8U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV_IN OTP_GET_FUSE_STATE(0x102U, 10U, 0x00000003U) +#define OTP_24MHZ_DIFF_SQRUP OTP_GET_FUSE_STATE(0x102U, 12U, 0x00000003U) +#define OTP_SCU_REG_TRIM OTP_GET_FUSE_STATE(0x102U, 16U, 0x00000007U) +#define OTP_VPU_REG0_TRIM OTP_GET_FUSE_STATE(0x102U, 19U, 0x00000007U) +#define OTP_VPU_REG1_TRIM OTP_GET_FUSE_STATE(0x102U, 22U, 0x00000007U) + +#define OTP_CSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x069U, 8U, 0x00000003U) +#define OTP_CSI_1_RCAL_TRIM OTP_GET_FUSE_STATE(0x069U, 10U, 0x00000003U) +#define OTP_DSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 20U, 0x00000003U) +#define OTP_DSI_1_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 22U, 0x00000003U) + +#define OTP_DSI_0_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 0U, 0x00000007U) +#define OTP_DSI_0_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 3U, 0x00000007U) +#define OTP_DSI_0_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 6U, 0x00000007U) +#define OTP_DSI_0_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 9U, 0x00000007U) +#define OTP_DSI_0_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 12U, 0x00000007U) +#define OTP_DSI_1_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 16U, 0x00000007U) +#define OTP_DSI_1_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 19U, 0x00000007U) +#define OTP_DSI_1_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 22U, 0x00000007U) +#define OTP_DSI_1_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 25U, 0x00000007U) +#define OTP_DSI_1_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 28U, 0x00000007U) + +#define OTP_24MHZ_CL_TUNE_LV OTP_GET_FUSE_STATE(0x1F0U, 0U, 0x000000FFU) +#define OTP_24MHZ_CL_TUNE_VALID OTP_GET_FUSE_STATE(0x1F0U, 31U, 0x00000001U) + +#define OTP_TMP_SENS_SCU_OFS OTP_GET_FUSE_STATE(0x301U, 0U, 0x000000FFU) +#define OTP_TMP_SENS_AP_0_OFS OTP_GET_FUSE_STATE(0x301U, 8U, 0x000000FFU) +#define OTP_TMP_SENS_AP_1_OFS OTP_GET_FUSE_STATE(0x301U, 16U, 0x000000FFU) +#define OTP_TMP_SENS_GPU0_OFS OTP_GET_FUSE_STATE(0x301U, 24U, 0x000000FFU) +#define OTP_TMP_SENS_GPU1_OFS OTP_GET_FUSE_STATE(0x302U, 0U, 0x000000FFU) +#define OTP_TMP_SENS_DRC0_OFS OTP_GET_FUSE_STATE(0x302U, 8U, 0x000000FFU) +#define OTP_TMP_SENS_DRC1_OFS OTP_GET_FUSE_STATE(0x302U, 16U, 0x000000FFU) +#define OTP_TMP_SENS_VPU_OFS OTP_GET_FUSE_STATE(0x302U, 24U, 0x000000FFU) + +#define OTP_DPLL_TABLE_SELECT_VALID OTP_GET_FUSE_STATE(0x31DU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_SELECT_BITS OTP_GET_FUSE_STATE(0x31DU, 0U, 0x003FFFFFU) + +#define OTP_DPLL_TABLE_0_VALID OTP_GET_FUSE_STATE(0x31EU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_0_V6 OTP_GET_FUSE_STATE(0x31EU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V5 OTP_GET_FUSE_STATE(0x31EU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V4 OTP_GET_FUSE_STATE(0x31EU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V3 OTP_GET_FUSE_STATE(0x31EU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V2 OTP_GET_FUSE_STATE(0x31EU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V1 OTP_GET_FUSE_STATE(0x31EU, 0U, 0x0000003FU) + +#define OTP_DPLL_TABLE_1_VALID OTP_GET_FUSE_STATE(0x31FU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_1_V6 OTP_GET_FUSE_STATE(0x31FU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V5 OTP_GET_FUSE_STATE(0x31FU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V4 OTP_GET_FUSE_STATE(0x31FU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V3 OTP_GET_FUSE_STATE(0x31FU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V2 OTP_GET_FUSE_STATE(0x31FU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V1 OTP_GET_FUSE_STATE(0x31FU, 0U, 0x0000003FU) + +#endif /* HW_FUSES_H */ + diff --git a/platform/devices/MX8QM/MX8QM_otp.h b/platform/devices/MX8QM/MX8QM_otp.h new file mode 100755 index 0000000..e6c7398 --- /dev/null +++ b/platform/devices/MX8QM/MX8QM_otp.h @@ -0,0 +1,317 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_OTP_REGISTERS_H +#define HW_OTP_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- OTP Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Peripheral_Access_Layer OTP Peripheral Access Layer + * @{ + */ + +/** OTP - Register Layout Typedef */ +typedef struct +{ + __IO uint32_t RW; + __IO uint32_t SET; + __IO uint32_t CLR; + __IO uint32_t TOG; +} OTP_Reg; + +typedef struct +{ + OTP_Reg CTRL; + OTP_Reg PDN; + OTP_Reg DATA; + OTP_Reg READ_CTRL; + OTP_Reg READ_FUSE_DATA; + OTP_Reg SW_STICKY; + OTP_Reg SCS; + OTP_Reg CRC_ADDR; + OTP_Reg CRC_VALUE; + OTP_Reg STATUS[2]; + uint8_t RESERVED_0[32]; + __I uint32_t VERSION; + uint8_t RESERVED_1[1324]; + struct { + __I uint32_t RW; + __I uint32_t SET; + __I uint32_t CLR; + __I uint32_t TOG; + } LOCKED[26]; + uint8_t RESERVED_3[96]; + OTP_Reg FUSE[800]; +} OTP_Type; + +/* ---------------------------------------------------------------------------- + -- OTP Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Register_Masks OTP Register Masks + * @{ + */ + +/*! @name OTP Register */ +#define OTP_BIT0_MASK (0x00000001U) +#define OTP_BIT0_SHIFT (0U) +#define OTP_BIT0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT1_MASK (0x00000002U) +#define OTP_BIT1_SHIFT (1U) +#define OTP_BIT1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT2_MASK (0x00000004U) +#define OTP_BIT2_SHIFT (2U) +#define OTP_BIT2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT3_MASK (0x00000008U) +#define OTP_BIT3_SHIFT (3U) +#define OTP_BIT3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT4_MASK (0x00000010U) +#define OTP_BIT4_SHIFT (4U) +#define OTP_BIT4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT5_MASK (0x00000020U) +#define OTP_BIT5_SHIFT (5U) +#define OTP_BIT5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT6_MASK (0x00000040U) +#define OTP_BIT6_SHIFT (6U) +#define OTP_BIT6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT7_MASK (0x00000080U) +#define OTP_BIT7_SHIFT (7U) +#define OTP_BIT7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT8_MASK (0x00000100U) +#define OTP_BIT8_SHIFT (8U) +#define OTP_BIT8(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT9_MASK (0x00000200U) +#define OTP_BIT9_SHIFT (9U) +#define OTP_BIT9(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT10_MASK (0x00000400U) +#define OTP_BIT10_SHIFT (10U) +#define OTP_BIT10(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT11_MASK (0x00000800U) +#define OTP_BIT11_SHIFT (11U) +#define OTP_BIT11(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT12_MASK (0x00001000U) +#define OTP_BIT12_SHIFT (12U) +#define OTP_BIT12(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT13_MASK (0x00002000U) +#define OTP_BIT13_SHIFT (13U) +#define OTP_BIT13(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT14_MASK (0x00004000U) +#define OTP_BIT14_SHIFT (14U) +#define OTP_BIT14(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT15_MASK (0x00008000U) +#define OTP_BIT15_SHIFT (15U) +#define OTP_BIT15(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT16_MASK (0x00010000U) +#define OTP_BIT16_SHIFT (16U) +#define OTP_BIT16(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT17_MASK (0x00020000U) +#define OTP_BIT17_SHIFT (17U) +#define OTP_BIT17(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT18_MASK (0x00040000U) +#define OTP_BIT18_SHIFT (18U) +#define OTP_BIT18(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT19_MASK (0x00080000U) +#define OTP_BIT19_SHIFT (19U) +#define OTP_BIT19(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT20_MASK (0x00100000U) +#define OTP_BIT20_SHIFT (20U) +#define OTP_BIT20(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT21_ASK (0x00200000U) +#define OTP_BIT21_SHIFT (21U) +#define OTP_BIT21(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT22_MASK (0x00400000U) +#define OTP_BIT22_SHIFT (22U) +#define OTP_BIT22(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT23_MASK (0x00800000U) +#define OTP_BIT23_SHIFT (23U) +#define OTP_BIT23(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT24_MASK (0x01000000U) +#define OTP_BIT24_SHIFT (24U) +#define OTP_BIT24(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT25_MASK (0x02000000U) +#define OTP_BIT25_SHIFT (25U) +#define OTP_BIT25(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT26_MASK (0x04000000U) +#define OTP_BIT26_SHIFT (26U) +#define OTP_BIT26(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT27_MASK (0x08000000U) +#define OTP_BIT27_SHIFT (27U) +#define OTP_BIT27(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT28_MASK (0x10000000U) +#define OTP_BIT28_SHIFT (28U) +#define OTP_BIT28(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT29_MASK (0x20000000U) +#define OTP_BIT29_SHIFT (29U) +#define OTP_BIT29(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT30_MASK (0x40000000U) +#define OTP_BIT30_SHIFT (30U) +#define OTP_BIT30(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT31_MASK (0x80000000U) +#define OTP_BIT31_SHIFT (31U) +#define OTP_BIT31(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE0_MASK (0x0000000FU) +#define OTP_NIBBLE0_SHIFT (0U) +#define OTP_NIBBLE0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE1_MASK (0x000000F0U) +#define OTP_NIBBLE1_SHIFT (4U) +#define OTP_NIBBLE1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE2_MASK (0x00000F00U) +#define OTP_NIBBLE2_SHIFT (8U) +#define OTP_NIBBLE2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE3_MASK (0x0000F000U) +#define OTP_NIBBLE3_SHIFT (12U) +#define OTP_NIBBLE3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE4_MASK (0x000F0000U) +#define OTP_NIBBLE4_SHIFT (16U) +#define OTP_NIBBLE4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE5_MASK (0x00F00000U) +#define OTP_NIBBLE5_SHIFT (20U) +#define OTP_NIBBLE5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE6_MASK (0x0F000000U) +#define OTP_NIBBLE6_SHIFT (24U) +#define OTP_NIBBLE6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE7_MASK (0xF0000000U) +#define OTP_NIBBLE7_SHIFT (28U) +#define OTP_NIBBLE7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! + * @} + */ /* end of group OTP_Register_Masks */ + +/* OTP - Peripheral instance base addresses */ +/** Peripheral OTPA base pointer */ +#define OTP ((OTP_Type *)OTP_BASE) +/** Array initializer of OTP peripheral base addresses */ +#define OTP_BASE_ADDRS { OTP_BASE } +/** Array initializer of OTP peripheral base pointers */ +#define OTP_BASE_PTRS { OTP } + +/*! + * @} + */ /* end of group OTP_Peripheral_Access_Layer */ + +#endif /* HW_OTP_REGISTERS_H */ diff --git a/platform/devices/MX8QM/Makefile b/platform/devices/MX8QM/Makefile new file mode 100755 index 0000000..6391816 --- /dev/null +++ b/platform/devices/MX8QM/Makefile @@ -0,0 +1,14 @@ + +objs_mx8 := system_MX8QM.o handlers_MX8QM.o + +ifdef ROM +objs_mx8 += gcc/startup_rom_MX8QM.o +else +objs_mx8 += gcc/startup_MX8QM.o +endif + +OBJS += \ + $(foreach object,$(objs_mx8),$(OUT)/devices/MX8QM/$(object)) + +DIRS += $(OUT)/devices/MX8QM/gcc + diff --git a/platform/devices/MX8QM/fsl_clock.h b/platform/devices/MX8QM/fsl_clock.h new file mode 100755 index 0000000..ac7c7db --- /dev/null +++ b/platform/devices/MX8QM/fsl_clock.h @@ -0,0 +1,372 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_CLOCKS_H +#define HW_CLOCKS_H + +#include + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SC_XTAL32K_FREQ_HZ 32768U +#define SC_XTAL24M_FREQ_HZ 24000000U +#define SC_ROSC_FREQ_HZ 200000000U +#define SC_PLL0_STARTUP_FREQ_HZ 1056000000U + +#define SC_MSLICE_ROOT0_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (CAAM) +#define SC_MSLICE_ROOT3_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (MSI) + +#define SC_MSLICE_ROOT0_STARTUP_DIV 4U // 1056 MHz / 4 = 264 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_STARTUP_DIV 8U // 1056 MHz / 8 = 132 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_STARTUP_DIV 3U // 1056 MHz / 3 = 352 MHz (CAAM) +#define SC_MSLICE_ROOT3_STARTUP_DIV 5U // 1056 MHz / 5 = 211 MHz (MSI) + +#define SC_MCU_STARTUP_FREQ_HZ (SC_PLL0_STARTUP_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_STARTUP_FREQ_MHZ (SC_MCU_STARTUP_FREQ_HZ/1000000U) +#define SC_MCU_LPM_FREQ_HZ (SC_ROSC_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_LPM_FREQ_MHZ (SC_MCU_LPM_FREQ_HZ/1000000U) +#define SC_SYSTICK_NSEC_TO_TICKS(nsec) ((SC_MCU_STARTUP_FREQ_MHZ * (nsec)) / 1000U) + +#define SC_LPIT_ROOT_FREQ_HZ 24000000U +#define SC_LPIT_ROOT_DIV 3U +#define SC_LPIT_FREQ_HZ (SC_LPIT_ROOT_FREQ_HZ / SC_LPIT_ROOT_DIV) +#define SC_LPIT_MSEC_TO_TICKS(msec) (SC_LPIT_FREQ_HZ * (msec) / 1000U) + +#define SC_BG_SVC_MSEC 10U // Background service interval in msec +#define SC_WDOG_SVC_MSEC 5U // WDOG service interval in msec +#define SC_BG_TIMEOUT_MSEC 100U // Background timeout in msec +#define SC_BG_TIMEOUT (SC_BG_TIMEOUT_MSEC / SC_WDOG_SVC_MSEC) + +/*! @brief Clock ip name array for LPUART. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPUART_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPUART_CLOCKS {kCLOCK_LPUART_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/*! @brief Clock ip name array for LPI2C. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPI2C_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPI2C_CLOCKS {kCLOCK_LPI2C_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_IGPIO_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define GPIO_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_MU_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define MU_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid} + +/*! @brief Clock name used to get clock frequency. */ +typedef enum _clock_name +{ + kCLOCK_NmInvalid = 0U, +} clock_name_t; + +/*! + * @brief Clock source for peripherals that support various clock selections. + */ +typedef enum _clock_ip_src +{ + kCLOCK_SrcInvalid = 0U, +} clock_ip_src_t; + +/*! + * @brief Peripheral clock name difinition used for clock gate, clock source + * and clock divider setting. It is defined as the corresponding register address. + */ +typedef enum _clock_ip_name +{ + kCLOCK_IpInvalid = 0U, + kCLOCK_TCMC_SC = LPCG__SS_SCU__CM4__TCMC_HCLK__BASE, + kCLOCK_MMCAU_SC = LPCG__SS_SCU__CM4__MMCAU_HCLK__BASE, + kCLOCK_TPM_SC = LPCG__SS_SCU__TPM1__IPG_CLK__BASE, + kCLOCK_LPIT_SC = LPCG__SS_SCU__LPIT1__IPG_CLK__BASE, + kCLOCK_LPUART_SC = LPCG__SS_SCU__LPUART1__IPG_CLK__BASE, + kCLOCK_LPI2C_SC = LPCG__SS_SCU__LPI2C1__IPG_CLK__BASE +} clock_ip_name_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief Enable the clock for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + volatile uint32_t lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enable the hardware clock gating for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableHWCG(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + uint32_t lpcgVal = (1UL << LPCG__SS_SCU__PER_CLK__HWEN); + + *((volatile uint32_t *) (uint32_t) name) |= lpcgVal; + } +#endif +} + +/*! + * @brief Enable the clock for specific IP using exclusive access. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClockEx(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Use exclusive access to enable IPG and BAUD clocks */ + uint32_t volatile lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + do + { + lpcgVal |= __LDREXW((volatile uint32_t *) (uint32_t) name); + } while (__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)) != 0U); + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + } +#endif +} + +/*! + * @brief Disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Disable IPG and BAUD clocks */ + uint32_t lpcgVal = 0U; + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enter exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline uint32_t CLOCK_DisableClockExEnter(clock_ip_name_t name) +{ +#ifndef SIMU + /* Use exclusive access to disable IPG and BAUD clocks */ + uint32_t lpcgVal = ~((1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN)); + + if (name != kCLOCK_IpInvalid) + { + lpcgVal = __LDREXW((volatile uint32_t *) (uint32_t) name); + } + + return lpcgVal; +#else + return 0U; +#endif +} + +/*! + * @brief Leave exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClockExLeave(clock_ip_name_t name, + uint32_t lpcgVal) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + (void)__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)); + } +#endif +} + +/*! + * @brief Check whether the clock is already enabled and configured by + * any other core. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @return True if clock is already enabled, otherwise false. + */ +static inline bool CLOCK_IsEnabledByOtherCore(clock_ip_name_t name) +{ + return false; +} + +/*! + * @brief Set the clock source for specific IP module. + * + * Set the clock source for specific IP, not all modules need to set the + * clock source, should only use this function for the modules need source + * setting. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + */ +static inline void CLOCK_SetIpSrc(clock_ip_name_t name, clock_ip_src_t src) +{ +} + +/*! + * @brief Set the clock source and divider for specific IP module. + * + * Set the clock source and divider for specific IP, not all modules need to + * set the clock source and divider, should only use this function for the + * modules need source and divider setting. + * + * Divider output clock = Divider input clock x [(fracValue+1)/(divValue+1)]). + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + * @param divValue The divider value. + * @param fracValue The fraction multiply value. + */ +static inline void CLOCK_SetIpSrcDiv(clock_ip_name_t name, clock_ip_src_t src, uint8_t divValue, uint8_t fracValue) +{ +} + +/*! + * @brief Gets the clock frequency for a specific clock name. + * + * This function checks the current clock configurations and then calculates + * the clock frequency for a specific clock name defined in clock_name_t. + * + * @param clockName Clock names defined in clock_name_t + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetFreq(clock_name_t clockName); + +/*! + * @brief Gets the clock frequency for a specific IP module. + * + * This function gets the IP module clock frequency based on PCC registers. It is + * only used for the IP modules which could select clock source by PCC[PCS]. + * + * @param name Which peripheral to get, see \ref clock_ip_name_t. + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetIpFreq(clock_ip_name_t name); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +#endif /* HW_CLOCKS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8QM/handlers_MX8QM.h b/platform/devices/MX8QM/handlers_MX8QM.h new file mode 100755 index 0000000..71d22b5 --- /dev/null +++ b/platform/devices/MX8QM/handlers_MX8QM.h @@ -0,0 +1,122 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Header for handlers. + */ + +#ifndef HANDLERS_H +#define HANDLERS_H + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Functions */ + +void sc_handlers_init(void); +void DefaultISR(void); +void NMI_IRQHandler(uint32_t *sp); +void MCM_IRQHandler(uint32_t *sp); +void DebugWake_IRQHandler(void); +void SWI_IRQHandler(void); +void SWI_DQS2DQ_Handler(void); +void LPIT_SCU_IRQHandler(uint32_t *sp); +void DSC_SCU_IRQHandler(void); +void DSC_LSIO_IRQHandler(void); +void DSC_CM4_0_IRQHandler(void); +void DSC_CM4_1_IRQHandler(void); +void DSC_CA53_IRQHandler(void); +void DSC_CA72_IRQHandler(void); +void DSC_DRC_0_IRQHandler(void); +void DSC_DRC_1_IRQHandler(void); +void DSC_GPU_0_IRQHandler(void); +void DSC_GPU_1_IRQHandler(void); +void DSC_VPU_IRQHandler(void); +void DSC_DBLOG_IRQHandler(void); +void IOMUX_CommonHandler(uint8_t irq, uint8_t ring, uint8_t group); +void IOMUX0_IRQHandler(void); +void IOMUX1_IRQHandler(void); +void IOMUX2_IRQHandler(void); +void IOMUX3_IRQHandler(void); +void IOMUX4_IRQHandler(void); +void IOMUX5_IRQHandler(void); +void IOMUX6_IRQHandler(void); +void IOMUX7_IRQHandler(void); +void IOMUX8_IRQHandler(void); +void IOMUX9_IRQHandler(void); +void IOMUX10_IRQHandler(void); +void IOMUX11_IRQHandler(void); +void IOMUX12_IRQHandler(void); +void IOMUX13_IRQHandler(void); +void IOMUX14_IRQHandler(void); +void IOMUX15_IRQHandler(void); +void IOMUX16_IRQHandler(void); +void IOMUX17_IRQHandler(void); +void IOMUX18_IRQHandler(void); +void IOMUX19_IRQHandler(void); +void IOMUX20_IRQHandler(void); +void SYSCTR_CMP0_IRQHandler(void); +void SYSCTR_CMP1_IRQHandler(void); +void SNVS_Functional_IRQHandler(void); +void ss_earlywdog_handler_sc(void); +void ss_csreq_handler_a72(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_a53(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_mcu(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_dbgpwrup(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_hdmi_tx(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_hdmi_rx(uint32_t idx, uint32_t cpwrupreq); +#if HAS_SS_AP_0 +sc_bool_t ss_dbg_status_a53(sc_dsc_t dsc); +void ss_dbg_resume_a53(sc_dsc_t dsc); +#endif +#if HAS_SS_AP_1 +sc_bool_t ss_dbg_status_a72(sc_dsc_t dsc); +void ss_dbg_resume_a72(sc_dsc_t dsc); +#endif + +/* Global Variables */ + +extern uint32_t gLPITcnt; + +#endif /* #if !defined(HANDLERS_H) */ + diff --git a/platform/devices/MX8QM/linker/gcc/MX8QM_flash.ld b/platform/devices/MX8QM/linker/gcc/MX8QM_flash.ld new file mode 100755 index 0000000..ea63e74 --- /dev/null +++ b/platform/devices/MX8QM/linker/gcc/MX8QM_flash.ld @@ -0,0 +1,61 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Specify the memory areas */ +MEMORY +{ + m_rom (RX) : ORIGIN = 0x00000000, LENGTH = 0x00018000 +} + +/* Define output sections */ +SECTIONS +{ + /* Vector table and code to emulate ROM */ + .rom : + { + . = ALIGN(8); + KEEP(*(.rom)) + . = ALIGN(0x80); + } > m_rom +} + diff --git a/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.ld b/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.ld new file mode 100644 index 0000000..2b49196 --- /dev/null +++ b/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.ld @@ -0,0 +1,391 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* DO NOT EDIT - This file auto generated by overlay_ld.pl */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +OCRAM_ADDR = 0x100000; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_ocram (RX) : ORIGIN = 0x00100000, LENGTH = 0x00040000 + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002ED80 + m_ovl (RX) : ORIGIN = 0x2000F000, LENGTH = 0x00000FF0 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + OVERLAY : NOCROSSREFS + { + .test0 { */test_dsc.o(.text*) */test_dsc.o(.rodata*) } + .test1 { */test_pll.o(.text*) */test_pll.o(.rodata*) } + .test2 { */test_snvs.o(.text*) */test_snvs.o(.rodata*) } + .test3 { */test_pmic.o(.text*) */test_pmic.o(.rodata*) } + .test4 { */test_dblogic.o(.text*) */test_dblogic.o(.rodata*) } + .test5 { */test_db.o(.text*) */test_db.o(.rodata*) } + .test6 { */test_drc.o(.text*) */test_drc.o(.rodata*) } + .test7 { */test_lsio.o(.text*) */test_lsio.o(.rodata*) } + .test8 { */test_dma.o(.text*) */test_dma.o(.rodata*) } + .test9 { */test_conn.o(.text*) */test_conn.o(.rodata*) } + .test10 { */test_cci.o(.text*) */test_cci.o(.rodata*) } + .test11 { */test_ap.o(.text*) */test_ap.o(.rodata*) } + .test12 { */test_audio.o(.text*) */test_audio.o(.rodata*) } + .test13 { */test_dc.o(.text*) */test_dc.o(.rodata*) } + .test14 { */test_mipi.o(.text*) */test_mipi.o(.rodata*) } + .test15 { */test_lvds.o(.text*) */test_lvds.o(.rodata*) } + .test16 { */test_dc_lvds.o(.text*) */test_dc_lvds.o(.rodata*) } + .test17 { */test_hdmi.o(.text*) */test_hdmi.o(.rodata*) } + .test18 { */test_img.o(.text*) */test_img.o(.rodata*) } + .test19 { */test_csi.o(.text*) */test_csi.o(.rodata*) } + .test20 { */test_hdmi_rx.o(.text*) */test_hdmi_rx.o(.rodata*) } + .test21 { */test_gpu.o(.text*) */test_gpu.o(.rodata*) } + .test22 { */test_vpu.o(.text*) */test_vpu.o(.rodata*) } + .test23 { */test_hsio.o(.text*) */test_hsio.o(.rodata*) } + .test24 { */test_mcu.o(.text*) */test_mcu.o(.rodata*) } + .test25 { */test_lcdif.o(.text*) */test_lcdif.o(.rodata*) } + .test26 { */test_isi.o(.text*) */test_isi.o(.rodata*) } + .test27 { */test_pd.o(.text*) */test_pd.o(.rodata*) } + .test28 { */test_pm.o(.text*) */test_pm.o(.rodata*) } + .test29 { */test_timer.o(.text*) */test_timer.o(.rodata*) } + .test30 { */test_rm.o(.text*) */test_rm.o(.rodata*) } + .test31 { */test_misc.o(.text*) */test_misc.o(.rodata*) } + .test32 { */test_pad.o(.text*) */test_pad.o(.rodata*) } + .test33 { */test_rm2.o(.text*) */test_rm2.o(.rodata*) } + .test34 { */test_seco.o(.text*) */test_seco.o(.rodata*) } + .test35 { */test_hexdump.o(.text*) */test_hexdump.o(.rodata*) } + .test36 { */test_ddr.o(.text*) */test_ddr.o(.rodata*) } + .test37 { */test_audio_pll.o(.text*) */test_audio_pll.o(.rodata*) } + .test38 { */test_temp.o(.text*) */test_temp.o(.rodata*) } + .test39 { */test_uboot.o(.text*) */test_uboot.o(.rodata*) } + .test40 { */test_xrdc.o(.text*) */test_xrdc.o(.rodata*) } + .test41 { */test_dump.o(.text*) */test_dump.o(.rodata*) } + .test42 { */test_rpc.o(.text*) */test_rpc.o(.rodata*) } + } > m_ovl AT> m_ocram + + .test_ovly_table : + { + . = ALIGN(4); + __ovly_table = .; + LONG(0x34982933); LONG(0); LONG(42); + LONG(ABSOLUTE(ADDR(.test0))); LONG(SIZEOF(.test0)); LONG(LOADADDR(.test0)); + LONG(ABSOLUTE(ADDR(.test1))); LONG(SIZEOF(.test1)); LONG(LOADADDR(.test1)); + LONG(ABSOLUTE(ADDR(.test2))); LONG(SIZEOF(.test2)); LONG(LOADADDR(.test2)); + LONG(ABSOLUTE(ADDR(.test3))); LONG(SIZEOF(.test3)); LONG(LOADADDR(.test3)); + LONG(ABSOLUTE(ADDR(.test4))); LONG(SIZEOF(.test4)); LONG(LOADADDR(.test4)); + LONG(ABSOLUTE(ADDR(.test5))); LONG(SIZEOF(.test5)); LONG(LOADADDR(.test5)); + LONG(ABSOLUTE(ADDR(.test6))); LONG(SIZEOF(.test6)); LONG(LOADADDR(.test6)); + LONG(ABSOLUTE(ADDR(.test7))); LONG(SIZEOF(.test7)); LONG(LOADADDR(.test7)); + LONG(ABSOLUTE(ADDR(.test8))); LONG(SIZEOF(.test8)); LONG(LOADADDR(.test8)); + LONG(ABSOLUTE(ADDR(.test9))); LONG(SIZEOF(.test9)); LONG(LOADADDR(.test9)); + LONG(ABSOLUTE(ADDR(.test10))); LONG(SIZEOF(.test10)); LONG(LOADADDR(.test10)); + LONG(ABSOLUTE(ADDR(.test11))); LONG(SIZEOF(.test11)); LONG(LOADADDR(.test11)); + LONG(ABSOLUTE(ADDR(.test12))); LONG(SIZEOF(.test12)); LONG(LOADADDR(.test12)); + LONG(ABSOLUTE(ADDR(.test13))); LONG(SIZEOF(.test13)); LONG(LOADADDR(.test13)); + LONG(ABSOLUTE(ADDR(.test14))); LONG(SIZEOF(.test14)); LONG(LOADADDR(.test14)); + LONG(ABSOLUTE(ADDR(.test15))); LONG(SIZEOF(.test15)); LONG(LOADADDR(.test15)); + LONG(ABSOLUTE(ADDR(.test16))); LONG(SIZEOF(.test16)); LONG(LOADADDR(.test16)); + LONG(ABSOLUTE(ADDR(.test17))); LONG(SIZEOF(.test17)); LONG(LOADADDR(.test17)); + LONG(ABSOLUTE(ADDR(.test18))); LONG(SIZEOF(.test18)); LONG(LOADADDR(.test18)); + LONG(ABSOLUTE(ADDR(.test19))); LONG(SIZEOF(.test19)); LONG(LOADADDR(.test19)); + LONG(ABSOLUTE(ADDR(.test20))); LONG(SIZEOF(.test20)); LONG(LOADADDR(.test20)); + LONG(ABSOLUTE(ADDR(.test21))); LONG(SIZEOF(.test21)); LONG(LOADADDR(.test21)); + LONG(ABSOLUTE(ADDR(.test22))); LONG(SIZEOF(.test22)); LONG(LOADADDR(.test22)); + LONG(ABSOLUTE(ADDR(.test23))); LONG(SIZEOF(.test23)); LONG(LOADADDR(.test23)); + LONG(ABSOLUTE(ADDR(.test24))); LONG(SIZEOF(.test24)); LONG(LOADADDR(.test24)); + LONG(ABSOLUTE(ADDR(.test25))); LONG(SIZEOF(.test25)); LONG(LOADADDR(.test25)); + LONG(ABSOLUTE(ADDR(.test26))); LONG(SIZEOF(.test26)); LONG(LOADADDR(.test26)); + LONG(ABSOLUTE(ADDR(.test27))); LONG(SIZEOF(.test27)); LONG(LOADADDR(.test27)); + LONG(ABSOLUTE(ADDR(.test28))); LONG(SIZEOF(.test28)); LONG(LOADADDR(.test28)); + LONG(ABSOLUTE(ADDR(.test29))); LONG(SIZEOF(.test29)); LONG(LOADADDR(.test29)); + LONG(ABSOLUTE(ADDR(.test30))); LONG(SIZEOF(.test30)); LONG(LOADADDR(.test30)); + LONG(ABSOLUTE(ADDR(.test31))); LONG(SIZEOF(.test31)); LONG(LOADADDR(.test31)); + LONG(ABSOLUTE(ADDR(.test32))); LONG(SIZEOF(.test32)); LONG(LOADADDR(.test32)); + LONG(ABSOLUTE(ADDR(.test33))); LONG(SIZEOF(.test33)); LONG(LOADADDR(.test33)); + LONG(ABSOLUTE(ADDR(.test34))); LONG(SIZEOF(.test34)); LONG(LOADADDR(.test34)); + LONG(ABSOLUTE(ADDR(.test35))); LONG(SIZEOF(.test35)); LONG(LOADADDR(.test35)); + LONG(ABSOLUTE(ADDR(.test36))); LONG(SIZEOF(.test36)); LONG(LOADADDR(.test36)); + LONG(ABSOLUTE(ADDR(.test37))); LONG(SIZEOF(.test37)); LONG(LOADADDR(.test37)); + LONG(ABSOLUTE(ADDR(.test38))); LONG(SIZEOF(.test38)); LONG(LOADADDR(.test38)); + LONG(ABSOLUTE(ADDR(.test39))); LONG(SIZEOF(.test39)); LONG(LOADADDR(.test39)); + LONG(ABSOLUTE(ADDR(.test40))); LONG(SIZEOF(.test40)); LONG(LOADADDR(.test40)); + LONG(ABSOLUTE(ADDR(.test41))); LONG(SIZEOF(.test41)); LONG(LOADADDR(.test41)); + LONG(ABSOLUTE(ADDR(.test42))); LONG(SIZEOF(.test42)); LONG(LOADADDR(.test42)); + LONG(0); LONG(0); LONG(0); + } > m_ocram + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.t.ld b/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.t.ld new file mode 100755 index 0000000..61ec153 --- /dev/null +++ b/platform/devices/MX8QM/linker/gcc/MX8QM_overlay.t.ld @@ -0,0 +1,313 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* DO NOT EDIT - This file auto generated by $cmd */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +OCRAM_ADDR = 0x100000; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_ocram (RX) : ORIGIN = 0x00100000, LENGTH = 0x00040000 + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002ED80 + m_ovl (RX) : ORIGIN = 0x2000F000, LENGTH = 0x00000FF0 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + OVERLAY : NOCROSSREFS + { +<% $counter = 0 %> +<%OV_LIST%> + .test$counter { */test_$tests[$counter].o(.text*) */test_$tests[$counter].o(.rodata*) } +<% $counter++; return 'OV_LIST' if $counter < scalar(@tests); '' %> + } > m_ovl AT> m_ocram + + .test_ovly_table : + { + . = ALIGN(4); + __ovly_table = .; + LONG(0x34982933); LONG(0); LONG($last); +<% $counter = 0 %> +<%TB_LIST%> + LONG(ABSOLUTE(ADDR(.test$counter))); LONG(SIZEOF(.test$counter)); LONG(LOADADDR(.test$counter)); +<% $counter++; return 'TB_LIST' if $counter < scalar(@tests); '' %> + LONG(0); LONG(0); LONG(0); + } > m_ocram + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8QM/linker/gcc/MX8QM_tcm.ld b/platform/devices/MX8QM/linker/gcc/MX8QM_tcm.ld new file mode 100755 index 0000000..55984d3 --- /dev/null +++ b/platform/devices/MX8QM/linker/gcc/MX8QM_tcm.ld @@ -0,0 +1,288 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002fd70 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8QM/system_MX8QM.h b/platform/devices/MX8QM/system_MX8QM.h new file mode 100755 index 0000000..c2511f0 --- /dev/null +++ b/platform/devices/MX8QM/system_MX8QM.h @@ -0,0 +1,198 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#ifndef SYSTEM_H +#define SYSTEM_H /**< Symbol preventing repeated inclusion */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Defines */ + +/* Reset requires 32 cycles of xtal24M to propagate. SysTick clocked from + ROSC will be used for delay. + + ROSC @ 200 MHz +*/ +#define RESET_WAIT_ROSC_CYCLES (((SC_ROSC_FREQ_HZ / SC_XTAL24M_FREQ_HZ) + 1U) * 32U) + +/* Define delay for top-level top-level SSI power switch chains. + */ +#define SYSCTR_NSEC_TO_CYCLES(nsec) ((((nsec) * SC_MCU_STARTUP_FREQ_MHZ) + 999U) / 1000U) +#define SSI_CHAIN_LF_CYCLES (SYSCTR_NSEC_TO_CYCLES(500U)) +#define SSI_CHAIN_HF_CYCLES (SYSCTR_NSEC_TO_CYCLES(2000U)) + +/* OSC24M lock spec unknown, use conservative 4ms */ +#define OSC24M_WAIT_ROSC_CYCLES (4*SC_ROSC_FREQ_HZ/1000U) + +/* Address for environment event trigger */ +#define SC_ENV_TRIG_ADDR 0x2000FFF0U + +/* Query to determine if firmware loaded by ROM */ +#ifndef SIMU +#define SCFW_LOADED_BY_ROM ((DSC_SC->GPR_CTRL[0].RW & BIT(31))) +#else +#define SCFW_LOADED_BY_ROM (0x80000000U) +#endif + +/* Query to determine boot mode + * BOOT_MODE[7:0] tied to DSC.GPR_STAT[0] bits [23:16] + */ +#define SC_BOOT_MODE ((DSC_SC->GPR_STAT[0].RW & 0x00FF0000U) >> 16U) + +/* BOOT_MODE = Infinite loop mode = bXX111000 = 0x38 */ +#define SC_BOOT_MODE_INF_LOOP 0x38U + +/* Margin to wake system early from LLS for WDOG servicing */ +#define SC_WAKE_MARGIN_MSEC 5U + +#ifdef DEBUG +extern uint32_t __DEBUG_DATA[]; +#define SCFW_DBG_READY (__DEBUG_DATA[0]) +#define SCFW_DBG_SKIPS (__DEBUG_DATA[1]) +#define SCFW_DBG_DUMP_PTR (&(__DEBUG_DATA[2])) +#define SCFW_DBG_DUMP_R0 (__DEBUG_DATA[2]) +#define SCFW_DBG_DUMP_R1 (__DEBUG_DATA[3]) +#define SCFW_DBG_DUMP_R2 (__DEBUG_DATA[4]) +#define SCFW_DBG_DUMP_R3 (__DEBUG_DATA[5]) +#define SCFW_DBG_DUMP_R12 (__DEBUG_DATA[6]) +#define SCFW_DBG_DUMP_LR (__DEBUG_DATA[7]) +#define SCFW_DBG_DUMP_PC (__DEBUG_DATA[8]) +#define SCFW_DBG_DUMP_PSR (__DEBUG_DATA[9]) +#define SCFW_DBG_SCTR_TICKS (__DEBUG_DATA[10]) +#define SCFW_DBG_RSVD0 (__DEBUG_DATA[11]) +#define SCFW_DBG_TX_PTR (&__DEBUG_DATA[12]) +#define SCFW_DBG_RX_PTR (&__DEBUG_DATA[13]) +#endif + +#define SC_ENV_TRIG_DUMP 0xc0ffee10U //!< Start dump +#define SC_ENV_TRIG_KILL 0xc0ffee20U //!< Kill execution + +/* Types */ + +/*! + * This type is used to indicate the trigger event. + */ +typedef uint32_t sc_env_trig_event_t; + +/** + * @brief Generate environment event trigger + * + */ +void SystemEventTrigger (sc_env_trig_event_t event); + +/** + * @brief Enter firmware critical section. + * + */ +void SystemEnterCS(void); + +/** + * @brief Exit firmware critical section. + * + */ +void SystemExitCS(void); + +/** + * @brief Get active exception. + * + */ +uint32_t SystemGetActiveException(void); + +/** + * @brief Setup the microcontroller system. + * + * Typically this function configures the oscillator (PLL) that is part of the + * microcontroller device. For systems with variable clock speed it also updates + * the variable SystemCoreClock. SystemInit is called from startup_device file. + */ +void SystemInit(void); + +void SystemInitPostCRT(void); + +/** + * @brief Prepares to enter Low-Power Mode (LPM) + * + */ +void SystemPrepareLPM(void); + +void SystemEnterLPM(void); + +/** + * @brief Delays the specified number of usec + * + */ +void SystemTimeDelay(uint32_t usec); + +void SystemDebugWaitAttach(void); + +void CommonFault_Handler(uint32_t *sp); + +void SystemDebugHalt(void); + +void SystemExit(void); + +void HardFault_Handler(uint32_t *sp); + +void MemManage_Handler(uint32_t *sp); + +void BusFault_Handler(uint32_t *sp); + +void UsageFault_Handler(uint32_t *sp); + +void SystemDebugResume(void); + +#if defined(DEBUG) || defined(HAS_TEST) +uint32_t SystemMemoryProbe(void *addr, void *val, uint8_t width); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* #if !defined(SYSTEM_H_) */ diff --git a/platform/devices/MX8QX/MX8QX.h b/platform/devices/MX8QX/MX8QX.h new file mode 100755 index 0000000..b25d40b --- /dev/null +++ b/platform/devices/MX8QX/MX8QX.h @@ -0,0 +1,704 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * @file MX8QX.h + * @version 1.7 + * @date 2015-05-16 + * @brief CMSIS Peripheral Access Layer for MX8QX + * + * CMSIS Peripheral Access Layer for MX8QX + */ + +#ifndef MX8QX_H +#define MX8QX_H /**< Symbol preventing repeated inclusion */ + +/* Check for valid CPU versions */ +#if !defined(SREV_B0) && !defined(SREV_C0) + #error "Invalid SOC revision!\n" +#endif + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100U +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0007U + + +/* ---------------------------------------------------------------------------- + -- Memory Map (SC perspective) + ---------------------------------------------------------------------------- */ + +#define LSIO_SS_BASE1 0x00000000U /* LSIO SS - slot 1 */ +#define OCRAM_ALIAS_BASE (LSIO_SS_BASE1+0x000000U) /* OCRAM alias */ +#define SC_ROM_BASE 0x00000000U /* SC ROM */ +#define OCRAM_BASE (LSIO_SS_BASE1+0x100000U) /* OCRAM */ +#define FSPI0_MEM_BASE (LSIO_SS_BASE1+0x8000000U) /* FlexSPI0 Memory */ +#define TCML_BASE 0x1FFE0000U /* SC TCML */ +#define TCMU_BASE 0x20000000U /* SC TCMU */ +#define CAAM_BASE 0x20400000U /* SC CAAM */ +#define ADM_BASE 0x20520000U /* SC ADM */ +#define OTP_BASE 0x20530000U /* SC OTP */ +#define SNVS_BASE 0x20540000U /* SC SNVS */ +#define MU0_BASE 0x20550000U /* SECO MU 1 */ +#define VPU_SS_BASE1 0x2C000000U /* VPU SS - slot 1 */ +#define VPU_SCB_BASE (VPU_SS_BASE1+0x0070000U) /* VPU SCB */ +#define VPU_MFD_BASE (VPU_SS_BASE1+0x01B0000U) /* VPU Decoder */ +#define MU7_BASE (VPU_SS_BASE1+0x1010000U) /* VPU MU 0 */ +#define MU8_BASE (VPU_SS_BASE1+0x1030000U) /* VPU MU 1 */ +#define SCU_SS_BASE0 0x30000000U /* SCU SS - slot 0 */ +#define TCML0_BASE (SCU_SS_BASE0+0x00FE0000U) /* SCU TCML */ +#define TCMU0_BASE (SCU_SS_BASE0+0x01000000U) /* SCU TCMU */ +#define MCU_0_SS_BASE0 0x34000000U /* MCU 0 SS - slot 0 */ +#define TCML1_BASE (MCU_0_SS_BASE0+0x0FE0000U) /* MCU 0 TCML */ +#define TCMU1_BASE (MCU_0_SS_BASE0+0x1000000U) /* MCU 0 TCMU */ +#define RGPIOB_BASE (MCU_0_SS_BASE0+0x30F0000U) /* MCU 0 RGPIO */ +#define LPUART1_BASE (MCU_0_SS_BASE0+0x3220000U) /* MCU 0 LPUART */ +#define LPI2C1_BASE (MCU_0_SS_BASE0+0x3230000U) /* MCU 0 LPI2C */ +#define WDOG1_BASE (MCU_0_SS_BASE0+0x3420000U) /* MCU 0 WDOG */ +#define MU9_BASE (MCU_0_SS_BASE0+0x3480000U) /* MCU 0 MU 1A */ +#define SYSCTR_CTRL_BASE 0x40000000U /* SC SYSCTR Control */ +#define SYSCTR_RD_BASE 0x40010000U /* SC SYSCTR Read */ +#define SYSCTR_CMP_BASE 0x40020000U /* SC SYSCTR Compare 0 */ +#define SYSCTR_CMP1_BASE 0x40020100U /* SC SYSCTR Compare 1 */ +#define LPC_BASE 0x40070000U /* SC LPC */ +#define CSGPR_BASE 0x40470000U /* CoreSight GPR */ +#define AP_1_DEBUG_APB_BASE 0x40600000U /* AP_1 Debug APB */ +#define AP_0_DEBUG_APB_BASE 0x40800000U /* AP_0 Debug APB */ +#define AP_2_DEBUG_APB_BASE 0x40800000U /* AP_2 Debug APB */ +#define RGPIOA_BASE 0x410F0000U /* SC RGPIO */ +#define LPIT0_BASE 0x41210000U /* SC LPIT */ +#define LPUART0_BASE 0x41220000U /* SC LPUART */ +#define LPI2C0_BASE 0x41230000U /* SC LPI2C */ +#define ASMC_BASE 0x41410000U /* SC ASMC */ +#define WDOG0_BASE 0x41420000U /* SC WDOG */ +#define MU1_BASE 0x41430000U /* SC MU 0B */ +#define MU2_BASE 0x41440000U /* SC MU 0A0 */ +#define MU3_BASE 0x41450000U /* SC MU 0A1 */ +#define MU4_BASE 0x41460000U /* SC MU 0A2 */ +#define MU5_BASE 0x41470000U /* SC MU 0A3 */ +#define MU6_BASE 0x41480000U /* SC MU 1A */ +#define MSI0_BASE 0x41800000U /* SC DSC MSI Ring 0 */ +#define DSC1_BASE 0x41820000U /* SC SC DSC */ +#define REP2_BASE 0x4182B000U /* SC MBIST MTR */ +#define MSI1_BASE 0x41A00000U /* SC DSC MSI Ring 1 */ +#define DSC19_BASE 0x41A60000U /* SC ADMA DSC */ +#define DSC22_BASE 0x41AC0000U /* SC GPU_0 DSC */ +#define DSC25_BASE 0x41B20000U /* SC DB DSC */ +#define DSC26_BASE 0x41B40000U /* SC AP_2 DSC */ +#define DSC27_BASE 0x41B60000U /* SC MCU_0 DSC */ +#define MSI2_BASE 0x41C00000U /* SC DSC MSI Ring 2 */ +#define DSC36_BASE 0x41C80000U /* SC DRC_0 DSC */ +#define DSC37_BASE 0x41CA0000U /* SC DC_0 DSC */ +#define DSC38_BASE 0x41CC0000U /* SC HSIO DSC */ +#define DSC39_BASE 0x41CE0000U /* SC CONN DSC */ +#define DSC40_BASE 0x41D00000U /* SC VPU DSC */ +#define MSI3_BASE 0x41E00000U /* SC DSC MSI Ring 3 */ +#define DSC50_BASE 0x41E40000U /* SC IMG DSC */ +#define DSC51_BASE 0x41E60000U /* SC LSIO DSC */ +#define DSC56_BASE 0x41F00000U /* SC MIPI_1 DSC */ +#define DSC57_BASE 0x41F20000U /* SC MIPI_0 DSC */ +#define DSC58_BASE 0x41F40000U /* SC CSI_0 DSC */ +#define DSC59_BASE 0x41F60000U /* SC PI_0 DSC */ +#define PAD_BASE 0x41F80000U /* SC Pad */ +#define MSI4_BASE 0x41F9F000U /* SC Pad MSI Ring 0 */ +#define MSI5_BASE 0x41FBF000U /* SC Pad MSI Ring 1 */ +#define MSI6_BASE 0x41FDF000U /* SC Pad MSI Ring 2 */ +#define MSI7_BASE 0x41FFF000U /* SC Pad MSI Ring 3 */ +#define ADMA_SS_BASE2 0x51000000U /* ADMA SS - slot 2 */ +#define IRQSTR_SCU_BASE (ADMA_SS_BASE2+0x060000U) /* IRQSTR.SCU1 */ +#define GIC0_BASE (ADMA_SS_BASE2+0xA00000U) /* GIC 0 */ +#define GPU_0_SS_BASE0 0x53000000U /* GPU 0 SS - slot 0 */ +#define DC_0_SS_BASE0 0x56000000U /* DC 0 SS - slot 0 */ +#define DC_0_ADDR_0 (DC_0_SS_BASE0+0x00000U) /* DC 0 test addr 0 */ +#define DC_0_ADDR_1 (DC_0_SS_BASE0+0x10000U) /* DC 0 test addr 1 */ +#define DC_0_MSI_BASE (DC_0_SS_BASE0+0x200000U) /* DC_0 MSI CTRL */ +#define MIPI_0_SS_BASE (DC_0_SS_BASE0+0x220000U) /* MIPI 0 */ +#define LPI2C2_BASE (MIPI_0_SS_BASE+0x6000U) /* MIPI 0 LPI2C 0 */ +#define LPI2C3_BASE (MIPI_0_SS_BASE+0x7000U) /* MIPI 0 LPI2C 1 */ +#define MIPI_1_SS_BASE (DC_0_SS_BASE0+0x240000U) /* MIPI 1 */ +#define LPI2C4_BASE (MIPI_1_SS_BASE+0x6000U) /* MIPI 1 LPI2C 0 */ +#define LPI2C5_BASE (MIPI_1_SS_BASE+0x7000U) /* MIPI 1 LPI2C 1 */ +#define IMG_SS_BASE0 0x58000000U /* IMG SS - slot 0 */ +#define IMG_0_GPIO_BASE (IMG_SS_BASE0+0x000000U) /* IMG GPIO */ +#define ISI0_BASE (IMG_SS_BASE0+0x100000U) /* IMG CH0 */ +#define ISI1_BASE (IMG_SS_BASE0+0x110000U) /* IMG CH1 */ +#define ISI2_BASE (IMG_SS_BASE0+0x120000U) /* IMG CH2 */ +#define ISI3_BASE (IMG_SS_BASE0+0x130000U) /* IMG CH3 */ +#define ISI4_BASE (IMG_SS_BASE0+0x140000U) /* IMG CH4 */ +#define ISI5_BASE (IMG_SS_BASE0+0x150000U) /* IMG CH5 */ +#define ISI6_BASE (IMG_SS_BASE0+0x160000U) /* IMG CH6 */ +#define ISI7_BASE (IMG_SS_BASE0+0x170000U) /* IMG CH7 */ +#define IMG_0_MSI_BASE (IMG_SS_BASE0+0x200000U) /* IMG MSI CTRL */ +#define CSI_0_SS_BASE (IMG_SS_BASE0+0x220000U) /* CSI 0 */ +#define LPI2C6_BASE (CSI_0_SS_BASE+0x6000U) /* CSI 0 LPI2C 0 */ +#define PI_0_SS_BASE (IMG_SS_BASE0+0x260000U) /* PI 0 */ +#define PI_0_BASE (PI_0_SS_BASE+0x1000U) /* PI 0 */ +#define LPI2C7_BASE (PI_0_SS_BASE+0x6000U) /* PI 0 LPI2C */ +#define ADMA_SS_BASE0 0x59000000U /* ADMA SS - slot 0 */ +#define DMA0_BASE (ADMA_SS_BASE0+0x1F0000U) /* ADMA eDMA 0 MP */ +#define DSP_DRAM_BASE (ADMA_SS_BASE0+0x6E8000U) /* DSP DRAM */ +#define DSP_DRAM1_BASE (ADMA_SS_BASE0+0x6F0000U) /* DSP DRAM 1 */ +#define DSP_IRAM_BASE (ADMA_SS_BASE0+0x6F8000U) /* DSP IRAM */ +#define DSP_OCRAM_BASE (ADMA_SS_BASE0+0x700000U) /* DSP OCRAM */ +#define DMA1_BASE (ADMA_SS_BASE0+0x9F0000U) /* ADMA eDMA 1 MP */ +#define ADMA_SS_BASE1 0x5A000000U /* ADMA SS - slot 1 */ +#define LPUART2_BASE (ADMA_SS_BASE1+0x060000U) /* ADMA LPUART 0 */ +#define LPUART3_BASE (ADMA_SS_BASE1+0x070000U) /* ADMA LPUART 1 */ +#define LPUART4_BASE (ADMA_SS_BASE1+0x080000U) /* ADMA LPUART 2 */ +#define LPUART5_BASE (ADMA_SS_BASE1+0x090000U) /* ADMA LPUART 3 */ +#define DMA2_BASE (ADMA_SS_BASE1+0x1F0000U) /* ADMA eDMA 2 MP */ +#define LPI2C8_BASE (ADMA_SS_BASE1+0x800000U) /* ADMA LPI2C 0 */ +#define LPI2C9_BASE (ADMA_SS_BASE1+0x810000U) /* ADMA LPI2C 1 */ +#define LPI2C10_BASE (ADMA_SS_BASE1+0x820000U) /* ADMA LPI2C 2 */ +#define LPI2C11_BASE (ADMA_SS_BASE1+0x830000U) /* ADMA LPI2C 3 */ +#define DMA3_BASE (ADMA_SS_BASE1+0x9F0000U) /* ADMA eDMA 3 MP */ +#define CONN_SS_BASE0 0x5B000000U /* CONN SS - slot 0 */ +#define SDHC0_BASE (CONN_SS_BASE0+0x010000U) /* CONN SDHC 0 */ +#define SDHC1_BASE (CONN_SS_BASE0+0x020000U) /* CONN SDHC 1 */ +#define SDHC2_BASE (CONN_SS_BASE0+0x030000U) /* CONN SDHC 2 */ +#define ENET0_BASE (CONN_SS_BASE0+0x040000U) /* CONN ENET 0 */ +#define ENET1_BASE (CONN_SS_BASE0+0x050000U) /* CONN ENET 1 */ +#define DMA4_BASE (CONN_SS_BASE0+0x070000U) /* CONN eDMA MP */ +#define USB_0_BASE (CONN_SS_BASE0+0x0D0000U) /* CONN USB 0 */ +#define USB_1_BASE (CONN_SS_BASE0+0x0E0000U) /* CONN USB 1 */ +#define USB_0_PHY_BASE (CONN_SS_BASE0+0x100000U) /* CONN USB 0 PHY */ +#define USB_1_PHY_BASE (CONN_SS_BASE0+0x110000U) /* CONN USB 1 PHY */ +#define ENET0_LPCG (CONN_SS_BASE0+0x230000U) /* CONN ENET 0 LPCG */ +#define NAND_BASE (CONN_SS_BASE0+0x810000U) /* CONN NAND */ +#define DB_SS_BASE0 0x5C000000U /* DB SS - slot 0 */ +#define DRC_LPCG_6 (DB_SS_BASE0+0x090000U) /* DRC LPCG 6 */ +#define DRC_LPCG_5 (DB_SS_BASE0+0x0A0000U) /* DRC LPCG 5 - fixed */ +#define DRC_LPCG_4 (DB_SS_BASE0+0x0B0000U) /* DRC LPCG 4 - fixed */ +#define DRC_LPCG_0 (DB_SS_BASE0+0x0C0000U) /* DRC LPCG 0 */ +#define DRC_LPCG_1 (DB_SS_BASE0+0x0D0000U) /* DRC LPCG 1 */ +#define DRC_LPCG_2 (DB_SS_BASE0+0x0E0000U) /* DRC LPCG 2 - doesn't exist */ +#define DRC_LPCG_3 (DB_SS_BASE0+0x0F0000U) /* DRC LPCG 3 */ +#define STC0_BASE (DB_SS_BASE0+0x400000U) /* DB PG0 STC 0 */ +#define STC1_BASE (DB_SS_BASE0+0x410000U) /* DB PG0 STC 1 */ +#define STC2_BASE (DB_SS_BASE0+0x420000U) /* DB PG0 STC 2 */ +#define STC3_BASE (DB_SS_BASE0+0x430000U) /* DB PG0 STC 3 */ +#define DB_LPCG_PG0_BASE (DB_SS_BASE0+0x4F0000U) /* DB PG0 LPCG */ +#define STC4_BASE (DB_SS_BASE0+0x500000U) /* DB PG1 STC 0 */ +#define STC5_BASE (DB_SS_BASE0+0x510000U) /* DB PG1 STC 1 */ +#define STC6_BASE (DB_SS_BASE0+0x520000U) /* DB PG1 STC 2 */ +#define STC7_BASE (DB_SS_BASE0+0x530000U) /* DB PG1 STC 3 */ +#define DB_LPCG_PG1_BASE (DB_SS_BASE0+0x5F0000U) /* DB PG1 LPCG */ +#define STC8_BASE (DB_SS_BASE0+0x600000U) /* DB PG2 STC 0 */ +#define STC9_BASE (DB_SS_BASE0+0x610000U) /* DB PG2 STC 1 */ +#define STC10_BASE (DB_SS_BASE0+0x620000U) /* DB PG2 STC 2 */ +#define STC11_BASE (DB_SS_BASE0+0x630000U) /* DB PG2 STC 3 */ +#define DB_LPCG_PG2_BASE (DB_SS_BASE0+0x6F0000U) /* DB PG2 LPCG */ +#define DB_LPCG_BN_BASE (DB_SS_BASE0+0xAF0000U) /* DB BN LPCG */ +#define LSIO_SS_BASE0 0x5D000000U /* LSIO SS - slot 0 */ +#define PWM0_BASE (LSIO_SS_BASE0+0x000000U) /* LSIO PWM 0 */ +#define PWM1_BASE (LSIO_SS_BASE0+0x010000U) /* LSIO PWM 1 */ +#define PWM2_BASE (LSIO_SS_BASE0+0x020000U) /* LSIO PWM 2 */ +#define PWM3_BASE (LSIO_SS_BASE0+0x030000U) /* LSIO PWM 3 */ +#define PWM4_BASE (LSIO_SS_BASE0+0x040000U) /* LSIO PWM 4 */ +#define PWM5_BASE (LSIO_SS_BASE0+0x050000U) /* LSIO PWM 5 */ +#define PWM6_BASE (LSIO_SS_BASE0+0x060000U) /* LSIO PWM 6 */ +#define PWM7_BASE (LSIO_SS_BASE0+0x070000U) /* LSIO PWM 7 */ +#define GPIO0_BASE (LSIO_SS_BASE0+0x080000U) /* LSIO GPIO 0 */ +#define GPIO1_BASE (LSIO_SS_BASE0+0x090000U) /* LSIO GPIO 1 */ +#define GPIO2_BASE (LSIO_SS_BASE0+0x0A0000U) /* LSIO GPIO 2 */ +#define GPIO3_BASE (LSIO_SS_BASE0+0x0B0000U) /* LSIO GPIO 3 */ +#define GPIO4_BASE (LSIO_SS_BASE0+0x0C0000U) /* LSIO GPIO 4 */ +#define GPIO5_BASE (LSIO_SS_BASE0+0x0D0000U) /* LSIO GPIO 5 */ +#define GPIO6_BASE (LSIO_SS_BASE0+0x0E0000U) /* LSIO GPIO 6 */ +#define GPIO7_BASE (LSIO_SS_BASE0+0x0F0000U) /* LSIO GPIO 7 */ +#define FSPI0_BASE (LSIO_SS_BASE0+0x120000U) /* FSPI0 */ +#define FSPI1_BASE (LSIO_SS_BASE0+0x130000U) /* FSPI1 */ +#define GPT0_BASE (LSIO_SS_BASE0+0x140000U) /* LSIO GPT 0 */ +#define GPT1_BASE (LSIO_SS_BASE0+0x150000U) /* LSIO GPT 1 */ +#define GPT2_BASE (LSIO_SS_BASE0+0x160000U) /* LSIO GPT 2 */ +#define GPT3_BASE (LSIO_SS_BASE0+0x170000U) /* LSIO GPT 3 */ +#define GPT4_BASE (LSIO_SS_BASE0+0x180000U) /* LSIO GPT 4 */ +#define KPP_BASE (LSIO_SS_BASE0+0x1A0000U) /* LSIO KPP */ +#define MU10_BASE (LSIO_SS_BASE0+0x1B0000U) /* LSIO MU 0A */ +#define MU11_BASE (LSIO_SS_BASE0+0x1C0000U) /* LSIO MU 1A */ +#define MU12_BASE (LSIO_SS_BASE0+0x1D0000U) /* LSIO MU 2A */ +#define MU13_BASE (LSIO_SS_BASE0+0x1E0000U) /* LSIO MU 3A */ +#define MU14_BASE (LSIO_SS_BASE0+0x1F0000U) /* LSIO MU 4A */ +#define IEE_BASE (LSIO_SS_BASE0+0x320000U) /* IEE */ +#define IEE_R0_BASE (LSIO_SS_BASE0+0x330000U) /* IEE R0 */ +#define IEE_R1_BASE (LSIO_SS_BASE0+0x340000U) /* IEE R1 */ +#define HSIO_0_SS_BASE0 0x5F000000U /* HSIO 0 SS - slot 0 */ +#define HSIO_0_LPCG_GPIO (HSIO_0_SS_BASE0+0x100000U) /* HSIO 0 GPIO LPCG */ +#define HSIO_0_SS_BASE2 0x70000000U /* HSIO 0 SS - slot 2 */ +#define DDR_BASE0 0x80000000U /* DDR */ +#define MCM_BASE 0xE0080000U /* SC MCM */ +#define LMEM_BASE 0xE0082000U /* SC LMEM */ +#define DDR_BASE0_END 0xFFFFFFFFU /* Top of DDR 0 */ +#define LSIO_SS_BASE2 0x400000000ULL /* LSIO SS - slot 2 */ +#define FSPI1_MEM_BASE (LSIO_SS_BASE2+0x0U) /* FlexSPI1 Memory */ +#define DDR_BASE1 0x880000000ULL /* DDR - high mem */ +#define DDR_BASE1_END 0xFFFFFFFFFULL /* Top of DDR 1 */ + +/* Unused */ + +#define DSC2_BASE 0 +#define DSC3_BASE 0 +#define DSC4_BASE 0 +#define DSC5_BASE 0 +#define DSC6_BASE 0 +#define DSC7_BASE 0 +#define DSC8_BASE 0 +#define DSC9_BASE 0 +#define DSC10_BASE 0 +#define DSC11_BASE 0 +#define DSC12_BASE 0 +#define DSC13_BASE 0 +#define DSC14_BASE 0 +#define DSC15_BASE 0 +#define DSC17_BASE 0 +#define DSC18_BASE 0 +#define DSC20_BASE 0 +#define DSC21_BASE 0 +#define DSC23_BASE 0 +#define DSC24_BASE 0 +#define DSC28_BASE 0 +#define DSC29_BASE 0 +#define DSC30_BASE 0 +#define DSC31_BASE 0 +#define DSC33_BASE 0 +#define DSC34_BASE 0 +#define DSC35_BASE 0 +#define DSC41_BASE 0 +#define DSC42_BASE 0 +#define DSC43_BASE 0 +#define DSC44_BASE 0 +#define DSC45_BASE 0 +#define DSC46_BASE 0 +#define DSC47_BASE 0 +#define DSC49_BASE 0 +#define DSC52_BASE 0 +#define DSC53_BASE 0 +#define DSC54_BASE 0 +#define DSC55_BASE 0 +#define DSC60_BASE 0 +#define DSC61_BASE 0 +#define DSC62_BASE 0 +#define DSC63_BASE 0 +#define WDOG2_BASE 0 +#define RGPIOC_BASE 0 +#define LPI2C12_BASE 0 +#define LPI2C13_BASE 0 +#define LPI2C14_BASE 0 +#define LPI2C15_BASE 0 +#define LPI2C16_BASE 0 +#define LPI2C17_BASE 0 +#define LPI2C18_BASE 0 +#define LPI2C19_BASE 0 +#define LPI2C20_BASE 0 +#define LPI2C21_BASE 0 +#define LPI2C22_BASE 0 +#define LPI2C23_BASE 0 +#define LPI2C24_BASE 0 +#define LPI2C25_BASE 0 +#define LPUART6_BASE 0 +#define LPUART7_BASE 0 +#define LPUART8_BASE 0 +#define DMA5_BASE 0 +#define DMA6_BASE 0 +#define ISI8_BASE 0 +#define ISI9_BASE 0 +#define ISI10_BASE 0 +#define ISI11_BASE 0 +#define ISI12_BASE 0 +#define ISI13_BASE 0 +#define ISI14_BASE 0 +#define ISI15_BASE 0 +#define ISI16_BASE 0 +#define ISI17_BASE 0 +#define ISI18_BASE 0 +#define ISI19_BASE 0 +#define ISI20_BASE 0 +#define ISI21_BASE 0 +#define ISI22_BASE 0 +#define ISI23_BASE 0 +#define MU15_BASE 0 +#define MU16_BASE 0 +#define MU17_BASE 0 +#define MU18_BASE 0 +#define MU19_BASE 0 +#define MU20_BASE 0 +#define MU21_BASE 0 +#define MU22_BASE 0 +#define MU23_BASE 0 +#define MU24_BASE 0 +#define STC12_BASE 0 +#define STC13_BASE 0 +#define STC14_BASE 0 +#define STC15_BASE 0 +#define STC16_BASE 0 +#define STC17_BASE 0 +#define STC18_BASE 0 +#define STC19_BASE 0 +#define STC20_BASE 0 +#define STC21_BASE 0 +#define STC22_BASE 0 +#define STC23_BASE 0 + + +/* ---------------------------------------------------------------------------- + -- Device Mapping + ---------------------------------------------------------------------------- */ + +#define DMA_AUDIO0 DMA0 +#define DMA_AUDIO1 DMA1 +#define DMA_PERIPH0 DMA2 +#define DMA_PERIPH1 DMA3 +#define DMA_CONN DMA4 +#define DSC_SC DSC1 +#define DSC_ADMA DSC19 +#define DSC_GPU_0 DSC22 +#define DSC_DB DSC25 +#define DSC_AP_2 DSC26 +#define DSC_MCU_0 DSC27 +#define DSC_DRC_0 DSC36 +#define DSC_DC_0 DSC37 +#define DSC_HSIO DSC38 +#define DSC_CONN DSC39 +#define DSC_VPU DSC40 +#define DSC_IMG DSC50 +#define DSC_LSIO DSC51 +#define DSC_MIPI_1 DSC56 +#define DSC_MIPI_0 DSC57 +#define DSC_CSI_0 DSC58 +#define DSC_PI_0 DSC59 +#define GPIO_SC RGPIOA +#define GPIO_MCU_0 RGPIOB +#define ISI_IMG_0_CH0 ISI0 +#define ISI_IMG_0_CH1 ISI1 +#define ISI_IMG_0_CH2 ISI2 +#define ISI_IMG_0_CH3 ISI3 +#define ISI_IMG_0_CH4 ISI4 +#define ISI_IMG_0_CH5 ISI5 +#define ISI_IMG_0_CH6 ISI6 +#define ISI_IMG_0_CH7 ISI7 +#define LPI2C_SC LPI2C0 +#define LPI2C_MCU_0 LPI2C1 +#define LPI2C_MIPI0_0 LPI2C2 +#define LPI2C_MIPI0_1 LPI2C3 +#define LPI2C_MIPI1_0 LPI2C4 +#define LPI2C_MIPI1_1 LPI2C5 +#define LPI2C_CSI0_0 LPI2C6 +#define LPI2C_PI_0 LPI2C7 +#define LPI2C_0 LPI2C8 +#define LPI2C_1 LPI2C9 +#define LPI2C_2 LPI2C10 +#define LPI2C_3 LPI2C11 +#define LPIT_SC LPIT0 +#define LPUART_SC LPUART0 +#define LPUART_MCU_0 LPUART1 +#define LPUART_0 LPUART2 +#define LPUART_1 LPUART3 +#define LPUART_2 LPUART4 +#define LPUART_3 LPUART5 +#define MU_SECO MU0 +#define MU_SC_0B MU1 +#define MU_SC_0A0 MU2 +#define MU_SC_0A1 MU3 +#define MU_SC_0A2 MU4 +#define MU_SC_0A3 MU5 +#define MU_SC_1A MU6 +#define MU_VPU_0 MU7 +#define MU_VPU_1 MU8 +#define MU_MCU_0_1A MU9 +#define MU_LSIO_0A MU10 +#define MU_LSIO_1A MU11 +#define MU_LSIO_2A MU12 +#define MU_LSIO_3A MU13 +#define MU_LSIO_4A MU14 +#define STC_PG0_0 STC0 +#define STC_PG0_1 STC1 +#define STC_PG0_2 STC2 +#define STC_PG0_3 STC3 +#define STC_PG1_0 STC4 +#define STC_PG1_1 STC5 +#define STC_PG1_2 STC6 +#define STC_PG1_3 STC7 +#define STC_PG2_0 STC8 +#define STC_PG2_1 STC9 +#define STC_PG2_2 STC10 +#define STC_PG2_3 STC11 +#define TCMU_SC TCMU0_BASE +#define TCMU_MCU_0 TCMU1_BASE +#define TCML_SC TCML0_BASE +#define TCML_MCU_0 TCML1_BASE +#define WDOG_SC WDOG0 +#define WDOG_MCU_0 WDOG1 + +/* ---------------------------------------------------------------------------- + -- CoreSight Granular Power Requestor Mappings + ---------------------------------------------------------------------------- */ +#define CSGPR_CPWRUPREQ (CSGPR_BASE+0x000U) +#define CSGPR_CPWRUPACK (CSGPR_BASE+0x004U) +#define CSGPR_CLAIMSET (CSGPR_BASE+0xFA0U) +#define CSGPR_CLAIMCLR (CSGPR_BASE+0xFA4U) +#define CSGPR_LAR (CSGPR_BASE+0xFB0U) +#define CSGPR_LSR (CSGPR_BASE+0xFB4U) + +#define CSGPR_IDX_A35 5U +#define CSGPR_IDX_MCU_0 6U + +#define CSGPR_XOR_DSC_REG 1U +#define CSGPR_XOR_DSC_MASK 0x0000FFFFU +#define CSGPR_ACK_DSC_REG 2U +#define CSGPR_ACK_DSC_MASK 0xFFFF0000U + +/* ---------------------------------------------------------------------------- + -- GIC Mappings + ---------------------------------------------------------------------------- */ +#define GICD_BASE (GIC0_BASE+0x000000U) +#define GICR_BASE (GIC0_BASE+0x100000U) + +#define GICD_CTLR_OFS (0x0000U) +#define GICD_CTLR_RWP_MASK (0x80000000U) + +#define GICR_WAKER_OFS (0x0014U) +#define GICR_WAKER_PA_MASK (0x00000002U) +#define GICR_WAKER_CA_MASK (0x00000004U) + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers Interrupt vector numbers + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 256 /**< Number of interrupts in the Vector table */ + + /* Auxiliary constants */ +#define NotAvail_IRQn -128 /**< Not available device specific interrupt */ + + /* Core interrupts */ +#define NonMaskableInt_IRQn -14 /**< Non Maskable Interrupt */ +#define HardFault_IRQn -13 /**< Cortex-M4 SV Hard Fault Interrupt */ +#define MemoryManagement_IRQn -12 /**< Cortex-M4 Memory Management Interrupt */ +#define BusFault_IRQn -11 /**< Cortex-M4 Bus Fault Interrupt */ +#define UsageFault_IRQn -10 /**< Cortex-M4 Usage Fault Interrupt */ +#define SVCall_IRQn -5 /**< Cortex-M4 SV Call Interrupt */ +#define DebugMonitor_IRQn -4 /**< Cortex-M4 Debug Monitor Interrupt */ +#define PendSV_IRQn -2 /**< Cortex-M4 Pend SV Interrupt */ +#define SysTick_IRQn -1 /**< Cortex-M4 System Tick Interrupt */ + + /* Device specific interrupts */ +#define Reserved0_IRQn 0 /**< Reserved interrupt */ +#define Reserved1_IRQn 1 /**< Reserved interrupt */ +#define Reserved2_IRQn 2 /**< Reserved interrupt */ +#define Reserved3_IRQn 3 /**< Reserved interrupt */ +#define Reserved4_IRQn 4 /**< Reserved interrupt */ +#define MCM_IRQn 5 /**< MCM interrupt */ +#define DebugWake_IRQn 6 /**< Debug wake interrupt */ +#define OCOTP_Bank0_IRQn 7 /**< OCOTP bank0 interrupt */ +#define OCOTP_Bank1_IRQn 8 /**< OCOTP bank1 interrupt */ +#define Reserved9_IRQn 9 /**< Reserved interrupt */ +#define INTMUX0_8_IRQn 10 /**< INTMUX0_8 interrupt */ +#define INTMUX0_9_IRQn 11 /**< INTMUX0_9 interrupt */ +#define INTMUX0_10_IRQn 12 /**< INTMUX0_10 interrupt */ +#define INTMUX0_11_IRQn 13 /**< INTMUX0_11 interrupt */ +#define INTMUX0_12_IRQn 14 /**< INTMUX0_12 interrupt */ +#define INTMUX0_13_IRQn 15 /**< INTMUX0_13 interrupt */ +#define INTMUX0_14_IRQn 16 /**< INTMUX0_14 interrupt */ +#define INTMUX0_15_IRQn 17 /**< INTMUX0_15 interrupt */ +#define Reserved18_IRQn 18 /**< Reserved interrupt */ +#define TPM0_IRQn 19 /**< TPM0 interrupt */ +#define Reserved20_IRQn 20 /**< Reserved interrupt */ +#define Reserved21_IRQn 21 /**< Reserved interrupt */ +#define LPIT0_IRQn 22 /**< LPIT0 interrupt */ +#define Reserved23_IRQn 23 /**< Reserved interrupt */ +#define Reserved24_IRQn 24 /**< Reserved interrupt */ +#define LPUART0_IRQn 25 /**< LPUART0 interrupt */ +#define Reserved26_IRQn 26 /**< Reserved interrupt */ +#define LPI2C0_IRQn 27 /**< LPI2C0 interrupt */ +#define Reserved28_IRQn 28 /**< Reserved interrupt */ +#define MU0_B0_IRQn 29 /**< MU0_B0 interrupt */ +#define SECO_MU_NMI_IRQn 30 /**< SECO_MU_NMI interrupt */ +#define SECO_MU_IRQn 31 /**< SECO_MU interrupt */ +#define INTMUX0_0_IRQn 32 /**< INTMUX0_0 interrupt */ +#define INTMUX0_1_IRQn 33 /**< INTMUX0_1 interrupt */ +#define INTMUX0_2_IRQn 34 /**< INTMUX0_2 interrupt */ +#define INTMUX0_3_IRQn 35 /**< INTMUX0_3 interrupt */ +#define INTMUX0_4_IRQn 36 /**< INTMUX0_4 interrupt */ +#define INTMUX0_5_IRQn 37 /**< INTMUX0_5 interrupt */ +#define INTMUX0_6_IRQn 38 /**< INTMUX0_6 interrupt */ +#define INTMUX0_7_IRQn 39 /**< INTMUX0_7 interrupt */ +#define SYSCTR_CMP3_IRQn 40 /**< SYSCTR_CMP3 interrupt */ +#define SYSCTR_CMP2_IRQn 41 /**< SYSCTR_CMP2 interrupt */ +#define SYSCTR_CMP1_IRQn 42 /**< SYSCTR_CMP1 interrupt */ +#define SYSCTR_CMP0_IRQn 43 /**< SYSCTR_CMP0 interrupt */ +#define MU0_B1_IRQn 44 /**< MU0_B1 interrupt */ +#define MU0_B2_IRQn 45 /**< MU0_B2 interrupt */ +#define MU0_B3_IRQn 46 /**< MU0_B3 interrupt */ +#define PMIC_INT_IRQn 47 /**< PMIC_INT interrupt */ +#define PMIC_EarlyWarning_IRQn 48 /**< PMIC_EarlyWarning interrupt */ +#define MU1_A_IRQn 49 /**< MU1_A interrupt */ +#define SWI_IRQn 50 /**< Software interrupt */ +#define SWI_DQS2DQ_IRQn 51 /**< DQS2DQ Software interrupt */ +#define CAAM_IRQ0_IRQn 52 /**< CAAM_IRQ0 interrupt */ +#define CAAM_IRQ1_IRQn 53 /**< CAAM_IRQ1 interrupt */ +#define CAAM_IRQ2_IRQn 54 /**< CAAM_IRQ2 interrupt */ +#define CAAM_IRQ3_IRQn 55 /**< CAAM_IRQ3 interrupt */ +#define CAAM_RTIC_IRQn 56 /**< CAAM_RTIC interrupt */ +#define CAAM_Error_IRQn 57 /**< CAAM_Error interrupt */ +#define SNVS_Functional_IRQn 58 /**< SNVS_Functional interrupt */ +#define SNVS_SecurityViolation_IRQn 59 /**< SNVS_SecurityViolation interrupt */ +#define SNVS_Periodic_IRQn 60 /**< SNVS_Periodic interrupt */ +#define SNVS_Button_IRQn 61 /**< SNVS_Button interrupt */ +#define SNVS_Alarm_IRQn 62 /**< Reserved interrupt */ +#define SNVS_PowerOff_IRQn 63 /**< Reserved interrupt */ +#define DSC00_IRQn 64 /**< DSC0 interrupt */ +#define DSC_SCU_IRQn 64 /**< DSC0 interrupt */ +#define DSC_DB_IRQn 65 /**< DSC1 interrupt */ +#define DSC02_IRQn 66 /**< DSC2 interrupt */ +#define DSC03_IRQn 67 /**< DSC3 interrupt */ +#define DSC_HSIO_IRQn 68 /**< DSC4 interrupt */ +#define DSC05_IRQn 69 /**< DSC5 interrupt */ +#define DSC06_IRQn 70 /**< DSC6 interrupt */ +#define DSC_CM4_0_IRQn 71 /**< DSC7 interrupt */ +#define DSC08_IRQn 72 /**< DSC8 interrupt */ +#define DSC09_IRQn 73 /**< DSC9 interrupt */ +#define DSC_LSIO_IRQn 74 /**< DSC10 interrupt */ +#define DSC_GPU_0_IRQn 75 /**< DSC11 interrupt */ +#define DSC_CA35_IRQn 76 /**< DSC12 interrupt */ +#define DSC13_IRQn 77 /**< DSC13 interrupt */ +#define DSC14_IRQn 78 /**< DSC14 interrupt */ +#define DSC15_IRQn 79 /**< DSC15 interrupt */ +#define DSC_Connectivity_IRQn 80 /**< DSC16 interrupt */ +#define DSC17_IRQn 81 /**< DSC17 interrupt */ +#define DSC18_IRQn 82 /**< DSC18 interrupt */ +#define DSC19_IRQn 83 /**< DSC19 interrupt */ +#define DSC_VPU_IRQn 84 /**< DSC20 interrupt */ +#define DSC21_IRQn 85 /**< DSC21 interrupt */ +#define DSC_DRC_0_IRQn 86 /**< DSC22 interrupt */ +#define DSC_DC_0_IRQn 87 /**< DSC23 interrupt */ +#define DSC_MIPI_CSI_0_IRQn 88 /**< DSC24 interrupt */ +#define DSC25_IRQn 89 /**< DSC25 interrupt */ +#define DSC_CI_PI_IRQn 90 /**< DSC26 interrupt */ +#define DSC_Imaging_IRQn 91 /**< DSC27 interrupt */ +#define DSC_ADMA_IRQn 92 /**< DSC28 interrupt */ +#define DSC29_IRQn 93 /**< DSC29 interrupt */ +#define DSC_DI_MIPI_0_IRQn 94 /**< DSC30 interrupt */ +#define DSC_DI_MIPI_1_IRQn 95 /**< DSC31 interrupt */ +#define DSC31_IRQn 95 /**< DSC31 interrupt */ +#define IOMUX31_IRQn 96 /**< IOMUX31 interrupt */ +#define IOMUX30_IRQn 97 /**< IOMUX30 interrupt */ +#define IOMUX29_IRQn 98 /**< IOMUX29 interrupt */ +#define IOMUX28_IRQn 99 /**< IOMUX28 interrupt */ +#define IOMUX27_IRQn 100 /**< IOMUX27 interrupt */ +#define IOMUX26_IRQn 101 /**< IOMUX26 interrupt */ +#define IOMUX25_IRQn 102 /**< IOMUX25 interrupt */ +#define IOMUX24_IRQn 103 /**< IOMUX24 interrupt */ +#define IOMUX23_IRQn 104 /**< IOMUX23 interrupt */ +#define IOMUX22_IRQn 105 /**< IOMUX22 interrupt */ +#define IOMUX21_IRQn 106 /**< IOMUX21 interrupt */ +#define IOMUX20_IRQn 107 /**< IOMUX20 interrupt */ +#define IOMUX19_IRQn 108 /**< IOMUX19 interrupt */ +#define IOMUX18_IRQn 109 /**< IOMUX18 interrupt */ +#define IOMUX17_IRQn 110 /**< IOMUX17 interrupt */ +#define IOMUX16_IRQn 111 /**< IOMUX16 interrupt */ +#define IOMUX15_IRQn 112 /**< IOMUX15 interrupt */ +#define IOMUX14_IRQn 113 /**< IOMUX14 interrupt */ +#define IOMUX13_IRQn 114 /**< IOMUX13 interrupt */ +#define IOMUX12_IRQn 115 /**< IOMUX12 interrupt */ +#define IOMUX11_IRQn 116 /**< IOMUX11 interrupt */ +#define IOMUX10_IRQn 117 /**< IOMUX10 interrupt */ +#define IOMUX9_IRQn 118 /**< IOMUX9 interrupt */ +#define IOMUX8_IRQn 119 /**< IOMUX8 interrupt */ +#define IOMUX7_IRQn 120 /**< IOMUX7 interrupt */ +#define IOMUX6_IRQn 121 /**< IOMUX6 interrupt */ +#define IOMUX5_IRQn 122 /**< IOMUX5 interrupt */ +#define IOMUX4_IRQn 123 /**< IOMUX4 interrupt */ +#define IOMUX3_IRQn 124 /**< IOMUX3 interrupt */ +#define IOMUX2_IRQn 125 /**< IOMUX2 interrupt */ +#define IOMUX1_IRQn 126 /**< IOMUX1 interrupt */ +#define IOMUX0_IRQn 127 /**< IOMUX0 interrupt */ +#define NUM_NVIC_IRQn 128 /**< Number of NVIC interrupts */ + +typedef int IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers */ + + +/* ---------------------------------------------------------------------------- + -- Cortex-M Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex-M Core Configuration + * @{ + */ + +#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 0 /**< Vendor specific implementation of SysTickConfig is defined */ +#define __FPU_PRESENT 1 /**< Defines if an FPU is present or not */ + +#include "core_cm4.h" /* Core Peripheral Access Layer */ +#include "system_MX8QX.h" /* Device specific configuration file */ + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t LDRD (const __IO uint32_t *addr) +{ + union + { + uint32_t w32[2]; + uint64_t w64; + } llr; + + __ASM volatile ("ldrd %0, %1, %2" : "=r" (llr.w32[0]), "=r" (llr.w32[1]) : "Q" (*addr) ); + + return(llr.w64); +} + +/*! + * @} + */ /* end of group Cortex_Core_Configuration */ + +#endif /* MX8QX_H */ + +/* MX8QX.h, eof. */ diff --git a/platform/devices/MX8QX/MX8QX_features.h b/platform/devices/MX8QX/MX8QX_features.h new file mode 100755 index 0000000..1973e5a --- /dev/null +++ b/platform/devices/MX8QX/MX8QX_features.h @@ -0,0 +1,457 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef MX8_FEATURES_H +#define MX8_FEATURES_H + +/* SOC module features */ + +/* @brief ACMP availability on the SoC. */ +#define FSL_FEATURE_SOC_ACMP_COUNT (0U) +/* @brief ADC16 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC16_COUNT (0U) +/* @brief ADC12 availability on the SoC. */ +#define FSL_FEATURE_SOC_ADC12_COUNT (0U) +/* @brief AFE availability on the SoC. */ +#define FSL_FEATURE_SOC_AFE_COUNT (0U) +/* @brief AIPS availability on the SoC. */ +#define FSL_FEATURE_SOC_AIPS_COUNT (0U) +/* @brief AOI availability on the SoC. */ +#define FSL_FEATURE_SOC_AOI_COUNT (0U) +/* @brief AXBS availability on the SoC. */ +#define FSL_FEATURE_SOC_AXBS_COUNT (0U) +/* @brief ASMC availability on the SoC. */ +#define FSL_FEATURE_SOC_ASMC_COUNT (0U) +/* @brief CADC availability on the SoC. */ +#define FSL_FEATURE_SOC_CADC_COUNT (0U) +/* @brief FLEXCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXCAN_COUNT (0U) +/* @brief MMCAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMCAU_COUNT (0U) +/* @brief CMP availability on the SoC. */ +#define FSL_FEATURE_SOC_CMP_COUNT (0U) +/* @brief CMT availability on the SoC. */ +#define FSL_FEATURE_SOC_CMT_COUNT (0U) +/* @brief CNC availability on the SoC. */ +#define FSL_FEATURE_SOC_CNC_COUNT (0U) +/* @brief CRC availability on the SoC. */ +#define FSL_FEATURE_SOC_CRC_COUNT (0U) +/* @brief DAC availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC_COUNT (0U) +/* @brief DAC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_DAC32_COUNT (0U) +/* @brief DCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_DCDC_COUNT (0U) +/* @brief DDR availability on the SoC. */ +#define FSL_FEATURE_SOC_DDR_COUNT (1U) +/* @brief DMA availability on the SoC. */ +#define FSL_FEATURE_SOC_DMA_COUNT (0U) +/* @brief DMAMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_DMAMUX_COUNT (0U) +/* @brief DRY availability on the SoC. */ +#define FSL_FEATURE_SOC_DRY_COUNT (0U) +/* @brief DSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_DSPI_COUNT (0U) +/* @brief EDMA availability on the SoC. */ +#define FSL_FEATURE_SOC_EDMA_COUNT (5U) +/* @brief EMVSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_EMVSIM_COUNT (0U) +/* @brief ENC availability on the SoC. */ +#define FSL_FEATURE_SOC_ENC_COUNT (0U) +/* @brief ENET availability on the SoC. */ +#define FSL_FEATURE_SOC_ENET_COUNT (0U) +/* @brief EWM availability on the SoC. */ +#define FSL_FEATURE_SOC_EWM_COUNT (0U) +/* @brief FB availability on the SoC. */ +#define FSL_FEATURE_SOC_FB_COUNT (0U) +/* @brief FGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FGPIO_COUNT (1U) +/* @brief FLEXIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXIO_COUNT (0U) +/* @brief FMC availability on the SoC. */ +#define FSL_FEATURE_SOC_FMC_COUNT (0U) +/* @brief FSKDT availability on the SoC. */ +#define FSL_FEATURE_SOC_FSKDT_COUNT (0U) +/* @brief FTFA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFA_COUNT (0U) +/* @brief FTFE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFE_COUNT (0U) +/* @brief FTFL availability on the SoC. */ +#define FSL_FEATURE_SOC_FTFL_COUNT (0U) +/* @brief FTM availability on the SoC. */ +#define FSL_FEATURE_SOC_FTM_COUNT (0U) +/* @brief FTMRA availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRA_COUNT (0U) +/* @brief FTMRE availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRE_COUNT (0U) +/* @brief FTMRH availability on the SoC. */ +#define FSL_FEATURE_SOC_FTMRH_COUNT (0U) +/* @brief GPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_GPIO_COUNT (2U) +/* @brief IGPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_IGPIO_COUNT (8U) +/* @brief HSADC availability on the SoC. */ +#define FSL_FEATURE_SOC_HSADC_COUNT (0U) +/* @brief I2C availability on the SoC. */ +#define FSL_FEATURE_SOC_I2C_COUNT (0U) +/* @brief I2S availability on the SoC. */ +#define FSL_FEATURE_SOC_I2S_COUNT (0U) +/* @brief ICS availability on the SoC. */ +#define FSL_FEATURE_SOC_ICS_COUNT (0U) +/* @brief IRQ availability on the SoC. */ +#define FSL_FEATURE_SOC_IRQ_COUNT (0U) +/* @brief INTMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_INTMUX_COUNT (0U) +/* @brief KBI availability on the SoC. */ +#define FSL_FEATURE_SOC_KBI_COUNT (0U) +/* @brief SLCD availability on the SoC. */ +#define FSL_FEATURE_SOC_SLCD_COUNT (0U) +/* @brief LCDC availability on the SoC. */ +#define FSL_FEATURE_SOC_LCDC_COUNT (0U) +/* @brief LDO availability on the SoC. */ +#define FSL_FEATURE_SOC_LDO_COUNT (0U) +/* @brief LLWU availability on the SoC. */ +#define FSL_FEATURE_SOC_LLWU_COUNT (0U) +/* @brief LMEM availability on the SoC. */ +#define FSL_FEATURE_SOC_LMEM_COUNT (1U) +/* @brief LPSCI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSCI_COUNT (0U) +/* @brief LPTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTMR_COUNT (0U) +/* @brief LPTPM availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTPM_COUNT (0U) +/* @brief LPUART availability on the SoC. */ +#define FSL_FEATURE_SOC_LPUART_COUNT (6U) +/* @brief LTC availability on the SoC. */ +#define FSL_FEATURE_SOC_LTC_COUNT (0U) +/* @brief LPI2C availability on the SoC. */ +#define FSL_FEATURE_SOC_LPI2C_COUNT (12U) +/* @brief LPSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSPI_COUNT (0U) +/* @brief LPIT availability on the SoC. */ +#define FSL_FEATURE_SOC_LPIT_COUNT (1U) +/* @brief MC availability on the SoC. */ +#define FSL_FEATURE_SOC_MC_COUNT (0U) +/* @brief MCG availability on the SoC. */ +#define FSL_FEATURE_SOC_MCG_COUNT (0U) +/* @brief MCGLITE availability on the SoC. */ +#define FSL_FEATURE_SOC_MCGLITE_COUNT (0U) +/* @brief MCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MCM_COUNT (0U) +/* @brief MMAU availability on the SoC. */ +#define FSL_FEATURE_SOC_MMAU_COUNT (0U) +/* @brief MMDVSQ availability on the SoC. */ +#define FSL_FEATURE_SOC_MMDVSQ_COUNT (0U) +/* @brief MPU availability on the SoC. */ +#define FSL_FEATURE_SOC_MPU_COUNT (0U) +/* @brief MSCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCAN_COUNT (0U) +/* @brief MSCM availability on the SoC. */ +#define FSL_FEATURE_SOC_MSCM_COUNT (0U) +/* @brief MTB availability on the SoC. */ +#define FSL_FEATURE_SOC_MTB_COUNT (0U) +/* @brief MTBDWT availability on the SoC. */ +#define FSL_FEATURE_SOC_MTBDWT_COUNT (0U) +/* @brief MU availability on the SoC. */ +#define FSL_FEATURE_SOC_MU_COUNT (15U) +/* @brief NFC availability on the SoC. */ +#define FSL_FEATURE_SOC_NFC_COUNT (0U) +/* @brief OPAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_OPAMP_COUNT (0U) +/* @brief OSC availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC_COUNT (0U) +/* @brief OSC32 availability on the SoC. */ +#define FSL_FEATURE_SOC_OSC32_COUNT (0U) +/* @brief OTFAD availability on the SoC. */ +#define FSL_FEATURE_SOC_OTFAD_COUNT (0U) +/* @brief PDB availability on the SoC. */ +#define FSL_FEATURE_SOC_PDB_COUNT (0U) +/* @brief PGA availability on the SoC. */ +#define FSL_FEATURE_SOC_PGA_COUNT (0U) +/* @brief PIT availability on the SoC. */ +#define FSL_FEATURE_SOC_PIT_COUNT (0U) +/* @brief PMC availability on the SoC. */ +#define FSL_FEATURE_SOC_PMC_COUNT (0U) +/* @brief PORT availability on the SoC. */ +#define FSL_FEATURE_SOC_PORT_COUNT (0U) +/* @brief PWM availability on the SoC. */ +#define FSL_FEATURE_SOC_PWM_COUNT (0U) +/* @brief PWT availability on the SoC. */ +#define FSL_FEATURE_SOC_PWT_COUNT (0U) +/* @brief PCC availability on the SoC. */ +#define FSL_FEATURE_SOC_PCC_COUNT (0U) +/* @brief QuadSPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_QuadSPIO_COUNT (0U) +/* @brief RCM availability on the SoC. */ +#define FSL_FEATURE_SOC_RCM_COUNT (0U) +/* @brief RFSYS availability on the SoC. */ +#define FSL_FEATURE_SOC_RFSYS_COUNT (0U) +/* @brief RFVBAT availability on the SoC. */ +#define FSL_FEATURE_SOC_RFVBAT_COUNT (0U) +/* @brief RNG availability on the SoC. */ +#define FSL_FEATURE_SOC_RNG_COUNT (0U) +/* @brief RNGB availability on the SoC. */ +#define FSL_FEATURE_SOC_RNGB_COUNT (0U) +/* @brief ROM availability on the SoC. */ +#define FSL_FEATURE_SOC_ROM_COUNT (0U) +/* @brief RSIM availability on the SoC. */ +#define FSL_FEATURE_SOC_RSIM_COUNT (0U) +/* @brief RTC availability on the SoC. */ +#define FSL_FEATURE_SOC_RTC_COUNT (0U) +/* @brief SCI availability on the SoC. */ +#define FSL_FEATURE_SOC_SCI_COUNT (0U) +/* @brief SDHC availability on the SoC. */ +#define FSL_FEATURE_SOC_SDHC_COUNT (0U) +/* @brief SDRAM availability on the SoC. */ +#define FSL_FEATURE_SOC_SDRAM_COUNT (0U) +/* @brief SIM availability on the SoC. */ +#define FSL_FEATURE_SOC_SIM_COUNT (0U) +/* @brief SMC availability on the SoC. */ +#define FSL_FEATURE_SOC_SMC_COUNT (0U) +/* @brief SNVS availability on the SoC. */ +#define FSL_FEATURE_SOC_SNVS_COUNT (1U) +/* @brief SPI availability on the SoC. */ +#define FSL_FEATURE_SOC_SPI_COUNT (0U) +/* @brief SCG availability on the SoC. */ +#define FSL_FEATURE_SOC_SCG_COUNT (0U) +/* @brief SEMA42 availability on the SoC. */ +#define FSL_FEATURE_SOC_SEMA42_COUNT (0U) +/* @brief STC availability on the SoC. */ +#define FSL_FEATURE_SOC_STC_COUNT (12U) +/* @brief TMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TMR_COUNT (0U) +/* @brief TPM availability on the SoC. */ +#define FSL_FEATURE_SOC_TPM_COUNT (0U) +/* @brief TRIAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_TRIAMP_COUNT (0U) +/* @brief TRNG availability on the SoC. */ +#define FSL_FEATURE_SOC_TRNG_COUNT (0U) +/* @brief TSI availability on the SoC. */ +#define FSL_FEATURE_SOC_TSI_COUNT (0U) +/* @brief TRGMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_TRGMUX_COUNT (0U) +/* @brief TSTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_TSTMR_COUNT (0U) +/* @brief UART availability on the SoC. */ +#define FSL_FEATURE_SOC_UART_COUNT (0U) +/* @brief USB availability on the SoC. */ +#define FSL_FEATURE_SOC_USB_COUNT (0U) +/* @brief USBDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBDCD_COUNT (0U) +/* @brief USBHSDCD availability on the SoC. */ +#define FSL_FEATURE_SOC_USBHSDCD_COUNT (0U) +/* @brief USBPHY availability on the SoC. */ +#define FSL_FEATURE_SOC_USBPHY_COUNT (0U) +/* @brief VREF availability on the SoC. */ +#define FSL_FEATURE_SOC_VREF_COUNT (0U) +/* @brief WDOG availability on the SoC. */ +#define FSL_FEATURE_SOC_WDOG_COUNT (2U) +/* @brief XBAR availability on the SoC. */ +#define FSL_FEATURE_SOC_XBAR_COUNT (0U) +/* @brief XCVR availability on the SoC. */ +#define FSL_FEATURE_SOC_XCVR_COUNT (0U) +/* @brief XRDC availability on the SoC. */ +#define FSL_FEATURE_SOC_XRDC_COUNT (0U) +/* @brief ZLL availability on the SoC. */ +#define FSL_FEATURE_SOC_ZLL_COUNT (0U) + +/* LMEM module features */ + +/* @brief Has process identifier support. */ +#define FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE (1U) + +/* LPUART module features */ + +/* @brief Has receive FIFO overflow detection (bit field CFIFO[RXOFE]). */ +#define FSL_FEATURE_LPUART_HAS_IRQ_EXTENDED_FUNCTIONS (0U) +/* @brief Has low power features (can be enabled in wait mode via register bit C1[DOZEEN] or CTRL[DOZEEN] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_LOW_POWER_UART_SUPPORT (1U) +/* @brief Has extended data register ED (or extra flags in the DATA register if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_HAS_FIFO (1U) +/* @brief Has 32-bit register MODIR */ +#define FSL_FEATURE_LPUART_HAS_MODIR (1U) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT (0U) +/* @brief Infrared (modulation) is supported. */ +#define FSL_FEATURE_LPUART_HAS_IR_SUPPORT (0U) +/* @brief 2 bits long stop bit is available. */ +#define FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT (1U) +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT (1U) +/* @brief Baud rate fine adjustment is available. */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_FINE_ADJUST_SUPPORT (0U) +/* @brief Baud rate oversampling is available (has bit fields C4[OSR], C5[BOTHEDGE], C5[RESYNCDIS] or BAUD[OSR], BAUD[BOTHEDGE], BAUD[RESYNCDIS] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (0U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_RX_RESYNC_SUPPORT (1U) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (0U) +/* @brief Peripheral type. */ +#define FSL_FEATURE_LPUART_IS_SCI (1U) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_FIFO_SIZEn(x) \ + (((x) == LPUART_SC) ? (32) : \ + (((x) == LPUART_MCU_0) ? (32) : \ + (((x) == LPUART_0) ? (64) : \ + (((x) == LPUART_1) ? (64) : \ + (((x) == LPUART_2) ? (64) : \ + (((x) == LPUART_3) ? (64) : (-1))))))) + +/* @brief Maximal data width without parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_NO_PARITY (10U) +/* @brief Maximal data width with parity bit. */ +#define FSL_FEATURE_LPUART_MAX_DATA_WIDTH_WITH_PARITY (9U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING (1U) +/* @brief Has transmitter/receiver DMA enable bits C5[TDMAE]/C5[RDMAE] (or BAUD[TDMAE]/BAUD[RDMAE] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_DMA_ENABLE (0U) +/* @brief Has transmitter/receiver DMA select bits C4[TDMAS]/C4[RDMAS], resp. C5[TDMAS]/C5[RDMAS] if IS_SCI = 0. */ +#define FSL_FEATURE_LPUART_HAS_DMA_SELECT (0U) +/* @brief Data character bit order selection is supported (bit field S2[MSBF] or STAT[MSBF] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BIT_ORDER_SELECT (1U) +/* @brief Has smart card (ISO7816 protocol) support and no improved smart card support. */ +#define FSL_FEATURE_LPUART_HAS_SMART_CARD_SUPPORT (0U) +/* @brief Has improved smart card (ISO7816 protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_IMPROVED_SMART_CARD_SUPPORT (0U) +/* @brief Has local operation network (CEA709.1-B protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_LOCAL_OPERATION_NETWORK_SUPPORT (0U) +/* @brief Has 32-bit registers (BAUD, STAT, CTRL, DATA, MATCH, MODIR) instead of 8-bit (BDH, BDL, C1, S1, D, etc.). */ +#define FSL_FEATURE_LPUART_HAS_32BIT_REGISTERS (1U) +/* @brief Lin break detect available (has bit BDH[LBKDIE]). */ +#define FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT (0U) +/* @brief UART stops in Wait mode available (has bit C1[UARTSWAI]). */ +#define FSL_FEATURE_LPUART_HAS_WAIT_MODE_OPERATION (0U) +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPUART_HAS_SEPARATE_DMA_RX_TX_REQn(x) \ + ((x) == 0 ? (0) : (-1)) +/* @brief Has LPAURT_PARAM. */ +#define FSL_FEATURE_LPUART_HAS_PARAM (1U) +/* @brief Has LPUART_VERID. */ +#define FSL_FEATURE_LPUART_HAS_VERID (1U) +/* @brief Has LPUART_GLOBAL. */ +#define FSL_FEATURE_LPUART_HAS_GLOBAL (1U) +/* @brief Has LPUART_PINCFG. */ +#define FSL_FEATURE_LPUART_HAS_PINCFG (1U) +#define FSL_FEATURE_LPUART0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART6_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART7_HAS_NO_IRQ (1U) +#define FSL_FEATURE_LPUART8_HAS_NO_IRQ (1U) + +/* MU module features */ + +/* @brief MU side for current core */ +#define FSL_FEATURE_MU_SIDE_A (0U) +#define FSL_FEATURE_MU_NO_RSTH (1U) +#define FSL_FEATURE_MU_NO_HR (1U) + +/* WDOG module features */ + +/* @brief Watchdog is available. */ +#define FSL_FEATURE_WDOG_HAS_WATCHDOG (1U) +/* @brief WDOG_CNT can be 32-bit written. */ +#define FSL_FEATURE_WDOG_HAS_32BIT_ACCESS (1U) + +/* LPI2C module features */ + +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPI2C_FIFO_SIZEn(x) (4U) + +#define FSL_FEATURE_I2C_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C0_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C1_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C2_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C3_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C4_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C5_HAS_NO_IRQ (1U) +#define FSL_FEATURE_I2C6_HAS_NO_IRQ (1U) + +/* PORT module features */ + +#define FSL_FEATURE_PORT_HAS_NO_INTERRUPT (1U) + +/* GPIO module features */ + +#define FSL_FEATURE_GPIO_HAS_NO_INTERRUPT (1U) + +/* PAD module features */ + +/* @brief Pads are for 28LPP. */ +#define FSL_FEATURE_PAD_HAS_28LPP (0U) +/* @brief Pads are for 28FDSOI. */ +#define FSL_FEATURE_PAD_HAS_28FDSOI (1U) + +/* SECO module features */ + +/* @brief SECO protocol version */ +#define FSL_FEATURE_SECO_VER (2U) + +/* OTP module features */ +#define FSL_FEATURE_OTP_16K_1H_OFS_START (16U) +#define FSL_FEATURE_OTP_16K_1H_OFS_END (271U) +#define FSL_FEATURE_OTP_16K_2H_OFS_START (544U) +#define FSL_FEATURE_OTP_16K_2H_OFS_END (799U) + +/* CSR module features */ +#define FSL_FEATURE_CSR_HAS_CSR (0U) +#define FSL_FEATURE_CSR_HAS_CSR2 (1U) +#define FSL_FEATURE_CSR_HAS_CSR3 (1U) +#define FSL_FEATURE_CSR_HAS_LPCG (0U) + +#define FSL_FEATURE_DPLL_VER (18U) +#define FSL_FEATURE_AV_PLL_ENABLE_ALT (0U) + +#define FSL_FEATURE_PCIE_DPLL_SS (0U) + +/* DSC config */ +#define FSL_FEATURE_DSC_SSSLICE_CNT (8U) +#define FSL_FEATURE_DSC_SLSLICE_CNT (17U) +#define FSL_FEATURE_DSC_CSLICE_CNT (1U) +#define FSL_FEATURE_DSC_GPR_CTRL_CNT (3U) + +#endif /* MX8_FEATURES_H */ + diff --git a/platform/devices/MX8QX/MX8QX_fuse_map.h b/platform/devices/MX8QX/MX8QX_fuse_map.h new file mode 100755 index 0000000..2a73506 --- /dev/null +++ b/platform/devices/MX8QX/MX8QX_fuse_map.h @@ -0,0 +1,292 @@ +/* +** ################################################################### +** Processors: MX8QX +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8QX +** +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_FUSES_H +#define HW_FUSES_H + +/******************************************************************************* + * Macros + ******************************************************************************/ +#if !defined(NO_DEVICE_ACCESS) + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + ((((uint32_t)(OTP->FUSE[(_REG)].RW)) >> (SHFT)) & (MSK)) +#else + #define OTP_GET_FUSE_STATE(_REG, SHFT, MSK) \ + (((temp_fuses[(_REG)]) >> (SHFT)) & (MSK)) +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define OTP_CAAM_DIS OTP_GET_FUSE_STATE(0x003U, 0U, 0x00000001U) +#define OTP_IEE_DIS OTP_GET_FUSE_STATE(0x003U, 1U, 0x00000001U) +#define OTP_DTCP_DIS OTP_GET_FUSE_STATE(0x003U, 2U, 0x00000001U) +#define OTP_MMCAU_DIS OTP_GET_FUSE_STATE(0x003U, 4U, 0x00000001U) +#define OTP_ARM_CRYPT_EXT OTP_GET_FUSE_STATE(0x003U, 5U, 0x00000001U) +#define OTP_SNVS_DIS OTP_GET_FUSE_STATE(0x003U, 10U, 0x00000001U) +#define OTP_SECO_CLOSED_83 OTP_GET_FUSE_STATE(0x003U, 12U, 0x00000001U) +#define OTP_SECO_SECURED_83 OTP_GET_FUSE_STATE(0x003U, 13U, 0x00000001U) +#define OTP_ATTEST_DIS OTP_GET_FUSE_STATE(0x003U, 14U, 0x00000001U) +#define OTP_PUF_ENB OTP_GET_FUSE_STATE(0x003U, 15U, 0x00000001U) +#define OTP_FUSE_LIFE_CYCLE OTP_GET_FUSE_STATE(0x004U, 0U, 0x000003FFU) +#define OTP_SDP_DIS OTP_GET_FUSE_STATE(0x004U, 10U, 0x00000001U) +#define OTP_SDP_W_ONLY OTP_GET_FUSE_STATE(0x004U, 11U, 0x00000001U) +#define OTP_SREV_XOR OTP_GET_FUSE_STATE(0x004U, 12U, 0x00000007U) +#define OTP_SREV_ROM OTP_GET_FUSE_STATE(0x004U, 15U, 0x00000001U) +#define OTP_SJC_DIS OTP_GET_FUSE_STATE(0x005U, 0U, 0x00000001U) +#define OTP_JTAG_SEC_MODE OTP_GET_FUSE_STATE(0x005U, 1U, 0x00000003U) +#define OTP_TZ_DBG_DIS OTP_GET_FUSE_STATE(0x005U, 3U, 0x00000001U) +#define OTP_OEM_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 5U, 0x00000003U) +#define OTP_SCU_SEC_CONFIG OTP_GET_FUSE_STATE(0x005U, 7U, 0x00000003U) +#define OTP_SECO_GLITCH_DET OTP_GET_FUSE_STATE(0x005U, 9U, 0x00000001U) +#define OTP_OTP_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 10U, 0x00000001U) +#define OTP_TZ_CHLG_RESP_DIS OTP_GET_FUSE_STATE(0x005U, 11U, 0x00000001U) +#define OTP_ARRAY_IS_PROG OTP_GET_FUSE_STATE(0x005U, 15U, 0x00000001U) +#define OTP_AP_2_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x0000000FU) +#define OTP_AP_2_0_DIS OTP_GET_FUSE_STATE(0x006U, 0U, 0x00000001U) +#define OTP_AP_2_1_DIS OTP_GET_FUSE_STATE(0x006U, 1U, 0x00000001U) +#define OTP_AP_2_2_DIS OTP_GET_FUSE_STATE(0x006U, 2U, 0x00000001U) +#define OTP_AP_2_3_DIS OTP_GET_FUSE_STATE(0x006U, 3U, 0x00000001U) +#define OTP_AP_2_MAX_FREQ OTP_GET_FUSE_STATE(0x006U, 8U, 0x0000000FU) +#define OTP_TEMP_GRADE OTP_GET_FUSE_STATE(0x006U, 12U, 0x00000003U) +#define OTP_GPU_0_DIS OTP_GET_FUSE_STATE(0x007U, 0U, 0x00000001U) +#define OTP_GPU_MAX_FREQ OTP_GET_FUSE_STATE(0x007U, 4U, 0x0000000FU) +#define OTP_DC_0_DIS OTP_GET_FUSE_STATE(0x007U, 8U, 0x00000003U) +#define OTP_VPU_DIS OTP_GET_FUSE_STATE(0x007U, 12U, 0x0000000FU) +#define OTP_VPU_ENC0_DIS OTP_GET_FUSE_STATE(0x007U, 12U, 0x00000001U) +#define OTP_VPU_ENC1_DIS OTP_GET_FUSE_STATE(0x007U, 13U, 0x00000001U) +#define OTP_VPU_DEC_DIS OTP_GET_FUSE_STATE(0x007U, 14U, 0x00000003U) +#define OTP_DSP_DIS OTP_GET_FUSE_STATE(0x008U, 0U, 0x00000001U) +#define OTP_MCU_0_DIS OTP_GET_FUSE_STATE(0x008U, 1U, 0x00000001U) +#define OTP_SATA_DIS OTP_GET_FUSE_STATE(0x008U, 4U, 0x00000001U) +#define OTP_PCIE_B_DIS OTP_GET_FUSE_STATE(0x008U, 5U, 0x00000001U) +#define OTP_PCIE_A_DIS OTP_GET_FUSE_STATE(0x008U, 6U, 0x00000001U) +#define OTP_USB2_1_DIS OTP_GET_FUSE_STATE(0x008U, 8U, 0x00000001U) +#define OTP_USB2_2_OTG_DIS OTP_GET_FUSE_STATE(0x008U, 9U, 0x00000001U) +#define OTP_USB_SS_DIS OTP_GET_FUSE_STATE(0x008U, 10U, 0x00000001U) +#define OTP_USB2_3_OTG_DIS OTP_GET_FUSE_STATE(0x008U, 11U, 0x00000001U) +#define OTP_ETH_0_DIS OTP_GET_FUSE_STATE(0x008U, 12U, 0x00000001U) +#define OTP_ETH_1_DIS OTP_GET_FUSE_STATE(0x008U, 13U, 0x00000001U) +#define OTP_MIPI_0_DIS OTP_GET_FUSE_STATE(0x009U, 1U, 0x00000001U) +#define OTP_MIPI_1_DIS OTP_GET_FUSE_STATE(0x009U, 2U, 0x00000001U) +#define OTP_CSI_0_DIS OTP_GET_FUSE_STATE(0x009U, 5U, 0x00000001U) +#define OTP_CSI_1_DIS OTP_GET_FUSE_STATE(0x009U, 6U, 0x00000001U) +#define OTP_CSI_2_DIS OTP_GET_FUSE_STATE(0x009U, 7U, 0x00000001U) +#define OTP_DRC_0_DIS OTP_GET_FUSE_STATE(0x009U, 8U, 0x0000000FU) +#define OTP_CAN_DIS OTP_GET_FUSE_STATE(0x00AU, 0U, 0x00000001U) +#define OTP_ENET1_FREQ_LIMIT OTP_GET_FUSE_STATE(0x00AU, 1U, 0x00000001U) +#define OTP_ENET2_FREQ_LIMIT OTP_GET_FUSE_STATE(0x00AU, 2U, 0x00000001U) +#define OTP_FIPS_MODE OTP_GET_FUSE_STATE(0x00AU, 3U, 0x00000001U) +#define OTP_FIPS_MODE_DIS OTP_GET_FUSE_STATE(0x00AU, 4U, 0x00000001U) + +#define OTP_EARLY_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 0U, 0x00000001U) +#define OTP_SCU_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 1U, 0x00000001U) +#define OTP_ALL_FUS_PROG OTP_GET_FUSE_STATE(0x00EU, 2U, 0x00000001U) +#define OTP_SECO_OPEN_8E OTP_GET_FUSE_STATE(0x00EU, 3U, 0x00000001U) +#define OTP_SECO_CLOSED_8E OTP_GET_FUSE_STATE(0x00EU, 4U, 0x00000001U) +#define OTP_SECO_SECURED_8E OTP_GET_FUSE_STATE(0x00EU, 5U, 0x00000001U) +#define OTP_ROM_INF_LOOP OTP_GET_FUSE_STATE(0x00EU, 8U, 0x00000001U) +#define OTP_BT_DIR_DIS OTP_GET_FUSE_STATE(0x00EU, 9U, 0x00000001U) +#define OTP_ROM_CONT_BITS OTP_GET_FUSE_STATE(0x00EU, 10U, 0x0000001FU) +#define OTP_SHELF_MODE OTP_GET_FUSE_STATE(0x00EU, 15U, 0x00000001U) + +/******************************************************************************* + * Trim & other fuses + ******************************************************************************/ + +#define OTP_UNIQUE_ID_L OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_UNIQUE_ID_H OTP_GET_FUSE_STATE(0x011U, 0U, 0xFFFFFFFFU) + +#define OTP_LOT_NO_ENC_L OTP_GET_FUSE_STATE(0x010U, 0U, 0xFFFFFFFFU) +#define OTP_LOT_NO_ENC_H OTP_GET_FUSE_STATE(0x011U, 0U, 0x000007FFU) +#define OTP_WAFER_NO OTP_GET_FUSE_STATE(0x011U, 11U, 0x0000001FU) +#define OTP_DIE_Y_COORD OTP_GET_FUSE_STATE(0x011U, 16U, 0x000000FFU) +#define OTP_DIE_X_COORD OTP_GET_FUSE_STATE(0x011U, 24U, 0x000000FFU) + +#define OTP_BT_MODE_FUS OTP_GET_FUSE_STATE(0x012U, 0U, 0x0000003FU) +#define OTP_BT_FUS_SEL OTP_GET_FUSE_STATE(0x012U, 6U, 0x00000001U) +#define OTP_BT_FORCE_COLD OTP_GET_FUSE_STATE(0x012U, 7U, 0x00000001U) + +#define OTP_WDOG_EN OTP_GET_FUSE_STATE(0x012U, 8U, 0x00000001U) +#define OTP_WDOG_TO OTP_GET_FUSE_STATE(0x012U, 9U, 0x00000003U) +#define OTP_SCU_DCACHE_DIS OTP_GET_FUSE_STATE(0x012U, 11U, 0x00000001U) +#define OTP_SCU_ICACHE_DIS OTP_GET_FUSE_STATE(0x012U, 12U, 0x00000001U) +#define OTP_AP_MMU_DCACHE_DIS OTP_GET_FUSE_STATE(0x012U, 13U, 0x00000001U) +#define OTP_AP_ICACHE_DIS OTP_GET_FUSE_STATE(0x012U, 14U, 0x00000001U) +#define OTP_SDMMC_MAN_DIS OTP_GET_FUSE_STATE(0x012U, 18U, 0x00000001U) +#define OTP_REC_BOOT_EN OTP_GET_FUSE_STATE(0x012U, 19U, 0x00000001U) +#define OTP_SCU_BT_F_GPIO_SEL OTP_GET_FUSE_STATE(0x012U, 20U, 0x00000007U) +#define OTP_SCU_BT_F_IND OTP_GET_FUSE_STATE(0x012U, 23U, 0x00000001U) +#define OTP_FLEXSPI_DLL OTP_GET_FUSE_STATE(0x012U, 24U, 0x0000000FU) +#define OTP_OVR_NAND OTP_GET_FUSE_STATE(0x012U, 28U, 0x00000001U) +#define OTP_OVR_NAND_VAL OTP_GET_FUSE_STATE(0x012U, 29U, 0x00000001U) +#define OTP_OVR_FLX_SPI OTP_GET_FUSE_STATE(0x012U, 30U, 0x00000001U) +#define OTP_OVR_FLX_SPI_VAL OTP_GET_FUSE_STATE(0x012U, 31U, 0x00000001U) +#define OTP_FAST_BOOT OTP_GET_FUSE_STATE(0x013U, 0U, 0x00000001U) +#define OTP_FAST_BOOT_ACK OTP_GET_FUSE_STATE(0x013U, 1U, 0x00000001U) +#define OTP_USDHC_BT_SPD OTP_GET_FUSE_STATE(0x013U, 2U, 0x00000003U) +#define OTP_MMC_BUS_W OTP_GET_FUSE_STATE(0x013U, 4U, 0x00000003U) +#define OTP_FAST_FRZ_DIS OTP_GET_FUSE_STATE(0x013U, 6U, 0x00000001U) + +#define OTP_USDHC_CYC_DLY OTP_GET_FUSE_STATE(0x013U, 8U, 0x00000001U) +#define OTP_USDHC_CYC_INT OTP_GET_FUSE_STATE(0x013U, 9U, 0x00000001U) +#define OTP_USDHC_CYC_EN OTP_GET_FUSE_STATE(0x013U, 10U, 0x00000001U) +#define OTP_USDHC_DLL_EN OTP_GET_FUSE_STATE(0x013U, 11U, 0x00000001U) +#define OTP_SD_LOOPBCK OTP_GET_FUSE_STATE(0x013U, 12U, 0x00000001U) +#define OTP_USDHC_PD_PULLDWN OTP_GET_FUSE_STATE(0x013U, 13U, 0x00000001U) +#define OTP_SD_CAL_STEP OTP_GET_FUSE_STATE(0x013U, 14U, 0x00000003U) +#define OTP_USDHC_DLL_DLY OTP_GET_FUSE_STATE(0x013U, 16U, 0x0000007FU) +#define OTP_USDHC_DLL_SEL OTP_GET_FUSE_STATE(0x013U, 23U, 0x00000001U) +#define OTP_USDHC_PD_SET_OVR OTP_GET_FUSE_STATE(0x013U, 24U, 0x00000007U) +#define OTP_NAND_PD_SET_OVR OTP_GET_FUSE_STATE(0x013U, 27U, 0x00000007U) +#define OTP_CS_NUM_NAND OTP_GET_FUSE_STATE(0x013U, 30U, 0x00000003U) + +#define OTP_DBGEN_DBGEN OTP_GET_FUSE_STATE(0x016U, 0U, 0x000000FFU) +#define OTP_DBGEN_NIDEN OTP_GET_FUSE_STATE(0x016U, 8U, 0x000000FFU) +#define OTP_DBGEN_SPIDEN OTP_GET_FUSE_STATE(0x016U, 16U, 0x000000FFU) +#define OTP_DBGEN_SPNIDEN OTP_GET_FUSE_STATE(0x016U, 24U, 0x000000FFU) + +#define OTP_DPLL_CALIB_V2 OTP_GET_FUSE_STATE(0x01BU, 3U, 0x00000001U) +#define OTP_KS1_07V_SUPPORT OTP_GET_FUSE_STATE(0x01BU, 6U, 0x00000001U) + +#define OTP_OSC_CAP_TRIM OTP_GET_FUSE_STATE(0x01EU, 0U, 0x0000000FU) +#define OTP_TMP_MON_TRM_LO OTP_GET_FUSE_STATE(0x01EU, 4U, 0x0000003FU) +#define OTP_TMP_MON_TRM_HI OTP_GET_FUSE_STATE(0x01EU, 10U, 0x0000003FU) +#define OTP_TMP_MON_TRM_SHLF_LO OTP_GET_FUSE_STATE(0x01EU, 20U, 0x0000003FU) +#define OTP_TMP_MON_TRM_SHLF_HI OTP_GET_FUSE_STATE(0x01EU, 26U, 0x0000003FU) +#define OTP_BANDGAP_TRM OTP_GET_FUSE_STATE(0x01FU, 0U, 0x0000001FU) +#define OTP_32K_INT_IRC_TRM OTP_GET_FUSE_STATE(0x01FU, 5U, 0x0000001FU) +#define OTP_CLK_MON_TRM_LO OTP_GET_FUSE_STATE(0x01FU, 10U, 0x0000000FU) +#define OTP_CLK_MON_TRM_HI OTP_GET_FUSE_STATE(0x01FU, 14U, 0x0000000FU) +#define OTP_V_MON_TRM_LO OTP_GET_FUSE_STATE(0x01FU, 18U, 0x0000000FU) +#define OTP_V_MON_TRM_HI OTP_GET_FUSE_STATE(0x01FU, 22U, 0x0000000FU) +#define OTP_V_MON_TAM_DIS OTP_GET_FUSE_STATE(0x01FU, 26U, 0x00000001U) +#define OTP_CLK_MON_DIS OTP_GET_FUSE_STATE(0x01FU, 27U, 0x00000001U) +#define OTP_TMP_MON_DIS OTP_GET_FUSE_STATE(0x01FU, 28U, 0x00000001U) +#define OTP_SNVS_C_V_TRM OTP_GET_FUSE_STATE(0x01FU, 30U, 0x00000003U) + +#define OTP_SCU_REFGEN OTP_GET_FUSE_STATE(0x064U, 0U, 0x000000FFU) +#define OTP_AP_2_REFGEN OTP_GET_FUSE_STATE(0x064U, 8U, 0x000000FFU) +#define OTP_DRC_REFGEN OTP_GET_FUSE_STATE(0x064U, 24U, 0x000000FFU) +#define OTP_GPU_0_REFGEN OTP_GET_FUSE_STATE(0x065U, 8U, 0x000000FFU) +#define OTP_ADMA_REFGEN OTP_GET_FUSE_STATE(0x065U, 24U, 0x000000FFU) +#define OTP_CONN_REFGEN OTP_GET_FUSE_STATE(0x066U, 0U, 0x000000FFU) +#define OTP_HSIO_REFGEN OTP_GET_FUSE_STATE(0x066U, 24U, 0x000000FFU) + +#define OTP_USB_PHY_TRM OTP_GET_FUSE_STATE(0x067U, 0U, 0x000FFFFFU) +#define OTP_CSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x069U, 8U, 0x00000003U) +#define OTP_DSI_0_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 20U, 0x00000003U) +#define OTP_DSI_1_RCAL_TRIM OTP_GET_FUSE_STATE(0x067U, 22U, 0x00000003U) + +#define OTP_TMP_SENS_SCU OTP_GET_FUSE_STATE(0x06AU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_3 OTP_GET_FUSE_STATE(0x06AU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_4 OTP_GET_FUSE_STATE(0x06AU, 22U, 0x000003FFU) +#define OTP_TMP_SENS_DRC0 OTP_GET_FUSE_STATE(0x06BU, 2U, 0x000003FFU) +#define OTP_TMP_SENS_6 OTP_GET_FUSE_STATE(0x06BU, 12U, 0x000003FFU) +#define OTP_TMP_SENS_7 OTP_GET_FUSE_STATE(0x06BU, 22U, 0x000003FFU) + +#define OTP_ROM_PATCH 0x070U +#define OTP_ROM_PATCH_SIZE 62U +#define OTP_V2X_PATCH_SIZE 0U + +#define OTP_DERATE_DLL_FRQ OTP_GET_FUSE_STATE(0x0AEU, 0U, 0x00000001U) +#define OTP_EXT_OSC_SEL OTP_GET_FUSE_STATE(0x0AEU, 1U, 0x00000001U) +#define OTP_USE_INT_OSC OTP_GET_FUSE_STATE(0x0AEU, 2U, 0x00000001U) +#define OTP_SINGLE_END_CLK OTP_GET_FUSE_STATE(0x0AEU, 3U, 0x00000001U) + +#define OTP_24MHZ_REGH_LV OTP_GET_FUSE_STATE(0x100U, 0U, 0x00000007U) +#define OTP_24MHZ_REGL_LV OTP_GET_FUSE_STATE(0x100U, 3U, 0x00000007U) +#define OTP_ROSC_FREQ_OFF OTP_GET_FUSE_STATE(0x100U, 8U, 0x00FFFFFFU) + +#define OTP_DPLL_TRM OTP_GET_FUSE_STATE(0x101U, 0U, 0xFFFFFFFFU) +#define OTP_DPLL_TRM_VALID OTP_GET_FUSE_STATE(0x101U, 0U, 0x00800000U) + +#define OTP_24MHZ_DIFF_VALID OTP_GET_FUSE_STATE(0x102U, 31U, 0x00000001U) +#define OTP_24MHZ_DIFF_DRV0 OTP_GET_FUSE_STATE(0x102U, 0U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV1 OTP_GET_FUSE_STATE(0x102U, 4U, 0x00000003U) +#define OTP_24MHZ_DIFF_TERM_RES OTP_GET_FUSE_STATE(0x102U, 8U, 0x00000003U) +#define OTP_24MHZ_DIFF_DRV_IN OTP_GET_FUSE_STATE(0x102U, 10U, 0x00000003U) +#define OTP_24MHZ_DIFF_SQRUP OTP_GET_FUSE_STATE(0x102U, 12U, 0x00000003U) +#define OTP_SCU_REG_TRIM OTP_GET_FUSE_STATE(0x102U, 16U, 0x00000007U) +#define OTP_VPU_REG0_TRIM OTP_GET_FUSE_STATE(0x102U, 19U, 0x00000007U) +#define OTP_VPU_REG1_TRIM OTP_GET_FUSE_STATE(0x102U, 22U, 0x00000007U) + +#define OTP_DSI_0_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 0U, 0x00000007U) +#define OTP_DSI_0_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 3U, 0x00000007U) +#define OTP_DSI_0_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 6U, 0x00000007U) +#define OTP_DSI_0_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 9U, 0x00000007U) +#define OTP_DSI_0_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 12U, 0x00000007U) +#define OTP_DSI_1_VOH_CLK_TRIM OTP_GET_FUSE_STATE(0x103U, 16U, 0x00000007U) +#define OTP_DSI_1_VOH_D3_TRIM OTP_GET_FUSE_STATE(0x103U, 19U, 0x00000007U) +#define OTP_DSI_1_VOH_D2_TRIM OTP_GET_FUSE_STATE(0x103U, 22U, 0x00000007U) +#define OTP_DSI_1_VOH_D1_TRIM OTP_GET_FUSE_STATE(0x103U, 25U, 0x00000007U) +#define OTP_DSI_1_VOH_D0_TRIM OTP_GET_FUSE_STATE(0x103U, 28U, 0x00000007U) + +#define OTP_ROM_LITERAL 0x10CU +#define OTP_ROM_LITERAL_SIZE 4U + +#define OTP_24MHZ_CL_TUNE_VALID OTP_GET_FUSE_STATE(0x1F0U, 31U, 0x00000001U) +#define OTP_24MHZ_CL_TUNE_LV OTP_GET_FUSE_STATE(0x1F0U, 0U, 0x000000FFU) + +#define OTP_DPLL_TABLE_SELECT_VALID OTP_GET_FUSE_STATE(0x1FDU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_SELECT_BITS OTP_GET_FUSE_STATE(0x1FDU, 0U, 0x003FFFFFU) + +#define OTP_DPLL_TABLE_0_VALID OTP_GET_FUSE_STATE(0x1FEU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_0_V6 OTP_GET_FUSE_STATE(0x1FEU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V5 OTP_GET_FUSE_STATE(0x1FEU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V4 OTP_GET_FUSE_STATE(0x1FEU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V3 OTP_GET_FUSE_STATE(0x1FEU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V2 OTP_GET_FUSE_STATE(0x1FEU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_0_V1 OTP_GET_FUSE_STATE(0x1FEU, 0U, 0x0000003FU) + +#define OTP_DPLL_TABLE_1_VALID OTP_GET_FUSE_STATE(0x1FFU, 31U, 0x00000001U) +#define OTP_DPLL_TABLE_1_V6 OTP_GET_FUSE_STATE(0x1FFU, 26U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V5 OTP_GET_FUSE_STATE(0x1FFU, 21U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V4 OTP_GET_FUSE_STATE(0x1FFU, 16U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V3 OTP_GET_FUSE_STATE(0x1FFU, 11U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V2 OTP_GET_FUSE_STATE(0x1FFU, 6U, 0x0000001FU) +#define OTP_DPLL_TABLE_1_V1 OTP_GET_FUSE_STATE(0x1FFU, 0U, 0x0000003FU) + +#define OTP_TMP_SENS_SCU_OFS OTP_GET_FUSE_STATE(0x1F1U, 0U, 0x000000FFU) +#define OTP_TMP_SENS_DRC0_OFS OTP_GET_FUSE_STATE(0x1F1U, 8U, 0x000000FFU) + +#endif /* HW_FUSES_H */ + diff --git a/platform/devices/MX8QX/MX8QX_otp.h b/platform/devices/MX8QX/MX8QX_otp.h new file mode 100755 index 0000000..9145340 --- /dev/null +++ b/platform/devices/MX8QX/MX8QX_otp.h @@ -0,0 +1,318 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* + * WARNING! DO NOT EDIT THIS FILE DIRECTLY! + * + * This file was generated automatically and any changes may be lost. + */ +#ifndef HW_OTP_REGISTERS_H +#define HW_OTP_REGISTERS_H + +/* ---------------------------------------------------------------------------- + -- OTP Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Peripheral_Access_Layer OTP Peripheral Access Layer + * @{ + */ + +/** OTP - Register Layout Typedef */ +typedef struct +{ + __IO uint32_t RW; + __IO uint32_t SET; + __IO uint32_t CLR; + __IO uint32_t TOG; +} OTP_Reg; + +typedef struct +{ + OTP_Reg CTRL; + OTP_Reg PDN; + OTP_Reg DATA; + OTP_Reg READ_CTRL; + OTP_Reg READ_FUSE_DATA; + OTP_Reg SW_STICKY; + OTP_Reg SCS; + OTP_Reg CRC_ADDR; + OTP_Reg CRC_VALUE; + OTP_Reg STATUS; + __I uint32_t STARTWORD; + uint8_t RESERVED_0[12]; + __I uint32_t VERSION; + uint8_t RESERVED_1[1356]; + struct { + __I uint32_t RW; + __I uint32_t SET; + __I uint32_t CLR; + __I uint32_t TOG; + } LOCKED[17]; + uint8_t RESERVED_3[240]; + OTP_Reg FUSE[528]; +} OTP_Type; + +/* ---------------------------------------------------------------------------- + -- OTP Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OTP_Register_Masks OTP Register Masks + * @{ + */ + +/*! @name OTP Register */ +#define OTP_BIT0_MASK (0x00000001U) +#define OTP_BIT0_SHIFT (0U) +#define OTP_BIT0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT1_MASK (0x00000002U) +#define OTP_BIT1_SHIFT (1U) +#define OTP_BIT1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT2_MASK (0x00000004U) +#define OTP_BIT2_SHIFT (2U) +#define OTP_BIT2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT3_MASK (0x00000008U) +#define OTP_BIT3_SHIFT (3U) +#define OTP_BIT3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT4_MASK (0x00000010U) +#define OTP_BIT4_SHIFT (4U) +#define OTP_BIT4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT5_MASK (0x00000020U) +#define OTP_BIT5_SHIFT (5U) +#define OTP_BIT5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT6_MASK (0x00000040U) +#define OTP_BIT6_SHIFT (6U) +#define OTP_BIT6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT7_MASK (0x00000080U) +#define OTP_BIT7_SHIFT (7U) +#define OTP_BIT7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT8_MASK (0x00000100U) +#define OTP_BIT8_SHIFT (8U) +#define OTP_BIT8(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT9_MASK (0x00000200U) +#define OTP_BIT9_SHIFT (9U) +#define OTP_BIT9(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT10_MASK (0x00000400U) +#define OTP_BIT10_SHIFT (10U) +#define OTP_BIT10(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT11_MASK (0x00000800U) +#define OTP_BIT11_SHIFT (11U) +#define OTP_BIT11(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT12_MASK (0x00001000U) +#define OTP_BIT12_SHIFT (12U) +#define OTP_BIT12(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT13_MASK (0x00002000U) +#define OTP_BIT13_SHIFT (13U) +#define OTP_BIT13(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT14_MASK (0x00004000U) +#define OTP_BIT14_SHIFT (14U) +#define OTP_BIT14(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT15_MASK (0x00008000U) +#define OTP_BIT15_SHIFT (15U) +#define OTP_BIT15(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT16_MASK (0x00010000U) +#define OTP_BIT16_SHIFT (16U) +#define OTP_BIT16(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT17_MASK (0x00020000U) +#define OTP_BIT17_SHIFT (17U) +#define OTP_BIT17(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT18_MASK (0x00040000U) +#define OTP_BIT18_SHIFT (18U) +#define OTP_BIT18(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT19_MASK (0x00080000U) +#define OTP_BIT19_SHIFT (19U) +#define OTP_BIT19(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT20_MASK (0x00100000U) +#define OTP_BIT20_SHIFT (20U) +#define OTP_BIT20(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT21_ASK (0x00200000U) +#define OTP_BIT21_SHIFT (21U) +#define OTP_BIT21(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT22_MASK (0x00400000U) +#define OTP_BIT22_SHIFT (22U) +#define OTP_BIT22(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT23_MASK (0x00800000U) +#define OTP_BIT23_SHIFT (23U) +#define OTP_BIT23(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT24_MASK (0x01000000U) +#define OTP_BIT24_SHIFT (24U) +#define OTP_BIT24(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT25_MASK (0x02000000U) +#define OTP_BIT25_SHIFT (25U) +#define OTP_BIT25(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT26_MASK (0x04000000U) +#define OTP_BIT26_SHIFT (26U) +#define OTP_BIT26(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT27_MASK (0x08000000U) +#define OTP_BIT27_SHIFT (27U) +#define OTP_BIT27(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT28_MASK (0x10000000U) +#define OTP_BIT28_SHIFT (28U) +#define OTP_BIT28(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT29_MASK (0x20000000U) +#define OTP_BIT29_SHIFT (29U) +#define OTP_BIT29(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT30_MASK (0x40000000U) +#define OTP_BIT30_SHIFT (30U) +#define OTP_BIT30(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_BIT31_MASK (0x80000000U) +#define OTP_BIT31_SHIFT (31U) +#define OTP_BIT31(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE0_MASK (0x0000000FU) +#define OTP_NIBBLE0_SHIFT (0U) +#define OTP_NIBBLE0(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE1_MASK (0x000000F0U) +#define OTP_NIBBLE1_SHIFT (4U) +#define OTP_NIBBLE1(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE2_MASK (0x00000F00U) +#define OTP_NIBBLE2_SHIFT (8U) +#define OTP_NIBBLE2(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE3_MASK (0x0000F000U) +#define OTP_NIBBLE3_SHIFT (12U) +#define OTP_NIBBLE3(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE4_MASK (0x000F0000U) +#define OTP_NIBBLE4_SHIFT (16U) +#define OTP_NIBBLE4(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE5_MASK (0x00F00000U) +#define OTP_NIBBLE5_SHIFT (20U) +#define OTP_NIBBLE5(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE6_MASK (0x0F000000U) +#define OTP_NIBBLE6_SHIFT (24U) +#define OTP_NIBBLE6(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! @name OTP Register */ +#define OTP_NIBBLE7_MASK (0xF0000000U) +#define OTP_NIBBLE7_SHIFT (28U) +#define OTP_NIBBLE7(x) (((uint32_t)(((uint32_t)(x)) << OTP_PDOR_PDO_SHIFT)) & OTP_PDOR_PDO_MASK) + +/*! + * @} + */ /* end of group OTP_Register_Masks */ + +/* OTP - Peripheral instance base addresses */ +/** Peripheral OTPA base pointer */ +#define OTP ((OTP_Type *)OTP_BASE) +/** Array initializer of OTP peripheral base addresses */ +#define OTP_BASE_ADDRS { OTP_BASE } +/** Array initializer of OTP peripheral base pointers */ +#define OTP_BASE_PTRS { OTP } + +/*! + * @} + */ /* end of group OTP_Peripheral_Access_Layer */ + +#endif /* HW_OTP_REGISTERS_H */ diff --git a/platform/devices/MX8QX/Makefile b/platform/devices/MX8QX/Makefile new file mode 100755 index 0000000..4cba83b --- /dev/null +++ b/platform/devices/MX8QX/Makefile @@ -0,0 +1,14 @@ + +objs_mx8 := system_MX8QX.o handlers_MX8QX.o + +ifdef ROM +objs_mx8 += gcc/startup_rom_MX8QX.o +else +objs_mx8 += gcc/startup_MX8QX.o +endif + +OBJS += \ + $(foreach object,$(objs_mx8),$(OUT)/devices/MX8QX/$(object)) + +DIRS += $(OUT)/devices/MX8QX/gcc + diff --git a/platform/devices/MX8QX/fsl_clock.h b/platform/devices/MX8QX/fsl_clock.h new file mode 100755 index 0000000..77719f1 --- /dev/null +++ b/platform/devices/MX8QX/fsl_clock.h @@ -0,0 +1,367 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef HW_CLOCKS_H +#define HW_CLOCKS_H + +#include + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SC_XTAL32K_FREQ_HZ 32768U +#define SC_XTAL24M_FREQ_HZ 24000000U +#define SC_ROSC_FREQ_HZ 200000000U +#define SC_PLL0_STARTUP_FREQ_HZ 1056000000U + +#define SC_MSLICE_ROOT0_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_RESET_DIV 2U // 200 MHz / 2 = 100 MHz (CAAM) +#define SC_MSLICE_ROOT3_RESET_DIV 1U // 200 MHz / 1 = 200 MHz (MSI) + +#define SC_MSLICE_ROOT0_STARTUP_DIV 4U // 1056 MHz / 4 = 264 MHz (CM4, BUS) +#define SC_MSLICE_ROOT1_STARTUP_DIV 8U // 1056 MHz / 8 = 132 MHz (SECO, IPG) +#define SC_MSLICE_ROOT2_STARTUP_DIV 3U // 1056 MHz / 3 = 352 MHz (CAAM) +#define SC_MSLICE_ROOT3_STARTUP_DIV 5U // 1056 MHz / 5 = 211 MHz (MSI) + +#define SC_MCU_STARTUP_FREQ_HZ (SC_PLL0_STARTUP_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_STARTUP_FREQ_MHZ (SC_MCU_STARTUP_FREQ_HZ/1000000U) +#define SC_MCU_LPM_FREQ_HZ (SC_ROSC_FREQ_HZ/SC_MSLICE_ROOT0_STARTUP_DIV) +#define SC_MCU_LPM_FREQ_MHZ (SC_MCU_LPM_FREQ_HZ/1000000U) +#define SC_SYSTICK_NSEC_TO_TICKS(nsec) ((SC_MCU_STARTUP_FREQ_MHZ * (nsec)) / 1000U) + +#define SC_LPIT_ROOT_FREQ_HZ 24000000U +#define SC_LPIT_ROOT_DIV 3U +#define SC_LPIT_FREQ_HZ (SC_LPIT_ROOT_FREQ_HZ / SC_LPIT_ROOT_DIV) +#define SC_LPIT_MSEC_TO_TICKS(msec) (SC_LPIT_FREQ_HZ * (msec) / 1000U) + +#define SC_BG_SVC_MSEC 10U // Background service interval in msec +#define SC_WDOG_SVC_MSEC 5U // WDOG service interval in msec +#define SC_BG_TIMEOUT_MSEC 100U // Background timeout in msec +#define SC_BG_TIMEOUT (SC_BG_TIMEOUT_MSEC / SC_WDOG_SVC_MSEC) + +/*! @brief Clock ip name array for LPUART. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPUART_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPUART_CLOCKS {kCLOCK_LPUART_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/*! @brief Clock ip name array for LPI2C. */ + +/* Note: This array should have FSL_FEATURE_SOC_LPI2C_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define LPI2C_CLOCKS {kCLOCK_LPI2C_SC, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_IGPIO_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define GPIO_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/* Note: This array should have FSL_FEATURE_SOC_MU_COUNT entries. + * Unused/unsupported entries are marked as invalid. + */ +#define MU_CLOCKS {kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \ + kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid} + +/*! @brief Clock name used to get clock frequency. */ +typedef enum _clock_name +{ + kCLOCK_NmInvalid = 0U, +} clock_name_t; + +/*! + * @brief Clock source for peripherals that support various clock selections. + */ +typedef enum _clock_ip_src +{ + kCLOCK_SrcInvalid = 0U, +} clock_ip_src_t; + +/*! + * @brief Peripheral clock name difinition used for clock gate, clock source + * and clock divider setting. It is defined as the corresponding register address. + */ +typedef enum _clock_ip_name +{ + kCLOCK_IpInvalid = 0U, + kCLOCK_TCMC_SC = LPCG__SS_SCU__CM4__TCMC_HCLK__BASE, + kCLOCK_MMCAU_SC = LPCG__SS_SCU__CM4__MMCAU_HCLK__BASE, + kCLOCK_TPM_SC = LPCG__SS_SCU__TPM1__IPG_CLK__BASE, + kCLOCK_LPIT_SC = LPCG__SS_SCU__LPIT1__IPG_CLK__BASE, + kCLOCK_LPUART_SC = LPCG__SS_SCU__LPUART1__IPG_CLK__BASE, + kCLOCK_LPI2C_SC = LPCG__SS_SCU__LPI2C1__IPG_CLK__BASE +} clock_ip_name_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief Enable the clock for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + volatile uint32_t lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enable the hardware clock gating for specific IP. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableHWCG(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Enable IPG and BAUD clocks */ + uint32_t lpcgVal = (1UL << LPCG__SS_SCU__PER_CLK__HWEN); + + *((volatile uint32_t *) (uint32_t) name) |= lpcgVal; + } +#endif +} + +/*! + * @brief Enable the clock for specific IP using exclusive access. + * + * @param name Which clock to enable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_EnableClockEx(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Use exclusive access to enable IPG and BAUD clocks */ + uint32_t volatile lpcgVal = (1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN); + + do + { + lpcgVal |= __LDREXW((volatile uint32_t *) (uint32_t) name); + } while (__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)) != 0U); + + /* Wait for clocks to start */ + uint32_t stopMask = (1UL << LPCG__SS_SCU__IPG_CLK__STOP) | + (1UL << LPCG__SS_SCU__PER_CLK__STOP); + + while ((*((volatile uint32_t *) (uint32_t) name) & stopMask) != 0U) + { + ; /* Intentional empty while */ + } + + /* Perform extra write as workaround for TKT322331 */ + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + + } +#endif +} + +/*! + * @brief Disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClock(clock_ip_name_t name) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + /* Disable IPG and BAUD clocks */ + uint32_t lpcgVal = 0U; + + *((volatile uint32_t *) (uint32_t) name) = lpcgVal; + } +#endif +} + +/*! + * @brief Enter exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline uint32_t CLOCK_DisableClockExEnter(clock_ip_name_t name) +{ +#ifndef SIMU + /* Use exclusive access to disable IPG and BAUD clocks */ + uint32_t lpcgVal = ~((1UL << LPCG__SS_SCU__IPG_CLK__SWEN) | + (1UL << LPCG__SS_SCU__PER_CLK__SWEN)); + + if (name != kCLOCK_IpInvalid) + { + lpcgVal = __LDREXW((volatile uint32_t *) (uint32_t) name); + } + + return lpcgVal; +#else + return 0U; +#endif +} + +/*! + * @brief Leave exclusive attempt to disable the clock for specific IP. + * + * @param name Which clock to disable, see \ref clock_ip_name_t. + */ +static inline void CLOCK_DisableClockExLeave(clock_ip_name_t name, + uint32_t lpcgVal) +{ +#ifndef SIMU + if (name != kCLOCK_IpInvalid) + { + (void)__STREXW(lpcgVal, ((volatile uint32_t *) (uint32_t) name)); + } +#endif +} + +/*! + * @brief Check whether the clock is already enabled and configured by + * any other core. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @return True if clock is already enabled, otherwise false. + */ +static inline bool CLOCK_IsEnabledByOtherCore(clock_ip_name_t name) +{ + return false; +} + +/*! + * @brief Set the clock source for specific IP module. + * + * Set the clock source for specific IP, not all modules need to set the + * clock source, should only use this function for the modules need source + * setting. + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + */ +static inline void CLOCK_SetIpSrc(clock_ip_name_t name, clock_ip_src_t src) +{ +} + +/*! + * @brief Set the clock source and divider for specific IP module. + * + * Set the clock source and divider for specific IP, not all modules need to + * set the clock source and divider, should only use this function for the + * modules need source and divider setting. + * + * Divider output clock = Divider input clock x [(fracValue+1)/(divValue+1)]). + * + * @param name Which peripheral to check, see \ref clock_ip_name_t. + * @param src Clock source to set. + * @param divValue The divider value. + * @param fracValue The fraction multiply value. + */ +static inline void CLOCK_SetIpSrcDiv(clock_ip_name_t name, clock_ip_src_t src, uint8_t divValue, uint8_t fracValue) +{ +} + +/*! + * @brief Gets the clock frequency for a specific clock name. + * + * This function checks the current clock configurations and then calculates + * the clock frequency for a specific clock name defined in clock_name_t. + * + * @param clockName Clock names defined in clock_name_t + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetFreq(clock_name_t clockName); + +/*! + * @brief Gets the clock frequency for a specific IP module. + * + * This function gets the IP module clock frequency based on PCC registers. It is + * only used for the IP modules which could select clock source by PCC[PCS]. + * + * @param name Which peripheral to get, see \ref clock_ip_name_t. + * @return Clock frequency value in hertz + */ +uint32_t CLOCK_GetIpFreq(clock_ip_name_t name); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +#endif /* HW_CLOCKS_H */ + +/* EOF */ + diff --git a/platform/devices/MX8QX/handlers_MX8QX.h b/platform/devices/MX8QX/handlers_MX8QX.h new file mode 100755 index 0000000..decc1bf --- /dev/null +++ b/platform/devices/MX8QX/handlers_MX8QX.h @@ -0,0 +1,103 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright 2018-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Header for handlers. + */ + +#ifndef HANDLERS_H +#define HANDLERS_H + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Functions */ + +void sc_handlers_init(void); +void DefaultISR(void); +void NMI_IRQHandler(uint32_t *sp); +void MCM_IRQHandler(uint32_t *sp); +void DebugWake_IRQHandler(void); +void SWI_IRQHandler(void); +void SWI_DQS2DQ_Handler(void); +void LPIT_SCU_IRQHandler(uint32_t *sp); +void DSC_SCU_IRQHandler(void); +void DSC_LSIO_IRQHandler(void); +void DSC_CM4_0_IRQHandler(void); +void DSC_CA35_IRQHandler(void); +void DSC_DRC_0_IRQHandler(void); +void DSC_GPU_0_IRQHandler(void); +void DSC_VPU_IRQHandler(void); +void DSC_ADMA_IRQHandler(void); +void IOMUX_CommonHandler(uint8_t irq, uint8_t ring, uint8_t group); +void IOMUX0_IRQHandler(void); +void IOMUX1_IRQHandler(void); +void IOMUX2_IRQHandler(void); +void IOMUX3_IRQHandler(void); +void IOMUX4_IRQHandler(void); +void IOMUX5_IRQHandler(void); +void IOMUX6_IRQHandler(void); +void IOMUX7_IRQHandler(void); +void IOMUX8_IRQHandler(void); +void IOMUX9_IRQHandler(void); +void IOMUX10_IRQHandler(void); +void IOMUX11_IRQHandler(void); +void IOMUX12_IRQHandler(void); +void SYSCTR_CMP0_IRQHandler(void); +void SYSCTR_CMP1_IRQHandler(void); +void SNVS_Functional_IRQHandler(void); +void ss_earlywdog_handler_sc(void); +void ss_csreq_handler_a35(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_mcu(uint32_t idx, uint32_t cpwrupreq); +void ss_csreq_handler_dbgpwrup(uint32_t idx, uint32_t cpwrupreq); +#if HAS_SS_AP_2 +sc_bool_t ss_dbg_status_a35(sc_dsc_t dsc); +void ss_dbg_resume_a35(sc_dsc_t dsc); +#endif + +/* Global Variables */ + +extern uint32_t gLPITcnt; + +#endif /* #if !defined(HANDLERS_H) */ + diff --git a/platform/devices/MX8QX/linker/gcc/MX8QX_flash.ld b/platform/devices/MX8QX/linker/gcc/MX8QX_flash.ld new file mode 100755 index 0000000..ea63e74 --- /dev/null +++ b/platform/devices/MX8QX/linker/gcc/MX8QX_flash.ld @@ -0,0 +1,61 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Specify the memory areas */ +MEMORY +{ + m_rom (RX) : ORIGIN = 0x00000000, LENGTH = 0x00018000 +} + +/* Define output sections */ +SECTIONS +{ + /* Vector table and code to emulate ROM */ + .rom : + { + . = ALIGN(8); + KEEP(*(.rom)) + . = ALIGN(0x80); + } > m_rom +} + diff --git a/platform/devices/MX8QX/linker/gcc/MX8QX_overlay.t.ld b/platform/devices/MX8QX/linker/gcc/MX8QX_overlay.t.ld new file mode 100755 index 0000000..7b1d0b1 --- /dev/null +++ b/platform/devices/MX8QX/linker/gcc/MX8QX_overlay.t.ld @@ -0,0 +1,312 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/* DO NOT EDIT - This file auto generated by $cmd */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_ocram (RX) : ORIGIN = 0x00100000, LENGTH = 0x00040000 + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002ED80 + m_ovl (RX) : ORIGIN = 0x2000F000, LENGTH = 0x00000FF0 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + OVERLAY : NOCROSSREFS + { +<% $counter = 0 %> +<%OV_LIST%> + .test$counter { */test_$tests[$counter].o(.text*) */test_$tests[$counter].o(.rodata*) } +<% $counter++; return 'OV_LIST' if $counter < scalar(@tests); '' %> + } > m_ovl AT> m_ocram + + .test_ovly_table : + { + . = ALIGN(4); + __ovly_table = .; + LONG(0x34982933); LONG(0); LONG($last); +<% $counter = 0 %> +<%TB_LIST%> + LONG(ABSOLUTE(ADDR(.test$counter))); LONG(SIZEOF(.test$counter)); LONG(LOADADDR(.test$counter)); +<% $counter++; return 'TB_LIST' if $counter < scalar(@tests); '' %> + LONG(0); LONG(0); LONG(0); + } > m_ocram + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8QX/linker/gcc/MX8QX_tcm.ld b/platform/devices/MX8QX/linker/gcc/MX8QX_tcm.ld new file mode 100755 index 0000000..55984d3 --- /dev/null +++ b/platform/devices/MX8QX/linker/gcc/MX8QX_tcm.ld @@ -0,0 +1,288 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x1000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000; +EMUL_SIZE = DEFINED(__emul_size__) ? __emul_size__ : 0x0010; +DEBUG_DATA_SIZE = DEFINED(__debug_data_size__) ? __debug_data_size__ : 0x0040; + +/* GUARD_LOG2 defines the power-of-2 size of the MPU guard region + * used for runtime detection of stack/heap overflow. Default + * value is 11 => guard region = 2^11 = 2K + */ +GUARD_LOG2 = DEFINED(__guard_log2__) ? __guard_log2__ : 11; +GUARD_SIZE = (1 << GUARD_LOG2); + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x1ffe0000, LENGTH = 0x00000280 + m_text (RX) : ORIGIN = 0x1ffe0280, LENGTH = 0x0002fd70 + m_emul (RX) : ORIGIN = 0x2000fff0, LENGTH = 0x00000010 + m_data (RW) : ORIGIN = 0x20010000, LENGTH = 0x0000cfc0 + m_debug (RW) : ORIGIN = 0x2001cfc0, LENGTH = 0x00000040 + m_data_2 (RW) : ORIGIN = 0x2001d000, LENGTH = 0x00002800 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(0x80); + __VECTOR_TABLE = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } > m_interrupts + + __VECTOR_RAM = __VECTOR_TABLE; + __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0; + + /* The program code and other data goes into TCM */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + /* Constants/strings linked to end of image and are allowed to spill over + from TCML to TCMU without access penalty (DCODE bus access). Alignment + faults must be enabled to ensure an access across the boundary is detected + not occur */ + .rodata : + { + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(64); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .emul : + { + __EMUL = .; + . += EMUL_SIZE; + } > m_emul + + /* Ensure .data 64-byte aligned for optimized copy */ + .data : AT( LOADADDR(.fini_array) + SIZEOF(.fini_array)) + { + . = ALIGN(64); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(64); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + copy_start = LOADADDR(.interrupts); + copy_end = copy_start; + copy_dest = copy_start; + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + + /* Uninitialized data section with NO zeroization + * + * Note: section attribute NOLOAD prevents the linker from allocating space in + * the loadable image (i.e. section type marked NOBITS instead of PROGBITS) + */ + .noinit (NOLOAD) : + { + . = ALIGN(64); + __NoInitBase = .; + *(.noinit) + *(.noinit*) + . = ALIGN(64); + __NoInitEnd = .; + } > m_data + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(64); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; + __END_BSS = .; + __FREE_TCM_START = .; + } > m_data + + .debug_data : + { + __FREE_TCM_END = .; + __DEBUG_DATA = .; + . += DEBUG_DATA_SIZE; + } > m_debug + + .heap : + { + . = ALIGN(64); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + . = ALIGN(64); + } > m_data_2 + + .guard : + { + . = ALIGN(GUARD_SIZE); + __GuardStart = .; + . += GUARD_SIZE; + __GuardLimit = .; + } > m_data_2 + + __GuardSizeMpuField = (GUARD_LOG2 - 1) << 1; + + .stack : + { + . = ALIGN(64); + . += STACK_SIZE; + . = ALIGN(64); + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + __FREE_TCM_BYTES = __FREE_TCM_END - __FREE_TCM_START; + __FREE_TCM_WORDS = __FREE_TCM_BYTES >> 2; + + /DISCARD/ : { *(.interp) } + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __GuardLimit, "region m_data_2 overflowed with stack and heap") + ASSERT(__DATA_END < __EMUL, "region m_text overflowed with initialized data") +} + diff --git a/platform/devices/MX8QX/system_MX8QX.h b/platform/devices/MX8QX/system_MX8QX.h new file mode 100755 index 0000000..5534314 --- /dev/null +++ b/platform/devices/MX8QX/system_MX8QX.h @@ -0,0 +1,198 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*! + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#ifndef SYSTEM_H +#define SYSTEM_H /**< Symbol preventing repeated inclusion */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Defines */ + +/* Reset requires 32 cycles of xtal24M to propagate. SysTick clocked from + ROSC will be used for delay. + + ROSC @ 200 MHz +*/ +#define RESET_WAIT_ROSC_CYCLES (((SC_ROSC_FREQ_HZ / SC_XTAL24M_FREQ_HZ) + 1U) * 32U) + +/* Define delay for top-level top-level SSI power switch chains. + */ +#define SYSCTR_NSEC_TO_CYCLES(nsec) ((((nsec) * SC_MCU_STARTUP_FREQ_MHZ) + 999U) / 1000U) +#define SSI_CHAIN_LF_CYCLES (SYSCTR_NSEC_TO_CYCLES(500U)) +#define SSI_CHAIN_HF_CYCLES (SYSCTR_NSEC_TO_CYCLES(2000U)) + +/* OSC24M lock spec unknown, use conservative 4ms */ +#define OSC24M_WAIT_ROSC_CYCLES (4*SC_ROSC_FREQ_HZ/1000U) + +/* Address for environment event trigger */ +#define SC_ENV_TRIG_ADDR 0x2000FFF0U + +/* Query to determine if firmware loaded by ROM */ +#ifndef SIMU +#define SCFW_LOADED_BY_ROM ((DSC_SC->GPR_CTRL[0].RW & BIT(31))) +#else +#define SCFW_LOADED_BY_ROM (0x80000000U) +#endif + +/* Query to determine boot mode + * BOOT_MODE[7:0] tied to DSC.GPR_STAT[0] bits [23:16] + */ +#define SC_BOOT_MODE ((DSC_SC->GPR_STAT[0].RW & 0x00FF0000U) >> 16U) + +/* BOOT_MODE = Infinite loop mode = bXXXX1110 = 0x0E */ +#define SC_BOOT_MODE_INF_LOOP 0x0EU + +/* Margin to wake system early from LLS for WDOG servicing */ +#define SC_WAKE_MARGIN_MSEC 5U + +#ifdef DEBUG +extern uint32_t __DEBUG_DATA[]; +#define SCFW_DBG_READY (__DEBUG_DATA[0]) +#define SCFW_DBG_SKIPS (__DEBUG_DATA[1]) +#define SCFW_DBG_DUMP_PTR (&(__DEBUG_DATA[2])) +#define SCFW_DBG_DUMP_R0 (__DEBUG_DATA[2]) +#define SCFW_DBG_DUMP_R1 (__DEBUG_DATA[3]) +#define SCFW_DBG_DUMP_R2 (__DEBUG_DATA[4]) +#define SCFW_DBG_DUMP_R3 (__DEBUG_DATA[5]) +#define SCFW_DBG_DUMP_R12 (__DEBUG_DATA[6]) +#define SCFW_DBG_DUMP_LR (__DEBUG_DATA[7]) +#define SCFW_DBG_DUMP_PC (__DEBUG_DATA[8]) +#define SCFW_DBG_DUMP_PSR (__DEBUG_DATA[9]) +#define SCFW_DBG_SCTR_TICKS (__DEBUG_DATA[10]) +#define SCFW_DBG_RSVD0 (__DEBUG_DATA[11]) +#define SCFW_DBG_TX_PTR (&__DEBUG_DATA[12]) +#define SCFW_DBG_RX_PTR (&__DEBUG_DATA[13]) +#endif + +#define SC_ENV_TRIG_DUMP 0xc0ffee10U //!< Start dump +#define SC_ENV_TRIG_KILL 0xc0ffee20U //!< Kill execution + +/* Types */ + +/*! + * This type is used to indicate the trigger event. + */ +typedef uint32_t sc_env_trig_event_t; + +/** + * @brief Generate environment event trigger + * + */ +void SystemEventTrigger (sc_env_trig_event_t event); + +/** + * @brief Enter firmware critical section. + * + */ +void SystemEnterCS(void); + +/** + * @brief Exit firmware critical section. + * + */ +void SystemExitCS(void); + +/** + * @brief Get active exception. + * + */ +uint32_t SystemGetActiveException(void); + +/** + * @brief Setup the microcontroller system. + * + * Typically this function configures the oscillator (PLL) that is part of the + * microcontroller device. For systems with variable clock speed it also updates + * the variable SystemCoreClock. SystemInit is called from startup_device file. + */ +void SystemInit(void); + +void SystemInitPostCRT(void); + +/** + * @brief Prepares to enter Low-Power Mode (LPM) + * + */ +void SystemPrepareLPM(void); + +void SystemEnterLPM(void); + +/** + * @brief Delays the specified number of usec + * + */ +void SystemTimeDelay(uint32_t usec); + +void SystemDebugWaitAttach(void); + +void CommonFault_Handler(uint32_t *sp); + +void SystemDebugHalt(void); + +void SystemExit(void); + +void HardFault_Handler(uint32_t *sp); + +void MemManage_Handler(uint32_t *sp); + +void BusFault_Handler(uint32_t *sp); + +void UsageFault_Handler(uint32_t *sp); + +void SystemDebugResume(void); + +#if defined(DEBUG) || defined(HAS_TEST) +uint32_t SystemMemoryProbe(void *addr, void *val, uint8_t width); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* #if !defined(SYSTEM_H_) */ diff --git a/platform/devices/Makefile b/platform/devices/Makefile new file mode 100755 index 0000000..b6b824f --- /dev/null +++ b/platform/devices/Makefile @@ -0,0 +1,20 @@ + +ifeq ($(HW), REAL) + objs_devices := startup.o memops.o memops_test.o memcpy-armv7m.o aeabi_memset-thumb2.o +else + objs_devices := stub.o +endif + +OBJS += \ + $(foreach object,$(objs_devices),$(OUT)/devices/$(object)) + +DIRS += $(OUT)/devices + +ifeq ($(HW), REAL) + + SUBCOMPS := $(DEVICE) + + include $(foreach subcomp,$(SUBCOMPS),$(rootdir)/$(SRC)/devices/$(subcomp)/Makefile) + +endif + diff --git a/platform/devices/fsl_device_registers.h b/platform/devices/fsl_device_registers.h new file mode 100755 index 0000000..86863aa --- /dev/null +++ b/platform/devices/fsl_device_registers.h @@ -0,0 +1,191 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef FSL_DEVICE_REGISTERS_H +#define FSL_DEVICE_REGISTERS_H + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ +#if defined(CPU_MX8QM) + + #define MX8_SERIES + + /* CPU specific feature definitions */ + #include "MX8QM/MX8QM_features.h" + /* CMSIS-style register definitions */ + #include "MX8QM/MX8QM.h" + #include "MX8/MX8_dsc.h" + #include "MX8/MX8_dsc_ai.h" + #include "MX8/MX8_csr.h" + #include "MX8/MX8_xrdc2.h" + #include "MX8/MX8_mu.h" + #include "MX8/MX8_lmem_cache.h" + #include "MX8/MX8_lpuart.h" + #include "MX8/MX8_lpit.h" + #include "MX8/MX8_sysctr.h" + #include "MX8/MX8_wdog.h" + #include "MX8/MX8_pad.h" + #include "MX8/MX8_lpcg.h" + #include "MX8/MX8_lpi2c.h" + #include "MX8/MX8_gpio.h" + #include "MX8/MX8_igpio.h" + #include "MX8/MX8_mcm.h" + #include "MX8/MX8_dma3.h" + #include "MX8/MX8_snvs.h" + #include "MX8/MX8_asmc.h" + #include "MX8/MX8_lpc.h" + #include "MX8QM/MX8QM_otp.h" + #include "MX8/MX8_stc.h" + #include "MX8/MX8_rep2.h" + #include "MX8/MX8_mbist.h" + #include "MX8/MX8_isi.h" + #include "MX8/MX8_adm.h" + #include "MX8/MX8_jpgdec.h" + #include "MX8/MX8_jpgenc.h" + #include "MX8/MX8_drc.h" + #include "MX8/MX8_ddrc.h" + #include "MX8/MX8_ddr_phy.h" + #include "MX8/MX8_drc_perf.h" + #include "MX8/MX8_flexspi.h" + /* Register access macros */ + #include "MX8/fsl_bitaccess.h" + #include "MX8QM/MX8QM_fuse_map.h" + +#elif defined(CPU_MX8QX) + + #define MX8_SERIES + + /* CPU specific feature definitions */ + #include "MX8QX/MX8QX_features.h" + /* CMSIS-style register definitions */ + #include "MX8QX/MX8QX.h" + #include "MX8/MX8_dsc.h" + #include "MX8/MX8_dsc_ai.h" + #include "MX8/MX8_csr.h" + #include "MX8/MX8_xrdc2.h" + #include "MX8/MX8_mu.h" + #include "MX8/MX8_lmem_cache.h" + #include "MX8/MX8_lpuart.h" + #include "MX8/MX8_lpit.h" + #include "MX8/MX8_sysctr.h" + #include "MX8/MX8_wdog.h" + #include "MX8/MX8_pad.h" + #include "MX8/MX8_lpcg.h" + #include "MX8/MX8_lpi2c.h" + #include "MX8/MX8_gpio.h" + #include "MX8/MX8_igpio.h" + #include "MX8/MX8_mcm.h" + #include "MX8/MX8_dma3.h" + #include "MX8/MX8_snvs.h" + #include "MX8/MX8_asmc.h" + #include "MX8/MX8_lpc.h" + #include "MX8QX/MX8QX_otp.h" + #include "MX8/MX8_stc.h" + #include "MX8/MX8_rep2.h" + #include "MX8/MX8_mbist.h" + #include "MX8/MX8_isi.h" + #include "MX8/MX8_adm.h" + #include "MX8/MX8_jpgdec.h" + #include "MX8/MX8_jpgenc.h" + #include "MX8/MX8_drc.h" + #include "MX8/MX8_ddrc.h" + #include "MX8/MX8_ddr_phy.h" + #include "MX8/MX8_drc_perf.h" + #include "MX8/MX8_flexspi.h" + /* Register access macros */ + #include "MX8/fsl_bitaccess.h" + #include "MX8QX/MX8QX_fuse_map.h" + +#elif defined(CPU_MX8DXL) + + #define MX8_SERIES + + /* CPU specific feature definitions */ + #include "MX8DXL/MX8DXL_features.h" + /* CMSIS-style register definitions */ + #include "MX8DXL/MX8DXL.h" + #include "MX8/MX8_dsc.h" + #include "MX8/MX8_dsc_ai.h" + #include "MX8/MX8_csr.h" + #include "MX8/MX8_ecsr_reset.h" + #include "MX8/MX8_xrdc2.h" + #include "MX8/MX8_mu.h" + #include "MX8/MX8_lmem_cache.h" + #include "MX8/MX8_lpuart.h" + #include "MX8/MX8_lpit.h" + #include "MX8/MX8_sysctr.h" + #include "MX8/MX8_wdog.h" + #include "MX8/MX8_pad.h" + #include "MX8/MX8_lpcg.h" + #include "MX8/MX8_lpi2c.h" + #include "MX8/MX8_gpio.h" + #include "MX8/MX8_igpio.h" + #include "MX8/MX8_mcm.h" + #include "MX8/MX8_dma3.h" + #include "MX8/MX8_snvs.h" + #include "MX8/MX8_asmc.h" + #include "MX8/MX8_lpc.h" + #include "MX8DXL/MX8DXL_otp.h" + #include "MX8/MX8_rep2.h" + #include "MX8/MX8_mbist.h" + #include "MX8/MX8_isi.h" + #include "MX8/MX8_adm.h" + #include "MX8/MX8_drc.h" + #include "MX8/MX8_ddrc.h" + #include "MX8/MX8_ddr_phy.h" + #include "MX8/MX8_drc_perf.h" + #include "MX8/MX8_flexspi.h" + /* Register access macros */ + #include "MX8/fsl_bitaccess.h" + #include "MX8DXL/MX8DXL_fuse_map.h" + +#else + #error "No valid CPU defined!" +#endif + +#endif /* FSL_DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/platform/devices/memops.h b/platform/devices/memops.h new file mode 100644 index 0000000..9f48fad --- /dev/null +++ b/platform/devices/memops.h @@ -0,0 +1,52 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** Memory operations for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef MEMOPS_H +#define MEMOPS_H + +void memset_unrolled_8(uint32_t *pMem, uint32_t *pEnd, uint32_t val); +void memset_unrolled_28(uint32_t *pMem, uint32_t *pEnd, uint32_t val); + +#endif /* MEMOPS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/platform/devices/startup.h b/platform/devices/startup.h new file mode 100755 index 0000000..f2e5b10 --- /dev/null +++ b/platform/devices/startup.h @@ -0,0 +1,61 @@ +/* +** ################################################################### +** Processors: MX8 +** +** Compilers: GNU C Compiler +** +** Abstract: +** CMSIS Peripheral Access Layer for MX8 +** +** Copyright (c) 1997 - 2015 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +#ifndef STARTUP_H +#define STARTUP_H + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief Make necessary initializations for RAM. + * + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + */ +void init_data_bss(void); + +#endif /* STARTUP_H*/ +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/platform/drivers/analog/Makefile b/platform/drivers/analog/Makefile new file mode 100755 index 0000000..33a1b0b --- /dev/null +++ b/platform/drivers/analog/Makefile @@ -0,0 +1,9 @@ + +OBJS += $(OUT)/drivers/analog/fsl_analog.o +OBJS += $(OUT)/drivers/analog/fsl_analog_refgen.o +OBJS += $(OUT)/drivers/analog/fsl_analog_bias.o +OBJS += $(OUT)/drivers/analog/fsl_analog_pll.o +OBJS += $(OUT)/drivers/analog/fsl_vdetect.o + +DIRS += $(OUT)/drivers/analog + diff --git a/platform/drivers/analog/fsl_analog.h b/platform/drivers/analog/fsl_analog.h new file mode 100755 index 0000000..d684f71 --- /dev/null +++ b/platform/drivers/analog/fsl_analog.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_ANALOG_H +#define DRV_ANALOG_H + +#include "fsl_common.h" +#include "main/scfw.h" +#include "main/main.h" +#include "main/soc.h" + +#define MAX_DRV_CUR 3U +#define MAX_TRIM 7U +#define MAX_CLKIN 3U + +#define SE_XTAL_24MHZ 0x1U +#define DIFF_XTAL_24MHZ 0x2U + +typedef struct +{ + uint32_t regl_lv; + uint32_t regh_lv; + uint32_t cl_tune_lv; +} xtalosc24_config_t; + +typedef struct +{ + uint32_t drv0, drv1; +} root_config_t; + +typedef struct +{ + uint32_t drv0, drv1; + uint32_t drv_in; + uint32_t term_res; +} rptr_config_t; + +typedef struct +{ + uint32_t drv_in; + uint32_t term_res, sqrup; +} term_config_t; + +#ifndef NO_REFGEN +#ifdef AUTOCAL +uint32_t RefgenCalibrateAuto(uint8_t base_idx); +#endif +void RefgenSetup(uint8_t base_idx, uint32_t refgen, sc_bool_t anamix); +sc_bool_t RefgenEnabled(uint8_t base_idx, uint8_t tog); +sc_bool_t RefgenTrimmed(uint8_t base_idx, uint8_t tog); +void RefgenSetEn(uint8_t base_idx, uint8_t tog, sc_bool_t enable); +#endif +void BandgapSetEn(uint8_t base_idx, uint8_t tog, sc_bool_t enable); +void BandgapSetTrim(uint8_t base_idx, uint8_t tog, uint32_t trim_val); +void BandgapSelfBiasOff(uint8_t base_idx, uint8_t tog); +sc_bool_t PhyLdoEnabled(uint8_t base_idx, uint8_t tog); +void PhyLdoSetEn(uint8_t base_idx,uint8_t tog,uint32_t target,sc_bool_t enable); +sc_bool_t HPPllRegEnabled(uint8_t base_idx,uint8_t tog); +void HPPllRegSetEn(uint8_t base_idx,uint8_t tog, uint32_t target, sc_bool_t enable); +sc_bool_t AVPllRegEnabled(uint8_t base_idx, uint8_t tog); +void AVPllRegSetEn(uint8_t base_idx,uint8_t tog,uint32_t target, sc_bool_t enable); + +/*! + * Convert celsius to temp sensor value. + * + * @param[in] base_idx resource with sensor + * @param[in] celsius whole part of temp + * @param[in] tenths fractional part of temp + * @param[out] val value to return + */ +void ANA_Temp2Val(uint8_t base_idx, int16_t celsius, int8_t tenths, + uint32_t *val); +/*! + * Convert temp sensor value to celsius. + * + * @param[in] dsc resource with sensor + * @param[in] val value to convert + * @param[out] celsius whole part of temp to return + * @param[out] tenths fractional part of temp to return + */ +void ANA_Val2Temp(uint8_t base_idx, uint32_t val, int16_t *celsius, + int8_t *tenths); + +void ANA_BIAS_Calc(uint8_t bias_encoded, uint8_t *asym, uint8_t *vctrl); +sc_bool_t ANA_BIAS_Enabled(uint8_t base_idx, uint8_t bias_mask); +void ANA_BIAS_SetupEn(uint8_t base_idx, uint8_t bias_mask, sc_bool_t enable, + uint32_t delay); +void ANA_BIAS_ClearRefVCtrl(uint8_t base_idx); +void ANA_BIAS_SetRefVCtrl(uint8_t base_idx, uint8_t vctrl); + +/* Diff Clock functions */ +void ANA_XtalOsc24Init (uint32_t regl_lv, uint32_t regh_lv, uint32_t cl_tune_lv); +void ANA_DiffClkRootInit (uint32_t drv0, uint32_t drv1); +void ANA_DiffClkRptrInit (uint32_t drv0, uint32_t drv1, uint32_t drv_in, + uint32_t term_res); +void ANA_DiffClkTermInit (uint32_t drv_in, uint32_t sqrup, uint32_t term_res); +void ANA_XtalOsc24Setup (uint8_t base_idx, uint8_t tog, sc_bool_t enable); +void ANA_DiffClkRootSetup (uint8_t base_idx, uint8_t tog, uint8_t clkin, + sc_bool_t mux_en, sc_bool_t mux_en_diff, sc_bool_t enable); +void ANA_DiffClkRptrSetup (uint8_t base_idx, uint8_t tog, sc_bool_t standalone, + uint32_t reg_trim, sc_bool_t enable); +void ANA_DiffClkTermSetup (uint8_t base_idx, uint8_t tog, sc_bool_t enable); + +/* vdetect functions*/ +void ANA_vdetect_init(sc_dsc_t dsc, uint8_t status_sel); +sc_err_t ANA_vdetect_find_dly(sc_dsc_t dsc, uint8_t *adly, uint8_t *fdly); + +#endif diff --git a/platform/drivers/common/fsl_common.h b/platform/drivers/common/fsl_common.h new file mode 100755 index 0000000..8c21e52 --- /dev/null +++ b/platform/drivers/common/fsl_common.h @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_COMMON_H_ +#define _FSL_COMMON_H_ + +#include +#include +#include +#include +#include + +#if defined(__ICCARM__) +#include +#endif + +/* + * For CMSIS pack RTE. + * CMSIS pack RTE generates "RTC_Components.h" which contains the statements + * of the related element for all selected software components. + */ +#ifdef _RTE_ +#include "RTE_Components.h" +#endif + +#include "fsl_device_registers.h" + +/*! + * @addtogroup ksdk_common + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @brief Construct a status code value from a group and code number. */ +#define MAKE_STATUS(group, code) ((((group)*100) + (code))) + +/*! @brief Construct the version number for drivers. */ +#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix)) + +/*! @name Driver version */ +/** @{ */ +/*! @brief common driver version 2.2.4. */ +#define FSL_COMMON_DRIVER_VERSION (MAKE_VERSION(2, 2, 4)) +/** @} */ + +/* Debug console type definition. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U /*!< Debug console based on UART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART 2U /*!< Debug console based on LPUART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI 3U /*!< Debug console based on LPSCI. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC 4U /*!< Debug console based on USBCDC. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM 5U /*!< Debug console based on FLEXCOMM. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_IUART 6U /*!< Debug console based on i.MX UART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART 7U /*!< Debug console based on LPC_VUSART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART 8U /*!< Debug console based on LPC_USART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_SWO 9U /*!< Debug console based on SWO. */ + +/*! @brief Status group numbers. */ +enum _status_groups +{ + kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */ + kStatusGroup_FLASH = 1, /*!< Group number for FLASH status codes. */ + kStatusGroup_LPSPI = 4, /*!< Group number for LPSPI status codes. */ + kStatusGroup_FLEXIO_SPI = 5, /*!< Group number for FLEXIO SPI status codes. */ + kStatusGroup_DSPI = 6, /*!< Group number for DSPI status codes. */ + kStatusGroup_FLEXIO_UART = 7, /*!< Group number for FLEXIO UART status codes. */ + kStatusGroup_FLEXIO_I2C = 8, /*!< Group number for FLEXIO I2C status codes. */ + kStatusGroup_LPI2C = 9, /*!< Group number for LPI2C status codes. */ + kStatusGroup_UART = 10, /*!< Group number for UART status codes. */ + kStatusGroup_I2C = 11, /*!< Group number for UART status codes. */ + kStatusGroup_LPSCI = 12, /*!< Group number for LPSCI status codes. */ + kStatusGroup_LPUART = 13, /*!< Group number for LPUART status codes. */ + kStatusGroup_SPI = 14, /*!< Group number for SPI status code.*/ + kStatusGroup_XRDC = 15, /*!< Group number for XRDC status code.*/ + kStatusGroup_SEMA42 = 16, /*!< Group number for SEMA42 status code.*/ + kStatusGroup_SDHC = 17, /*!< Group number for SDHC status code */ + kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */ + kStatusGroup_SAI = 19, /*!< Group number for SAI status code */ + kStatusGroup_MCG = 20, /*!< Group number for MCG status codes. */ + kStatusGroup_SCG = 21, /*!< Group number for SCG status codes. */ + kStatusGroup_SDSPI = 22, /*!< Group number for SDSPI status codes. */ + kStatusGroup_FLEXIO_I2S = 23, /*!< Group number for FLEXIO I2S status codes */ + kStatusGroup_FLEXIO_MCULCD = 24, /*!< Group number for FLEXIO LCD status codes */ + kStatusGroup_FLASHIAP = 25, /*!< Group number for FLASHIAP status codes */ + kStatusGroup_FLEXCOMM_I2C = 26, /*!< Group number for FLEXCOMM I2C status codes */ + kStatusGroup_I2S = 27, /*!< Group number for I2S status codes */ + kStatusGroup_IUART = 28, /*!< Group number for IUART status codes */ + kStatusGroup_CSI = 29, /*!< Group number for CSI status codes */ + kStatusGroup_MIPI_DSI = 30, /*!< Group number for MIPI DSI status codes */ + kStatusGroup_SDRAMC = 35, /*!< Group number for SDRAMC status codes. */ + kStatusGroup_POWER = 39, /*!< Group number for POWER status codes. */ + kStatusGroup_ENET = 40, /*!< Group number for ENET status codes. */ + kStatusGroup_PHY = 41, /*!< Group number for PHY status codes. */ + kStatusGroup_TRGMUX = 42, /*!< Group number for TRGMUX status codes. */ + kStatusGroup_SMARTCARD = 43, /*!< Group number for SMARTCARD status codes. */ + kStatusGroup_LMEM = 44, /*!< Group number for LMEM status codes. */ + kStatusGroup_QSPI = 45, /*!< Group number for QSPI status codes. */ + kStatusGroup_DMA = 50, /*!< Group number for DMA status codes. */ + kStatusGroup_EDMA = 51, /*!< Group number for EDMA status codes. */ + kStatusGroup_DMAMGR = 52, /*!< Group number for DMAMGR status codes. */ + kStatusGroup_FLEXCAN = 53, /*!< Group number for FlexCAN status codes. */ + kStatusGroup_LTC = 54, /*!< Group number for LTC status codes. */ + kStatusGroup_FLEXIO_CAMERA = 55, /*!< Group number for FLEXIO CAMERA status codes. */ + kStatusGroup_LPC_SPI = 56, /*!< Group number for LPC_SPI status codes. */ + kStatusGroup_LPC_USART = 57, /*!< Group number for LPC_USART status codes. */ + kStatusGroup_DMIC = 58, /*!< Group number for DMIC status codes. */ + kStatusGroup_SDIF = 59, /*!< Group number for SDIF status codes.*/ + kStatusGroup_SPIFI = 60, /*!< Group number for SPIFI status codes. */ + kStatusGroup_OTP = 61, /*!< Group number for OTP status codes. */ + kStatusGroup_MCAN = 62, /*!< Group number for MCAN status codes. */ + kStatusGroup_CAAM = 63, /*!< Group number for CAAM status codes. */ + kStatusGroup_ECSPI = 64, /*!< Group number for ECSPI status codes. */ + kStatusGroup_USDHC = 65, /*!< Group number for USDHC status codes.*/ + kStatusGroup_LPC_I2C = 66, /*!< Group number for LPC_I2C status codes.*/ + kStatusGroup_DCP = 67, /*!< Group number for DCP status codes.*/ + kStatusGroup_MSCAN = 68, /*!< Group number for MSCAN status codes.*/ + kStatusGroup_ESAI = 69, /*!< Group number for ESAI status codes. */ + kStatusGroup_FLEXSPI = 70, /*!< Group number for FLEXSPI status codes. */ + kStatusGroup_MMDC = 71, /*!< Group number for MMDC status codes. */ + kStatusGroup_PDM = 72, /*!< Group number for MIC status codes. */ + kStatusGroup_SDMA = 73, /*!< Group number for SDMA status codes. */ + kStatusGroup_ICS = 74, /*!< Group number for ICS status codes. */ + kStatusGroup_SPDIF = 75, /*!< Group number for SPDIF status codes. */ + kStatusGroup_LPC_MINISPI = 76, /*!< Group number for LPC_MINISPI status codes. */ + kStatusGroup_HASHCRYPT = 77, /*!< Group number for Hashcrypt status codes */ + kStatusGroup_LPC_SPI_SSP = 78, /*!< Group number for LPC_SPI_SSP status codes. */ + kStatusGroup_I3C = 79, /*!< Group number for I3C status codes */ + kStatusGroup_LPC_I2C_1 = 97, /*!< Group number for LPC_I2C_1 status codes. */ + kStatusGroup_NOTIFIER = 98, /*!< Group number for NOTIFIER status codes. */ + kStatusGroup_DebugConsole = 99, /*!< Group number for debug console status codes. */ + kStatusGroup_SEMC = 100, /*!< Group number for SEMC status codes. */ + kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */ + kStatusGroup_IAP = 102, /*!< Group number for IAP status codes */ + kStatusGroup_SFA = 103, /*!< Group number for SFA status codes*/ + kStatusGroup_SPC = 104, /*!< Group number for SPC status codes. */ + kStatusGroup_PUF = 105, /*!< Group number for PUF status codes. */ + + kStatusGroup_HAL_GPIO = 121, /*!< Group number for HAL GPIO status codes. */ + kStatusGroup_HAL_UART = 122, /*!< Group number for HAL UART status codes. */ + kStatusGroup_HAL_TIMER = 123, /*!< Group number for HAL TIMER status codes. */ + kStatusGroup_HAL_SPI = 124, /*!< Group number for HAL SPI status codes. */ + kStatusGroup_HAL_I2C = 125, /*!< Group number for HAL I2C status codes. */ + kStatusGroup_HAL_FLASH = 126, /*!< Group number for HAL FLASH status codes. */ + kStatusGroup_HAL_PWM = 127, /*!< Group number for HAL PWM status codes. */ + kStatusGroup_HAL_RNG = 128, /*!< Group number for HAL RNG status codes. */ + kStatusGroup_TIMERMANAGER = 135, /*!< Group number for TiMER MANAGER status codes. */ + kStatusGroup_SERIALMANAGER = 136, /*!< Group number for SERIAL MANAGER status codes. */ + kStatusGroup_LED = 137, /*!< Group number for LED status codes. */ + kStatusGroup_BUTTON = 138, /*!< Group number for BUTTON status codes. */ + kStatusGroup_EXTERN_EEPROM = 139, /*!< Group number for EXTERN EEPROM status codes. */ + kStatusGroup_SHELL = 140, /*!< Group number for SHELL status codes. */ + kStatusGroup_MEM_MANAGER = 141, /*!< Group number for MEM MANAGER status codes. */ + kStatusGroup_LIST = 142, /*!< Group number for List status codes. */ + kStatusGroup_OSA = 143, /*!< Group number for OSA status codes. */ + kStatusGroup_COMMON_TASK = 144, /*!< Group number for Common task status codes. */ + kStatusGroup_MSG = 145, /*!< Group number for messaging status codes. */ + kStatusGroup_SDK_OCOTP = 146, /*!< Group number for OCOTP status codes. */ + kStatusGroup_SDK_FLEXSPINOR = 147, /*!< Group number for FLEXSPINOR status codes.*/ + kStatusGroup_CODEC = 148, /*!< Group number for codec status codes. */ + kStatusGroup_ASRC = 149, /*!< Group number for codec status ASRC. */ + kStatusGroup_OTFAD = 150, /*!< Group number for codec status codes. */ + kStatusGroup_SDIOSLV = 151, /*!< Group number for SDIOSLV status codes. */ + +}; + +/*! \public + * @brief Generic status return codes. + */ +enum +{ + kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< Generic status for Success. */ + kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1), /*!< Generic status for Fail. */ + kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< Generic status for read only failure. */ + kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3), /*!< Generic status for out of range access. */ + kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< Generic status for invalid argument check. */ + kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5), /*!< Generic status for timeout. */ + kStatus_NoTransferInProgress = MAKE_STATUS(kStatusGroup_Generic, 6), /*!< Generic status for no transfer in progress. */ +}; + +/*! @brief Type used for all status and error return values. */ +typedef int32_t status_t; + +/* + * Macro guard for whether to use default weak IRQ implementation in drivers + */ +#ifndef FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ +#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ 1 +#endif + +/*! @name Min/max macros */ +/* @{ */ +#if !defined(MIN) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#if !defined(MAX) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +/** @} */ + +/*! @brief Computes the number of elements in an array. */ +#if !defined(ARRAY_SIZE) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +/*! @name UINT16_MAX/UINT32_MAX value */ +/* @{ */ +#if !defined(UINT16_MAX) +#define UINT16_MAX ((uint16_t)-1) +#endif + +#if !defined(UINT32_MAX) +#define UINT32_MAX ((uint32_t)-1) +#endif +/** @} */ + +/*! @name Timer utilities */ +/* @{ */ +/*! Macro to convert a microsecond period to raw count value */ +#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U) +/*! Macro to convert a raw count value to microsecond */ +#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)count * 1000000U / clockFreqInHz) + +/*! Macro to convert a millisecond period to raw count value */ +#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)ms * clockFreqInHz / 1000U) +/*! Macro to convert a raw count value to millisecond */ +#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)count * 1000U / clockFreqInHz) +/** @} */ + +/*! @name Alignment variable definition macros */ +/* @{ */ +#if (defined(__ICCARM__)) +/** + * Workaround to disable MISRA C message suppress warnings for IAR compiler. + * http:/ /supp.iar.com/Support/?note=24725 + */ +_Pragma("diag_suppress=Pm120") +#define SDK_PRAGMA(x) _Pragma(#x) + _Pragma("diag_error=Pm120") +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var +/*! Macro to define a variable with L1 d-cache line size alignment */ +#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#define SDK_L1DCACHE_ALIGN(var) SDK_PRAGMA(data_alignment = FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) var +#endif +/*! Macro to define a variable with L2 cache line size alignment */ +#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#define SDK_L2CACHE_ALIGN(var) SDK_PRAGMA(data_alignment = FSL_FEATURE_L2CACHE_LINESIZE_BYTE) var +#endif +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var +/*! Macro to define a variable with L1 d-cache line size alignment */ +#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#define SDK_L1DCACHE_ALIGN(var) __attribute__((aligned(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE))) var +#endif +/*! Macro to define a variable with L2 cache line size alignment */ +#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#define SDK_L2CACHE_ALIGN(var) __attribute__((aligned(FSL_FEATURE_L2CACHE_LINESIZE_BYTE))) var +#endif +#elif defined(__GNUC__) +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes))) +/*! Macro to define a variable with L1 d-cache line size alignment */ +#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#define SDK_L1DCACHE_ALIGN(var) var __attribute__((aligned(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE))) +#endif +/*! Macro to define a variable with L2 cache line size alignment */ +#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#define SDK_L2CACHE_ALIGN(var) var __attribute__((aligned(FSL_FEATURE_L2CACHE_LINESIZE_BYTE))) +#endif +#else +#error Toolchain not supported +#define SDK_ALIGN(var, alignbytes) var +#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#define SDK_L1DCACHE_ALIGN(var) var +#endif +#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#define SDK_L2CACHE_ALIGN(var) var +#endif +#endif + +/*! Macro to change a value to a given size aligned value */ +#define SDK_SIZEALIGN(var, alignbytes) \ + ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U))) +/** @} */ + +/*! @name Non-cacheable region definition macros */ +/* For initialized non-zero non-cacheable variables, please using "AT_NONCACHEABLE_SECTION_INIT(var) ={xx};" or + * "AT_NONCACHEABLE_SECTION_ALIGN_INIT(var) ={xx};" in your projects to define them, for zero-inited non-cacheable variables, + * please using "AT_NONCACHEABLE_SECTION(var);" or "AT_NONCACHEABLE_SECTION_ALIGN(var);" to define them, these zero-inited variables + * will be initialized to zero in system startup. + */ +/* @{ */ +#if (defined(__ICCARM__)) +#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE)) +#define AT_NONCACHEABLE_SECTION(var) var @"NonCacheable" +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable" +#define AT_NONCACHEABLE_SECTION_INIT(var) var @"NonCacheable.init" +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable.init" +#else +#define AT_NONCACHEABLE_SECTION(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var +#define AT_NONCACHEABLE_SECTION_INIT(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var +#endif +#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE)) +#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + __attribute__((section("NonCacheable.init"))) __attribute__((aligned(alignbytes))) var +#if(defined(__CC_ARM)) +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"), zero_init)) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section("NonCacheable"), zero_init)) __attribute__((aligned(alignbytes))) var +#else +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(".bss.NonCacheable"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section(".bss.NonCacheable"))) __attribute__((aligned(alignbytes))) var +#endif +#else +#define AT_NONCACHEABLE_SECTION(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var +#define AT_NONCACHEABLE_SECTION_INIT(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) __attribute__((aligned(alignbytes))) var +#endif +#elif(defined(__XCC__)) +#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + __attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes))) +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section("NonCacheable"))) var __attribute__((aligned(alignbytes))) +#elif(defined(__GNUC__)) +/* For GCC, when the non-cacheable section is required, please define "__STARTUP_INITIALIZE_NONCACHEDATA" + * in your projects to make sure the non-cacheable section variables will be initialized in system startup. + */ +#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE)) +#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + __attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes))) +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var __attribute__((aligned(alignbytes))) +#else +#define AT_NONCACHEABLE_SECTION(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes))) +#define AT_NONCACHEABLE_SECTION_INIT(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) var __attribute__((aligned(alignbytes))) +#endif +#else +#error Toolchain not supported. +#define AT_NONCACHEABLE_SECTION(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) var +#define AT_NONCACHEABLE_SECTION_INIT(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) var +#endif +/** @} */ + +/*! @name Time sensitive region */ +/* @{ */ +#if defined(FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE) && FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE +#if (defined(__ICCARM__)) +#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess" +#define AT_QUICKACCESS_SECTION_DATA(func) func @"DataQuickAccess" +#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func +#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func +#elif(defined(__GNUC__)) +#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func +#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func +#else +#error Toolchain not supported. +#endif /* defined(__ICCARM__) */ +#else +#if (defined(__ICCARM__)) +#define AT_QUICKACCESS_SECTION_CODE(func) func +#define AT_QUICKACCESS_SECTION_DATA(func) func +#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define AT_QUICKACCESS_SECTION_CODE(func) func +#define AT_QUICKACCESS_SECTION_DATA(func) func +#elif(defined(__GNUC__)) +#define AT_QUICKACCESS_SECTION_CODE(func) func +#define AT_QUICKACCESS_SECTION_DATA(func) func +#else +#error Toolchain not supported. +#endif +#endif /* __FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE */ +/** @} */ + +/*! @name Ram Function */ +#if (defined(__ICCARM__)) +#define RAMFUNCTION_SECTION_CODE(func) func @"RamFunction" +#elif(defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func +#elif(defined(__GNUC__)) +#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func +#else +#error Toolchain not supported. +#endif /* defined(__ICCARM__) */ +/** @} */ + +/*! @name Suppress fallthrough warning macro */ +/* For switch case code block, if case section ends without "break;" statement, there wil be + fallthrough warning with compiler flag -Wextra or -Wimplicit-fallthrough=n when using armgcc. + To suppress this warning, "SUPPRESS_FALL_THROUGH_WARNING();" need to be added at the end of each + case section which misses "break;"statement. + */ +/* @{ */ +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) +#define SUPPRESS_FALL_THROUGH_WARNING() __attribute__ ((fallthrough)) +#else +#define SUPPRESS_FALL_THROUGH_WARNING() +#endif +/** @} */ + +#if defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) +void DefaultISR(void); +#endif +/* + * The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t + * defined in previous of this file. + */ +#include "fsl_clock.h" + +/* + * Chip level peripheral reset API, for MCUs that implement peripheral reset control external to a peripheral + */ +#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \ + (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0))) +#include "fsl_reset.h" +#endif + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) + extern "C" +{ +#endif + + /*! + * @brief Enable specific interrupt. + * + * Enable LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only enables the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ number. + * @retval kStatus_Success Interrupt enabled successfully + * @retval kStatus_Fail Failed to enable the interrupt + */ + static inline status_t EnableIRQ(IRQn_Type interrupt) + { + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if (interrupt >= FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_EnableIRQ(interrupt); +#else + NVIC_EnableIRQ(interrupt); +#endif + } + + return status; + } + + /*! + * @brief Disable specific interrupt. + * + * Disable LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only disables the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ number. + * @retval kStatus_Success Interrupt disabled successfully + * @retval kStatus_Fail Failed to disable the interrupt + */ + static inline status_t DisableIRQ(IRQn_Type interrupt) + { + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if (interrupt >= FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_DisableIRQ(interrupt); +#else + NVIC_DisableIRQ(interrupt); +#endif + } + + return status; + } + + /*! + * @brief Disable the global IRQ + * + * Disable the global interrupt and return the current primask register. User is required to provided the primask + * register for the EnableGlobalIRQ(). + * + * @return Current primask value. + */ + static inline uint32_t DisableGlobalIRQ(void) + { +#if defined (__XCC__) + return 0; +#else +#if defined(CPSR_I_Msk) + uint32_t cpsr = __get_CPSR() & CPSR_I_Msk; + + __disable_irq(); + + return cpsr; +#else + uint32_t regPrimask = __get_PRIMASK(); + + __disable_irq(); + + return regPrimask; +#endif +#endif + } + + /*! + * @brief Enable the global IRQ + * + * Set the primask register with the provided primask value but not just enable the primask. The idea is for the + * convenience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to + * use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair. + * + * @param primask value of primask register to be restored. The primask value is supposed to be provided by the + * DisableGlobalIRQ(). + */ + static inline void EnableGlobalIRQ(uint32_t primask) + { +#if defined (__XCC__) +#else +#if defined(CPSR_I_Msk) + __set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask); +#else + __set_PRIMASK(primask); +#endif +#endif + } + +#if defined(ENABLE_RAM_VECTOR_TABLE) + /*! + * @brief install IRQ handler + * + * @param irq IRQ number + * @param irqHandler IRQ handler address + * @return The old IRQ handler address + */ + uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler); +#endif /* ENABLE_RAM_VECTOR_TABLE. */ + +#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) + /*! + * @brief Enable specific interrupt for wake-up from deep-sleep mode. + * + * Enable the interrupt for wake-up from deep sleep mode. + * Some interrupts are typically used in sleep mode only and will not occur during + * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable + * those clocks (significantly increasing power consumption in the reduced power mode), + * making these wake-ups possible. + * + * @note This function also enables the interrupt in the NVIC (EnableIRQ() is called internaly). + * + * @param interrupt The IRQ number. + */ + void EnableDeepSleepIRQ(IRQn_Type interrupt); + + /*! + * @brief Disable specific interrupt for wake-up from deep-sleep mode. + * + * Disable the interrupt for wake-up from deep sleep mode. + * Some interrupts are typically used in sleep mode only and will not occur during + * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable + * those clocks (significantly increasing power consumption in the reduced power mode), + * making these wake-ups possible. + * + * @note This function also disables the interrupt in the NVIC (DisableIRQ() is called internaly). + * + * @param interrupt The IRQ number. + */ + void DisableDeepSleepIRQ(IRQn_Type interrupt); +#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */ + + /*! + * @brief Allocate memory with given alignment and aligned size. + * + * This is provided to support the dynamically allocated memory + * used in cache-able region. + * @param size The length required to malloc. + * @param alignbytes The alignment size. + * @retval The allocated memory. + */ + void *SDK_Malloc(size_t size, size_t alignbytes); + + /*! + * @brief Free memory. + * + * @param ptr The memory to be release. + */ + void SDK_Free(void *ptr); + + /*! + * @brief Delay at least for some time. + * Please note that, this API uses while loop for delay, different run-time environments make the time not precise, + * if precise delay count was needed, please implement a new delay function with hardware timer. + * + * @param delay_us Delay time in unit of microsecond. + * @param coreClock_Hz Core clock frequency with Hz. + */ + void SDK_DelayAtLeastUs(uint32_t delay_us, uint32_t coreClock_Hz); + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#endif /* _FSL_COMMON_H_ */ diff --git a/platform/drivers/csr/Makefile b/platform/drivers/csr/Makefile new file mode 100755 index 0000000..fc60ec3 --- /dev/null +++ b/platform/drivers/csr/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/csr/fsl_csr.o + +DIRS += $(OUT)/drivers/csr + diff --git a/platform/drivers/csr/fsl_csr.h b/platform/drivers/csr/fsl_csr.h new file mode 100755 index 0000000..6ecbb15 --- /dev/null +++ b/platform/drivers/csr/fsl_csr.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_CSR_H +#define DRV_CSR_H + +/*! + * @addtogroup csr_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "fsl_device_registers.h" + +/* Defines */ + +#if (defined(FSL_FEATURE_CSR_HAS_CSR) && FSL_FEATURE_CSR_HAS_CSR) +/*! + * This define is used to access CSR registers. + */ +#define CSR_BASE_ADDR(X) ((CSR_Type*) (((sc_saddr_t) DSC_BASE_ADDR(X)) \ + + 0x9000U)) +#endif + +#if (defined(FSL_FEATURE_CSR_HAS_CSR2) && FSL_FEATURE_CSR_HAS_CSR2) +/*! + * This define is used to access CSR2 registers. + */ +#define CSR2_BASE_ADDR(X) ((CSR2_Type*) (((sc_saddr_t) DSC_BASE_ADDR(X)) \ + + 0xF000U)) + +#endif + +#if (defined(FSL_FEATURE_CSR_HAS_CSR3) && FSL_FEATURE_CSR_HAS_CSR3) +/*! + * This define is used to access CSR3 registers. + */ +#define CSR3_BASE_ADDR(X) ((CSR2_Type*) (((sc_saddr_t) DSC_BASE_ADDR(X)) \ + + 0x9000U)) +#endif + +/* Types */ + +/* Functions */ + +#if (defined(FSL_FEATURE_CSR_HAS_CSR) && FSL_FEATURE_CSR_HAS_CSR) +void CSR_SetCSR(sc_dsc_t dsc, uint32_t csr_num, uint32_t csr_val, + sc_bool_t enable); +uint32_t CSR_GetCSR(sc_dsc_t dsc, uint32_t csr_num); +#endif + +#if (defined(FSL_FEATURE_CSR_HAS_CSR2) && FSL_FEATURE_CSR_HAS_CSR2) +void CSR_SetCSR2(sc_dsc_t dsc, uint32_t csr_num, uint32_t csr_val, + sc_bool_t enable); +uint32_t CSR_GetCSR2(sc_dsc_t dsc, uint32_t csr_num); +#endif + +#if (defined(FSL_FEATURE_CSR_HAS_CSR3) && FSL_FEATURE_CSR_HAS_CSR3) +void CSR_SetCSR3(sc_dsc_t dsc, uint32_t csr_num, uint32_t csr_val, + sc_bool_t enable); +uint32_t CSR_GetCSR3(sc_dsc_t dsc, uint32_t csr_num); +#endif + +#if (defined(FSL_FEATURE_CSR_HAS_LPCG) && FSL_FEATURE_CSR_HAS_LPCG) +void CSR_SetLPPG(sc_dsc_t dsc, uint32_t pg_num, uint32_t pg_val, + sc_bool_t enable); +uint32_t CSR_GetLPPG(sc_dsc_t dsc, uint32_t pg_num); +#endif + +#endif /* DRV_CSR_H */ + +/** @} */ + diff --git a/platform/drivers/drc/Makefile b/platform/drivers/drc/Makefile new file mode 100755 index 0000000..853fc87 --- /dev/null +++ b/platform/drivers/drc/Makefile @@ -0,0 +1,10 @@ + +OBJS += $(OUT)/drivers/drc/fsl_drc.o +OBJS += $(OUT)/drivers/drc/fsl_drc_dqs2dq.o +OBJS += $(OUT)/drivers/drc/fsl_drc_cbt.o +OBJS += $(OUT)/drivers/drc/fsl_drc_derate.o +OBJS += $(OUT)/drivers/drc/fsl_drc_rdbi_deskew.o +OBJS += $(OUT)/drivers/drc/fsl_drc_dram_vref.o + +DIRS += $(OUT)/drivers/drc + diff --git a/platform/drivers/drc/fsl_drc.h b/platform/drivers/drc/fsl_drc.h new file mode 100755 index 0000000..8afcf27 --- /dev/null +++ b/platform/drivers/drc/fsl_drc.h @@ -0,0 +1,59 @@ +/* + * Copyright 2018-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_H +#define DRV_DRC_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ +#include "fsl_device_registers.h" + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +void ddr_enter_retention(uint32_t total_drc_num, ddrc drc_inst[], ddr_phy drc_phy_inst[]); +void ddr_exit_retention(uint32_t total_drc_num, const ddrc drc_inst[], const ddr_phy drc_phy_inst[]); +uint8_t ddrc_mrr(uint32_t ddr_num, uint32_t rank, uint32_t MR_addr); +void ddrc_mrw(uint32_t ddr_num, uint32_t rank, uint32_t MR_addr, uint32_t MR_data); + +#endif /* DRV_DRC_H */ + +/** @} */ + diff --git a/platform/drivers/drc/fsl_drc_cbt.h b/platform/drivers/drc/fsl_drc_cbt.h new file mode 100755 index 0000000..6879f39 --- /dev/null +++ b/platform/drivers/drc/fsl_drc_cbt.h @@ -0,0 +1,62 @@ +/* + * Copyright 2018-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_CBT_H +#define DRV_DRC_CBT_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +/*! + * This function performs DDR command bus training. + * + * @param[in] phy_ptr0 initial value of PTR0 + * @param[in] phy_ptr1 initial value of PTR1 + * @param[in] total_num_drc number of DDR controllers used + */ +void run_cbt(uint32_t phy_ptr0, uint32_t phy_ptr1, uint32_t total_num_drc); + +#endif /* DRV_DRC_CBT_H */ + +/** @} */ + diff --git a/platform/drivers/drc/fsl_drc_derate.h b/platform/drivers/drc/fsl_drc_derate.h new file mode 100755 index 0000000..1096da0 --- /dev/null +++ b/platform/drivers/drc/fsl_drc_derate.h @@ -0,0 +1,72 @@ +/* + * Copyright 2019-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_DERATE_H +#define DRV_DRC_DERATE_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "fsl_device_registers.h" + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +/*! + * This function initializes the DDR derate mechanism. + * + * @param[in] total_num_drc number of DDR controllers used + */ +void ddrc_lpddr4_derate_init(uint32_t total_num_drc); + +/*! + * This function performs periodic DDR derate training. + * + * @param[in] total_num_drc number of DDR controllers used + * + * @return Returns SC_TRUE if timer is suppose to continue polling, + * otherwise SC_FALSE. + */ +sc_bool_t ddrc_lpddr4_derate_periodic(uint32_t total_num_drc); + +#endif /* DRV_DRC_DERATE_H */ + +/** @} */ + diff --git a/platform/drivers/drc/fsl_drc_dqs2dq.h b/platform/drivers/drc/fsl_drc_dqs2dq.h new file mode 100755 index 0000000..61e6d69 --- /dev/null +++ b/platform/drivers/drc/fsl_drc_dqs2dq.h @@ -0,0 +1,58 @@ +/* + * Copyright 2018-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_DQS2DQ_H +#define DRV_DRC_DQS2DQ_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "fsl_device_registers.h" + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +void dqs2dq_init(uint32_t num); +void dqs2dq_periodic(void); + +#endif /* DRV_DRC_DQS2DQ_H */ + +/** @} */ + diff --git a/platform/drivers/drc/fsl_drc_dram_vref.h b/platform/drivers/drc/fsl_drc_dram_vref.h new file mode 100755 index 0000000..c7c2100 --- /dev/null +++ b/platform/drivers/drc/fsl_drc_dram_vref.h @@ -0,0 +1,71 @@ +/* + * Copyright 2018-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_DRAM_VREF_H +#define DRV_DRC_DRAM_VREF_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +/*! + * This function performs DDR VREF training via software. + * + * @param[in] phy_ptr0 initial value of PTR0 + * @param[in] phy_ptr1 initial value of PTR1 + * @param[in] total_num_drc number of DDR controllers used + */ +void DRAM_VREF_training_sw(uint32_t ddr_num); + +/*! + * This function performs DDR VREF training via hardware. + * + * @param[in] phy_ptr0 initial value of PTR0 + * @param[in] phy_ptr1 initial value of PTR1 + * @param[in] total_num_drc number of DDR controllers used + */ +void DRAM_VREF_training_hw(uint32_t ddr_num); + +#endif /* DRV_DRC_DRAM_VREF_H */ + +/** @} */ + diff --git a/platform/drivers/drc/fsl_drc_rdbi_deskew.h b/platform/drivers/drc/fsl_drc_rdbi_deskew.h new file mode 100755 index 0000000..1fd56b6 --- /dev/null +++ b/platform/drivers/drc/fsl_drc_rdbi_deskew.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DRC_RDBI_DESKEW_H +#define DRV_DRC_RDBI_DESKEW_H + +/*! + * @addtogroup drc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +/* Defines */ + +/* Types */ + +/* Externs */ + +/* Functions */ + +/*! + * This function performs DDR deskew training. + * + * @param[in] ddr_num index of DDR controller (0 or 1) + */ +void RDBI_bit_deskew(uint32_t ddr_num); + +#endif /* DRV_DRC_RDBI_DESKEW_H */ + +/** @} */ + diff --git a/platform/drivers/dsc/Makefile b/platform/drivers/dsc/Makefile new file mode 100755 index 0000000..e905f1c --- /dev/null +++ b/platform/drivers/dsc/Makefile @@ -0,0 +1,7 @@ + +OBJS += $(OUT)/drivers/dsc/fsl_dsc.o +OBJS += $(OUT)/drivers/dsc/fsl_dsc_ai.o + + +DIRS += $(OUT)/drivers/dsc + diff --git a/platform/drivers/dsc/fsl_dsc.h b/platform/drivers/dsc/fsl_dsc.h new file mode 100755 index 0000000..933c576 --- /dev/null +++ b/platform/drivers/dsc/fsl_dsc.h @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_DSC_H +#define DRV_DSC_H + +/*! + * @addtogroup dsc_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "fsl_device_registers.h" +#include "ss/inf/inf.h" + +/* Defines */ + +#define DSC_SIZE 0x20000U //!< Size of DSC address space + +#define DSC_CLK_TYPE_W 4U //!< Width of a clock type +#define DSC_INDEX_W 6U //!< Width of the index +#define DSC_PDOM_W 3U //!< Width of the power domain type +#define DSC_GPR_W 7U //!< Width of the gpr bit type +#define DSC_PLLDIV_W 3U //!< Width of the PLL DIV clk. +#define DSC_CLK_SRC_W 3U //!< Width of DSC CLK src +#define DSC_AI_TYPE_W 2U //!< Width of the AI type +#define DSC_CLK_MODE_W 3U //!< Width of the DSC clock slice mode +#define DSC_NUM_LPCG_W 8U //!< Width of the num lpcg + +#define MEM_NORMAL 0U +#define MEM_ESILICON 1U + +#define SLICE_SMALL_MULTI_MAX_DIV 31U +#define SLICE_LARGE_MAX_DIV 255U + +/*! + * @name Short defines for sc_pm_clk_parent_t + */ +/** @{ */ +#define XTAL 0U /*! < Parent is XTAL. */ +#define PLL0 1U /*! < Parent is PLL0 */ +#define PLL1 2U /*! < Parent is PLL1 or PLL0/2 */ +#define PLL2 3U /*! < Parent in PLL2 or PLL0/4 */ +#define BYPS 4U /*! < Parent is a bypass clock. */ +#define DUMMY 5U /*! < DUMMY entry */ +/** @} */ + +/*! + * @name Defines for sc_pm_clk_mode_t + */ +/** @{ */ +#define SC_PM_CLK_MODE_ROM_INIT 0U /*!< Clock is initialized by ROM */ +#define SC_PM_CLK_MODE_OFF 1U /*!< Clock is disabled */ +#define SC_PM_CLK_MODE_ON 2U /*!< Clock is enabled */ +#define SC_PM_CLK_MODE_AUTOGATE_SW 3U /*!< Clock is in SW autogate mode */ +#define SC_PM_CLK_MODE_AUTOGATE_HW 4U /*!< Clock is in HW autogate mode */ +#define SC_PM_CLK_MODE_AUTOGATE_SW_HW 5U /*!< Clock is in SW-HW autogate mode */ +/** @} */ + +/*! + * This define is used to access DSC registers. + */ +#ifdef NO_DEVICE_ACCESS + #define DSC_BASE_ADDR(X) ((DSC_Type*) (temp_dsc + ((X) * DSC_SIZE))) +#else + #define DSC_BASE_ADDR(X) ((DSC_Type*) (MSI0_BASE + ((X) * DSC_SIZE))) +#endif + +/*! Define to fill in a dsc_clk_info_t variable PLL_DIV set */ +#define CNFO(R, S, G, RL, PD, CM, CT, I, DIV) \ + { \ + .rate = (R), \ + .src = (S), \ + .sw_gate = (G), \ + .rate_locked = (RL), \ + .pd = (PD), \ + .clk_mode = (SC_PM_CLK_MODE_##CM), \ + .clk_type = (DSC_##CT), \ + .index = (I), \ + .pll_div = (DIV) \ + } + +/* Types */ + +/*! + * This type is used to declare a clock mode. + */ +typedef uint8_t sc_pm_clk_mode_t; + +typedef uint8_t dsc_pdom_t; + +#define DSC_SMALL_SINGLE_CLK_ROOT 0U +#define DSC_LARGE_SINGLE_CLK_ROOT 1U +#define DSC_MULTI_CLK_ROOT 2U +#define DSC_CPU_CLK_ROOT 3U +#define DSC_GPR_CLK_ROOT 4U +#define DSC_PLL_DUMMY 5U +#define DSC_BYPASS 6U +#define DSC_XTAL 7U +#define DSC_PLL_DIG 9U +#define DSC_PLL_PERF 10U +#define DSC_PLL_AV 11U +#define DSC_PLL_DIG_AUD 12U + +typedef uint8_t dsc_clk_type_t; + +typedef uint32_t dsc_gpr_t; + +/*! + * This type is used to store static constant info about the clocks in + * the subsystem. The clock indexs in the ss_rsrc_info references + * this. + */ +typedef struct +{ + sc_pm_clock_rate_t rate; //!< Default clock rate + sc_pm_clk_parent_t src : DSC_CLK_SRC_W; //!< Clock source for the slice + uint8_t pll_div : DSC_PLLDIV_W; //!< Divided PLL is the source for the slice + uint8_t sw_gate : SC_BOOL_W; //!< 0=no lpcg, 1=lpcg + uint8_t rate_locked : SC_BOOL_W; //!< 0=user rated, 1=locked + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain clock feeds + sc_pm_clk_mode_t clk_mode : SC_PM_CLOCK_MODE_W; //!< Default clock mode when SS is powered up. + dsc_clk_type_t clk_type : DSC_CLK_TYPE_W; //!< Type of clock slice + uint8_t index : DSC_INDEX_W; //!< Index into clock/PLL type +} dsc_clk_info_t; + +#define AI_NONE 0U +#define AI_COMMON 1U +#define AI_TEMP 2U +#define AI_TEMP_SEQ 3U + +typedef uint8_t dsc_ai_type_t; + +typedef struct +{ + uint32_t div0; + uint32_t div1; + uint32_t div2; + uint32_t div3; +} dsc_mslice_div_t; + +/* Externs */ + +#ifdef NO_DEVICE_ACCESS + /*! + * This variable is used to access fake DSCs. + */ + extern uint8_t temp_dsc[]; + #define HAS_TEMP_DSC + /*! + * This variable is used to access fake DSC AIs. + */ + extern uint32_t temp_dsc_ai[][32][32]; + extern sc_bool_t temp_ai_direct; + #define HAS_TEMP_DSC_AI + + #define DSC_AI_DIRECT(X) temp_ai_direct = (X) +#else + #define DSC_AI_DIRECT(X) NOP +#endif + +/* Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * This function initializes the DSC AON HW. It's mostly used to initialize + * fake HW for the simulation builds to have the correct reset state. + * + * @param[in] dsc DSC to initialize + * @param[in] ai_type type of analog interface + * + * This is only called once at startup. It is not a reset and should not be + * called when a subsystem is powered up. + */ +void DSC_Init(sc_dsc_t dsc, dsc_ai_type_t ai_type); + +void DSC_Reset(uint8_t pd, sc_dsc_t dsc, uint32_t reset_mask); +void DSC_SetReset(sc_dsc_t dsc, uint32_t val, sc_bool_t enable); +uint32_t DSC_GetReset(sc_dsc_t dsc); +void DSC_SetMemTiming(sc_dsc_t dsc, sc_bool_t hs_enable, + sc_bool_t ls_enable, uint8_t pd); +void DSC_SetGPRControl(sc_dsc_t dsc, uint32_t gpr_num, uint32_t gpr_val, + sc_bool_t enable); +void DSC_InsGPRControl(sc_dsc_t dsc, uint32_t gpr_num, uint32_t gpr_pos, + uint32_t mask, uint32_t val); +uint32_t DSC_GetGPRControl(sc_dsc_t dsc, uint32_t gpr_num); +uint32_t DSC_GetGPRStatus(sc_dsc_t dsc, uint32_t gpr_num); +void DSC_WaitGPRStatus(sc_dsc_t dsc, uint32_t gpr_num, uint32_t gpr_mask, + uint32_t gpr_val); +void DSC_EnableIrq(sc_dsc_t dsc, uint64_t mask, sc_bool_t enable); +uint64_t DSC_GetIrqPending(sc_dsc_t dsc); +uint64_t DSC_GetIrqStatus(sc_dsc_t dsc); + +void DSC_EnableAnamixAI(sc_dsc_t dsc); +sc_bool_t DSC_AnamixAIEnabled(sc_dsc_t dsc); +#ifndef NO_ANAMIX +void DSC_DisableAnamixAI(sc_dsc_t dsc); +void DSC_EnablePhymixAI(sc_dsc_t dsc); +#endif + +#ifdef ANAMIX_BROADCAST +void DSC_AIBroadcastWrite(sc_dsc_t dsc, uint32_t toggle, uint16_t addr, + uint32_t data); +#endif +void DSC_AIRegisterWrite(sc_dsc_t dsc, uint8_t src_sel, uint16_t addr, + uint32_t data); +void DSC_AIRegisterRead(sc_dsc_t dsc, uint8_t src_sel, uint16_t addr, + uint32_t *data); + +/** @} */ + +/*! + * @name Power Functions + * @{ + */ +sc_bool_t DSC_PdEnabled(uint8_t pd, sc_dsc_t dsc); +void DSC_PdEnable(uint8_t pd, sc_dsc_t dsc, uint8_t ss_pd, + uint32_t reset_mask, sc_bool_t reboot); +void DSC_PdDisable(uint8_t pd, sc_dsc_t dsc, uint8_t ss_pd, + uint32_t reset_mask, sc_bool_t reboot); +void DSC_IsolationDisable(sc_dsc_t dsc, uint8_t pd, uint8_t misc, + sc_bool_t enable); + +/** @} */ + +/*! + * @name Clock Functions + * @{ + */ +sc_bool_t DSC_SliceReset(sc_dsc_t dsc, const dsc_clk_info_t *clk_info); +sc_err_t DSC_CheckClockMode(sc_dsc_t dsc, + const dsc_clk_info_t *clk, sc_pm_clk_mode_t mode); +void DSC_SetClockMode(sc_dsc_t dsc, const dsc_clk_info_t *clk, + sc_pm_clk_mode_t mode); +void DSC_ClkSetRate(sc_dsc_t dsc, const dsc_clk_info_t *clk, + uint32_t rate_div, uint32_t parent_rate); +void DSC_MSliceGetDiv(sc_dsc_t dsc, dsc_mslice_div_t *p_mslice_div); +void DSC_MSliceSetDiv(sc_dsc_t dsc, const dsc_mslice_div_t *p_mslice_div); +void DSC_ClkSetParent(sc_dsc_t dsc, const dsc_clk_info_t *clk, + sc_pm_clk_parent_t parent); +sc_pm_clk_parent_t DSC_ClkGetParent(sc_dsc_t dsc, const dsc_clk_info_t *clk); +uint32_t DSC_ClkGetRateDiv(sc_dsc_t dsc, const dsc_clk_info_t *clk); +void DSC_FuncClkToggle(sc_dsc_t dsc, dsc_clk_type_t clk_type, uint32_t val, sc_bool_t enable); + +/** @} */ + +/*! + * @name AI Clock Functions + * @{ + */ +sc_bool_t DSC_AIPllEnabled(sc_dsc_t dsc, uint8_t pll_index, dsc_clk_type_t pll_type); +void DSC_AIPllEnable(sc_dsc_t dsc, uint8_t pll_index, + dsc_clk_type_t pll_type); +uint32_t DSC_AIPllGetRate(sc_dsc_t dsc, uint8_t pll_index, + dsc_clk_type_t pll_type); +uint32_t DSC_AIPllSetRate(sc_dsc_t dsc, uint8_t pll_index, + dsc_clk_type_t pll_type, uint32_t rate, sc_bool_t powered, sc_bool_t ssc_enable); +void DSC_AIPllDisable(sc_dsc_t dsc, uint8_t pll_index, + dsc_clk_type_t pll_type); +uint32_t DSC_CalcBestPllFreqParent(dsc_clk_type_t pll_type, uint32_t rate, + sc_pm_clk_parent_t *parent, sc_bool_t fixed_parent, uint32_t max_div); + +/** @} */ + +/*! + * @name AI Temp Sensor Functions + * @{ + */ + +void DSC_AIPowerTemp(sc_dsc_t dsc, sc_bool_t enable, sc_bool_t run); +void DSC_AITriggerTemp(sc_dsc_t dsc); +void DSC_AISetTemp(sc_dsc_t dsc, uint32_t idx, uint16_t val); +sc_err_t DSC_AIGetTemp(sc_dsc_t dsc, uint32_t idx, uint16_t *val); +void DSC_AIClearTemp(sc_dsc_t dsc, uint32_t idx); +void DSC_AIDisablePanicTemp(sc_dsc_t dsc); + +/** @} */ + +#if defined(DEBUG) || defined(GCOV) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * This function dumps the DSC. It's only used for debug. Should + * only be called if the power domain containing the DSC is powered on. + */ + void DSC_Dump(sc_dsc_t dsc); + + /** @} */ +#endif + +#endif /* DRV_DSC_H */ + +/** @} */ + diff --git a/platform/drivers/gpio/fsl_gpio.h b/platform/drivers/gpio/fsl_gpio.h new file mode 100755 index 0000000..28014d4 --- /dev/null +++ b/platform/drivers/gpio/fsl_gpio.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* This file maps GPIO functions to RGPIO functions. It cannot be used at the + same time as the IGPIO driver! */ + +#ifndef _FSL_GPIO_H_ +#define _FSL_GPIO_H_ + +#include "drivers/rgpio/fsl_rgpio.h" + +#define kGPIO_DigitalInput kRGPIO_DigitalInput +#define kGPIO_DigitalOutput kRGPIO_DigitalOutput + +#define gpio_pin_config_t rgpio_pin_config_t + +#define GPIO_PinInit RGPIO_PinInit +#define GPIO_WritePinOutput RGPIO_WritePinOutput +#define GPIO_SetPinsOutput RGPIO_SetPinsOutput +#define GPIO_ClearPinsOutput RGPIO_ClearPinsOutput +#define GPIO_TogglePinsOutput RGPIO_TogglePinsOutput +#define GPIO_ReadPinInput RGPIO_ReadPinInput +#define GPIO_GetPinsInterruptFlags RGPIO_GetPinsInterruptFlags +#define GPIO_ClearPinsInterruptFlags RGPIO_ClearPinsInterruptFlags + +#endif /* _FSL_GPIO_H_*/ diff --git a/platform/drivers/igpio/Makefile b/platform/drivers/igpio/Makefile new file mode 100755 index 0000000..ee8c054 --- /dev/null +++ b/platform/drivers/igpio/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/igpio/fsl_gpio.o + +DIRS += $(OUT)/drivers/igpio + diff --git a/platform/drivers/igpio/fsl_gpio.h b/platform/drivers/igpio/fsl_gpio.h new file mode 100755 index 0000000..c704ddc --- /dev/null +++ b/platform/drivers/igpio/fsl_gpio.h @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_GPIO_H_ +#define _FSL_GPIO_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup gpio_driver + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief GPIO driver version 2.0.3. */ +#define FSL_GPIO_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) +/** @} */ + +/*! @brief GPIO direction definition. */ +typedef enum _gpio_pin_direction +{ + kGPIO_DigitalInput = 0U, /*!< Set current pin as digital input.*/ + kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output.*/ +} gpio_pin_direction_t; + +/*! @brief GPIO interrupt mode definition. */ +typedef enum _gpio_interrupt_mode +{ + kGPIO_NoIntmode = 0U, /*!< Set current pin general IO functionality.*/ + kGPIO_IntLowLevel = 1U, /*!< Set current pin interrupt is low-level sensitive.*/ + kGPIO_IntHighLevel = 2U, /*!< Set current pin interrupt is high-level sensitive.*/ + kGPIO_IntRisingEdge = 3U, /*!< Set current pin interrupt is rising-edge sensitive.*/ + kGPIO_IntFallingEdge = 4U, /*!< Set current pin interrupt is falling-edge sensitive.*/ + kGPIO_IntRisingOrFallingEdge = 5U, /*!< Enable the edge select bit to override the ICR register's configuration.*/ +} gpio_interrupt_mode_t; + +/*! @brief GPIO Init structure definition. */ +typedef struct _gpio_pin_config +{ + gpio_pin_direction_t direction; /*!< Specifies the pin direction. */ + uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */ + gpio_interrupt_mode_t + interruptMode; /*!< Specifies the pin interrupt mode, a value of @ref gpio_interrupt_mode_t. */ +} gpio_pin_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name GPIO Initialization and Configuration functions + * @{ + */ + +/*! + * @brief Initializes the GPIO peripheral according to the specified + * parameters in the initConfig. + * + * @param base GPIO base pointer. + * @param pin Specifies the pin number + * @param Config pointer to a @ref gpio_pin_config_t structure that + * contains the configuration information. + */ +void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config); +/** @} */ + +/*! + * @name GPIO Reads and Write Functions + * @{ + */ + +/*! + * @brief Sets the output level of the individual GPIO pin to logic 1 or 0. + * + * @param base GPIO base pointer. + * @param pin GPIO port pin number. + * @param output GPIOpin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output); + +/*! + * @brief Sets the output level of the individual GPIO pin to logic 1 or 0. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinWrite. + */ +static inline void GPIO_WritePinOutput(GPIO_Type *base, uint32_t pin, uint8_t output) +{ + GPIO_PinWrite(base, pin, output); +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 1. + * + * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortSet(GPIO_Type *base, uint32_t mask) +{ +#if (defined(FSL_FEATURE_IGPIO_HAS_DR_SET) && (FSL_FEATURE_IGPIO_HAS_DR_SET == 1)) + base->DR_SET = mask; +#else + base->DR |= mask; +#endif /* FSL_FEATURE_IGPIO_HAS_DR_SET */ +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 1. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortSet. + */ +static inline void GPIO_SetPinsOutput(GPIO_Type *base, uint32_t mask) +{ + GPIO_PortSet(base, mask); +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 0. + * + * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortClear(GPIO_Type *base, uint32_t mask) +{ +#if (defined(FSL_FEATURE_IGPIO_HAS_DR_CLEAR) && (FSL_FEATURE_IGPIO_HAS_DR_CLEAR == 1)) + base->DR_CLEAR = mask; +#else + base->DR &= ~mask; +#endif /* FSL_FEATURE_IGPIO_HAS_DR_CLEAR */ +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 0. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortClear. + */ +static inline void GPIO_ClearPinsOutput(GPIO_Type *base, uint32_t mask) +{ + GPIO_PortClear(base, mask); +} + +/*! + * @brief Reverses the current output logic of the multiple GPIO pins. + * + * @param base GPIO peripheral base pointer (GPIO1, GPIO2, GPIO3, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortToggle(GPIO_Type *base, uint32_t mask) +{ +#if (defined(FSL_FEATURE_IGPIO_HAS_DR_TOGGLE) && (FSL_FEATURE_IGPIO_HAS_DR_TOGGLE == 1)) + base->DR_TOGGLE = mask; +#endif /* FSL_FEATURE_IGPIO_HAS_DR_TOGGLE */ +} + +/*! + * @brief Reads the current input value of the GPIO port. + * + * @param base GPIO base pointer. + * @param pin GPIO port pin number. + * @retval GPIO port input value. + */ +static inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t pin) +{ + assert(pin < 32U); + + return (((base->DR) >> pin) & 0x1U); +} + +/*! + * @brief Reads the current input value of the GPIO port. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinRead. + */ +static inline uint32_t GPIO_ReadPinInput(GPIO_Type *base, uint32_t pin) +{ + return GPIO_PinRead(base, pin); +} +/** @} */ + +/*! + * @name GPIO Reads Pad Status Functions + * @{ + */ + +/*! + * @brief Reads the current GPIO pin pad status. + * + * @param base GPIO base pointer. + * @param pin GPIO port pin number. + * @retval GPIO pin pad status value. + */ +static inline uint8_t GPIO_PinReadPadStatus(GPIO_Type *base, uint32_t pin) +{ + assert(pin < 32U); + + return (uint8_t)(((base->PSR) >> pin) & 0x1U); +} + +/*! + * @brief Reads the current GPIO pin pad status. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinReadPadStatus. + */ +static inline uint8_t GPIO_ReadPadStatus(GPIO_Type *base, uint32_t pin) +{ + return GPIO_PinReadPadStatus(base, pin); +} + +/** @} */ + +/*! + * @name Interrupts and flags management functions + * @{ + */ + +/*! + * @brief Sets the current pin interrupt mode. + * + * @param base GPIO base pointer. + * @param pin GPIO port pin number. + * @param pinInterruptMode pointer to a @ref gpio_interrupt_mode_t structure + * that contains the interrupt mode information. + */ +void GPIO_PinSetInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t pinInterruptMode); + +/*! + * @brief Sets the current pin interrupt mode. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PinSetInterruptConfig. + */ +static inline void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t pinInterruptMode) +{ + GPIO_PinSetInterruptConfig(base, pin, pinInterruptMode); +} + +/*! + * @brief Enables the specific pin interrupt. + * + * @param base GPIO base pointer. + * @param mask GPIO pin number macro. + */ +static inline void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t mask) +{ + base->IMR |= mask; +} + +/*! + * @brief Enables the specific pin interrupt. + * + * @param base GPIO base pointer. + * @param mask GPIO pin number macro. + */ +static inline void GPIO_EnableInterrupts(GPIO_Type *base, uint32_t mask) +{ + GPIO_PortEnableInterrupts(base, mask); +} + +/*! + * @brief Disables the specific pin interrupt. + * + * @param base GPIO base pointer. + * @param mask GPIO pin number macro. + */ +static inline void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t mask) +{ + base->IMR &= ~mask; +} + +/*! + * @brief Disables the specific pin interrupt. + * @deprecated Do not use this function. It has been superceded by @ref GPIO_PortDisableInterrupts. + */ +static inline void GPIO_DisableInterrupts(GPIO_Type *base, uint32_t mask) +{ + GPIO_PortDisableInterrupts(base, mask); +} + +/*! + * @brief Reads individual pin interrupt status. + * + * @param base GPIO base pointer. + * @retval current pin interrupt status flag. + */ +static inline uint32_t GPIO_PortGetInterruptFlags(GPIO_Type *base) +{ + return base->ISR; +} + +/*! + * @brief Reads individual pin interrupt status. + * + * @param base GPIO base pointer. + * @retval current pin interrupt status flag. + */ +static inline uint32_t GPIO_GetPinsInterruptFlags(GPIO_Type *base) +{ + return GPIO_PortGetInterruptFlags(base); +} + +/*! + * @brief Clears pin interrupt flag. Status flags are cleared by + * writing a 1 to the corresponding bit position. + * + * @param base GPIO base pointer. + * @param mask GPIO pin number macro. + */ +static inline void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t mask) +{ + base->ISR = mask; +} + +/*! + * @brief Clears pin interrupt flag. Status flags are cleared by + * writing a 1 to the corresponding bit position. + * + * @param base GPIO base pointer. + * @param mask GPIO pin number macro. + */ +static inline void GPIO_ClearPinsInterruptFlags(GPIO_Type *base, uint32_t mask) +{ + GPIO_PortClearInterruptFlags(base, mask); +} +/** @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ + +#endif /* _FSL_GPIO_H_*/ diff --git a/platform/drivers/lmem/Makefile b/platform/drivers/lmem/Makefile new file mode 100755 index 0000000..103d4bc --- /dev/null +++ b/platform/drivers/lmem/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/lmem/fsl_lmem_cache.o + +DIRS += $(OUT)/drivers/lmem + diff --git a/platform/drivers/lmem/fsl_lmem_cache.h b/platform/drivers/lmem/fsl_lmem_cache.h new file mode 100755 index 0000000..cda24be --- /dev/null +++ b/platform/drivers/lmem/fsl_lmem_cache.h @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_LMEM_CACHE_H_ +#define _FSL_LMEM_CACHE_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lmem_cache + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief LMEM controller driver version 2.1.2. */ +#define FSL_LMEM_DRIVER_VERSION (MAKE_VERSION(2, 1, 2)) +/** @} */ + +#define LMEM_CACHE_LINE_SIZE (0x10U) /*!< Cache line is 16-bytes. */ +#define LMEM_CACHE_SIZE_ONEWAY (4096U) /*!< Cache size is 4K-bytes one way. */ + +/*! @brief LMEM cache mode options. */ +typedef enum _lmem_cache_mode +{ + kLMEM_NonCacheable = 0x0U, /*!< Cache mode: non-cacheable. */ + kLMEM_CacheWriteThrough = 0x2U, /*!< Cache mode: write-through. */ + kLMEM_CacheWriteBack = 0x3U /*!< Cache mode: write-back. */ +} lmem_cache_mode_t; + +/*! @brief LMEM cache regions. */ +typedef enum _lmem_cache_region +{ + kLMEM_CacheRegion15 = 0U, /*!< Cache Region 15. */ + kLMEM_CacheRegion14, /*!< Cache Region 14. */ + kLMEM_CacheRegion13, /*!< Cache Region 13. */ + kLMEM_CacheRegion12, /*!< Cache Region 12. */ + kLMEM_CacheRegion11, /*!< Cache Region 11. */ + kLMEM_CacheRegion10, /*!< Cache Region 10. */ + kLMEM_CacheRegion9, /*!< Cache Region 9. */ + kLMEM_CacheRegion8, /*!< Cache Region 8. */ + kLMEM_CacheRegion7, /*!< Cache Region 7. */ + kLMEM_CacheRegion6, /*!< Cache Region 6. */ + kLMEM_CacheRegion5, /*!< Cache Region 5. */ + kLMEM_CacheRegion4, /*!< Cache Region 4. */ + kLMEM_CacheRegion3, /*!< Cache Region 3. */ + kLMEM_CacheRegion2, /*!< Cache Region 2. */ + kLMEM_CacheRegion1, /*!< Cache Region 1. */ + kLMEM_CacheRegion0 /*!< Cache Region 0. */ +} lmem_cache_region_t; + +/*! @brief LMEM cache line command. */ +typedef enum _lmem_cache_line_command +{ + kLMEM_CacheLineSearchReadOrWrite = 0U, /*!< Cache line search and read or write. */ + kLMEM_CacheLineInvalidate, /*!< Cache line invalidate. */ + kLMEM_CacheLinePush, /*!< Cache line push. */ + kLMEM_CacheLineClear, /*!< Cache line clear. */ +} lmem_cache_line_command_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Local Memory Processor Code Bus Cache Control + *@{ + */ + +/*! + * @brief Enables/disables the processor code bus cache. + * This function enables/disables the cache. The function first invalidates the entire cache + * and then enables/disables both the cache and write buffers. + * + * @param base LMEM peripheral base address. + * @param enable The enable or disable flag. + * true - enable the code cache. + * false - disable the code cache. + */ +void LMEM_EnableCodeCache(LMEM_Type *base, bool enable); + +/*! + * @brief Enables/disables the processor code bus write buffer. + * + * @param base LMEM peripheral base address. + * @param enable The enable or disable flag. + * true - enable the code bus write buffer. + * false - disable the code bus write buffer. + */ +static inline void LMEM_EnableCodeWriteBuffer(LMEM_Type *base, bool enable) +{ + if (enable) + { + base->PCCCR |= LMEM_PCCCR_ENWRBUF_MASK; + } + else + { + base->PCCCR &= ~LMEM_PCCCR_ENWRBUF_MASK; + } +} + +/*! + * @brief Invalidates the processor code bus cache. + * This function invalidates the cache both ways, which means that + * it unconditionally clears valid bits and modifies bits of a cache entry. + * + * @param base LMEM peripheral base address. + */ +void LMEM_CodeCacheInvalidateAll(LMEM_Type *base); + +/*! + * @brief Pushes all modified lines in the processor code bus cache. + * This function pushes all modified lines in both ways in the entire cache. + * It pushes a cache entry if it is valid and modified and clears the modified bit. If + * the entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + */ +void LMEM_CodeCachePushAll(LMEM_Type *base); + +/*! + * @brief Clears the processor code bus cache. + * This function clears the entire cache and pushes (flushes) and + * invalidates the operation. + * Clear - Pushes a cache entry if it is valid and modified, then clears the valid and + * modified bits. If the entry is not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + */ +void LMEM_CodeCacheClearAll(LMEM_Type *base); + +/*! + * @brief Invalidates a specific line in the processor code bus cache. + * This function invalidates a specific line in the cache + * based on the physical address passed in by the user. + * Invalidate - Unconditionally clears valid and modified bits of a cache entry. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + */ +void LMEM_CodeCacheInvalidateLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Invalidates multiple lines in the processor code bus cache. + * This function invalidates multiple lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half the + * cache, the function performs an entire cache invalidate function, which is + * more efficient than invalidating the cache line-by-line. + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Invalidate - Unconditionally clear valid and modified bits of a cache entry. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_CodeCacheInvalidateMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +/*! + * @brief Pushes a specific modified line in the processor code bus cache. + * This function pushes a specific modified line based on the physical address passed in + * by the user. + * Push - Push a cache entry if it is valid and modified, then clear the modified bit. If the + * entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + */ +void LMEM_CodeCachePushLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Pushes multiple modified lines in the processor code bus cache. + * This function pushes multiple modified lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half of the + * cache, the function performs an cache push function, which is + * more efficient than pushing the modified lines in the cache line-by-line. + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Push - Push a cache entry if it is valid and modified, then clear the modified bit. If + * the entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_CodeCachePushMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +/*! + * @brief Clears a specific line in the processor code bus cache. + * This function clears a specific line based on the physical address passed in + * by the user. + * Clear - Push a cache entry if it is valid and modified, then clear the valid and + * modify bits. If entry not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + */ +void LMEM_CodeCacheClearLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Clears multiple lines in the processor code bus cache. + * This function clears multiple lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half the total amount of + * cache, the function performs a cache clear function which is + * more efficient than clearing the lines in the cache line-by-line. + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Clear - Push a cache entry if it is valid and modified, then clear the valid and + * modify bits. If entry not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_CodeCacheClearMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +#if (!defined(FSL_FEATURE_LMEM_SUPPORT_ICACHE_DEMOTE_REMOVE)) || !FSL_FEATURE_LMEM_SUPPORT_ICACHE_DEMOTE_REMOVE +/*! + * @brief Demotes the cache mode of a region in processor code bus cache. + * This function allows the user to demote the cache mode of a region within the device's + * memory map. Demoting the cache mode reduces the cache function applied to a memory + * region from write-back to write-through to non-cacheable. The function checks to see + * if the requested cache mode is higher than or equal to the current cache mode, and if + * so, returns an error. After a region is demoted, its cache mode can only be raised + * by a reset, which returns it to its default state which is the highest cache configure for + * each region. + * To maintain cache coherency, changes to the cache mode should be completed while the + * address space being changed is not being accessed or the cache is disabled. Before a + * cache mode change, this function completes a cache clear all command to push and invalidate any + * cache entries that may have changed. + * + * @param base LMEM peripheral base address. + * @param region The desired region to demote of type lmem_cache_region_t. + * @param cacheMode The new, demoted cache mode of type lmem_cache_mode_t. + * @return The execution result. + * kStatus_Success The cache demote operation is successful. + * kStatus_Fail The cache demote operation is failure. + */ +status_t LMEM_CodeCacheDemoteRegion(LMEM_Type *base, lmem_cache_region_t region, lmem_cache_mode_t cacheMode); +#endif /* FSL_FEATURE_LMEM_SUPPORT_ICACHE_DEMOTE_REMOVE */ + +/** @} */ + +#if FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE +/*! + * @name Local Memory Processor System Bus Cache Control + *@{ + */ + +/*! + * @brief Enables/disables the processor system bus cache. + * This function enables/disables the cache. It first invalidates the entire cache, + * then enables /disable both the cache and write buffer. + * + * @param base LMEM peripheral base address. + * @param enable The enable or disable flag. + * true - enable the system cache. + * false - disable the system cache. + */ +void LMEM_EnableSystemCache(LMEM_Type *base, bool enable); + +/*! + * @brief Enables/disables the processor system bus write buffer. + * + * @param base LMEM peripheral base address. + * @param enable The enable or disable flag. + * true - enable the system bus write buffer. + * false - disable the system bus write buffer. + */ +static inline void LMEM_EnableSystemWriteBuffer(LMEM_Type *base, bool enable) +{ + if (enable) + { + base->PSCCR |= LMEM_PSCCR_ENWRBUF_MASK; + } + else + { + base->PSCCR &= ~LMEM_PSCCR_ENWRBUF_MASK; + } +} + +/*! + * @brief Invalidates the processor system bus cache. + * This function invalidates the entire cache both ways. + * Invalidate - Unconditionally clear valid and modify bits of a cache entry + * + * @param base LMEM peripheral base address. + */ +void LMEM_SystemCacheInvalidateAll(LMEM_Type *base); + +/*! + * @brief Pushes all modified lines in the processor system bus cache. + * This function pushes all modified lines in both ways (the entire cache). + * Push - Push a cache entry if it is valid and modified, then clear the modify bit. If + * the entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + */ +void LMEM_SystemCachePushAll(LMEM_Type *base); + +/*! + * @brief Clears the entire processor system bus cache. + * This function clears the entire cache, which is a push (flush) and + * invalidate operation. + * Clear - Push a cache entry if it is valid and modified, then clear the valid and + * modify bits. If the entry is not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + */ +void LMEM_SystemCacheClearAll(LMEM_Type *base); + +/*! + * @brief Invalidates a specific line in the processor system bus cache. + * This function invalidates a specific line in the cache + * based on the physical address passed in by the user. + * Invalidate - Unconditionally clears valid and modify bits of a cache entry. + * + * @param base LMEM peripheral base address. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param address The physical address of the cache line. + */ +void LMEM_SystemCacheInvalidateLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Invalidates multiple lines in the processor system bus cache. + * This function invalidates multiple lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half of the + * cache, the function performs an entire cache invalidate function (which is + * more efficient than invalidating the cache line-by-line). + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Invalidate - Unconditionally clear valid and modify bits of a cache entry + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_SystemCacheInvalidateMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +/*! + * @brief Pushes a specific modified line in the processor system bus cache. + * This function pushes a specific modified line based on the physical address passed in + * by the user. + * Push - Push a cache entry if it is valid and modified, then clear the modify bit. If + * the entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + */ +void LMEM_SystemCachePushLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Pushes multiple modified lines in the processor system bus cache. + * This function pushes multiple modified lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half of the + * cache, the function performs an entire cache push function (which is + * more efficient than pushing the modified lines in the cache line-by-line). + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Push - Push a cache entry if it is valid and modified, then clear the modify bit. If + * the entry is not valid or not modified, leave as is. This action does not clear the valid + * bit. A cache push is synonymous with a cache flush. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_SystemCachePushMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +/*! + * @brief Clears a specific line in the processor system bus cache. + * This function clears a specific line based on the physical address passed in + * by the user. + * Clear - Push a cache entry if it is valid and modified, then clear the valid and + * modify bits. If the entry is not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + */ +void LMEM_SystemCacheClearLine(LMEM_Type *base, uint32_t address); + +/*! + * @brief Clears multiple lines in the processor system bus cache. + * This function clears multiple lines in the cache + * based on the physical address and length in bytes passed in by the + * user. If the function detects that the length meets or exceeds half of the + * cache, the function performs an entire cache clear function (which is + * more efficient than clearing the lines in the cache line-by-line). + * Because the cache consists of two ways and line commands based on the physical address searches both ways, + * check half the total amount of cache. + * Clear - Push a cache entry if it is valid and modified, then clear the valid and + * modify bits. If the entry is not valid or not modified, clear the valid bit. + * + * @param base LMEM peripheral base address. + * @param address The physical address of the cache line. Should be 16-byte aligned address. + * If not, it is changed to the 16-byte aligned memory address. + * @param length The length in bytes of the total amount of cache lines. + */ +void LMEM_SystemCacheClearMultiLines(LMEM_Type *base, uint32_t address, uint32_t length); + +/*! + * @brief Demotes the cache mode of a region in the processor system bus cache. + * This function allows the user to demote the cache mode of a region within the device's + * memory map. Demoting the cache mode reduces the cache function applied to a memory + * region from write-back to write-through to non-cacheable. The function checks to see + * if the requested cache mode is higher than or equal to the current cache mode, and if + * so, returns an error. After a region is demoted, its cache mode can only be raised + * by a reset, which returns it to its default state which is the highest cache configure + * for each region. + * To maintain cache coherency, changes to the cache mode should be completed while the + * address space being changed is not being accessed or the cache is disabled. Before a + * cache mode change, this function completes a cache clear all command to push and invalidate any + * cache entries that may have changed. + * + * @param base LMEM peripheral base address. + * @param region The desired region to demote of type lmem_cache_region_t. + * @param cacheMode The new, demoted cache mode of type lmem_cache_mode_t. + * @return The execution result. + * kStatus_Success The cache demote operation is successful. + * kStatus_Fail The cache demote operation is failure. + */ +status_t LMEM_SystemCacheDemoteRegion(LMEM_Type *base, lmem_cache_region_t region, lmem_cache_mode_t cacheMode); + +/** @} */ +#endif /* FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* _FSL_LMEM_CACHE_H_*/ diff --git a/platform/drivers/lpcg/Makefile b/platform/drivers/lpcg/Makefile new file mode 100755 index 0000000..9b6aec0 --- /dev/null +++ b/platform/drivers/lpcg/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/lpcg/fsl_lpcg.o + +DIRS += $(OUT)/drivers/lpcg + diff --git a/platform/drivers/lpcg/fsl_lpcg.h b/platform/drivers/lpcg/fsl_lpcg.h new file mode 100755 index 0000000..0474d80 --- /dev/null +++ b/platform/drivers/lpcg/fsl_lpcg.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_LPCG_H +#define DRV_LPCG_H + +/*! + * @addtogroup lpcg_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "fsl_device_registers.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +void LPCG_ClockOff(uint32_t lpcg_addr, uint8_t clk); +void LPCG_ClockOn(uint32_t lpcg_addr, uint8_t clk); +void LPCG_ClockAutoGate(uint32_t lpcg_addr, uint8_t clk); +void LPCG_AllClockOff(uint32_t lpcg_addr); +void LPCG_AllClockOn(uint32_t lpcg_addr); +void LPCG_AllClockAutoGate(uint32_t lpcg_addr); +void LPCG_AllClockAutoGateMasked(uint32_t lpcg_addr, uint32_t mask); + +#endif /* DRV_LPCG_H */ + +/** @} */ + diff --git a/platform/drivers/lpi2c/Makefile b/platform/drivers/lpi2c/Makefile new file mode 100644 index 0000000..44e180d --- /dev/null +++ b/platform/drivers/lpi2c/Makefile @@ -0,0 +1,4 @@ + +OBJS += $(OUT)/drivers/lpi2c/fsl_lpi2c.o + +DIRS += $(OUT)/drivers/lpi2c diff --git a/platform/drivers/lpi2c/fsl_lpi2c.h b/platform/drivers/lpi2c/fsl_lpi2c.h new file mode 100755 index 0000000..16361b4 --- /dev/null +++ b/platform/drivers/lpi2c/fsl_lpi2c.h @@ -0,0 +1,1268 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_LPI2C_H_ +#define _FSL_LPI2C_H_ + +#include +#include "fsl_device_registers.h" +#include "fsl_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @addtogroup lpi2c + * @{ + */ + +/*! @file */ + +/*! @name Driver version */ +/** @{ */ +/*! @brief LPI2C driver version 2.1.11. */ +#define FSL_LPI2C_DRIVER_VERSION (MAKE_VERSION(2, 1, 11)) +/** @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef I2C_RETRY_TIMES +#define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +/*! @brief LPI2C status return codes. */ +enum +{ + kStatus_LPI2C_Busy = MAKE_STATUS(kStatusGroup_LPI2C, 0), /*!< The master is already performing a transfer. */ + kStatus_LPI2C_Idle = MAKE_STATUS(kStatusGroup_LPI2C, 1), /*!< The slave driver is idle. */ + kStatus_LPI2C_Nak = MAKE_STATUS(kStatusGroup_LPI2C, 2), /*!< The slave device sent a NAK in response to a byte. */ + kStatus_LPI2C_FifoError = MAKE_STATUS(kStatusGroup_LPI2C, 3), /*!< FIFO under run or overrun. */ + kStatus_LPI2C_BitError = MAKE_STATUS(kStatusGroup_LPI2C, 4), /*!< Transferred bit was not seen on the bus. */ + kStatus_LPI2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_LPI2C, 5), /*!< Arbitration lost error. */ + kStatus_LPI2C_PinLowTimeout = + MAKE_STATUS(kStatusGroup_LPI2C, 6), /*!< SCL or SDA were held low longer than the timeout. */ + kStatus_LPI2C_NoTransferInProgress = + MAKE_STATUS(kStatusGroup_LPI2C, 7), /*!< Attempt to abort a transfer when one is not in progress. */ + kStatus_LPI2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_LPI2C, 8), /*!< DMA request failed. */ + kStatus_LPI2C_Timeout = MAKE_STATUS(kStatusGroup_LPI2C, 9), /*!< Timeout polling status flags. */ +}; + +/*! @} */ + +/*! + * @addtogroup lpi2c_master_driver + * @{ + */ + +/*! + * @brief LPI2C master peripheral flags. + * + * The following status register flags can be cleared: + * - #kLPI2C_MasterEndOfPacketFlag + * - #kLPI2C_MasterStopDetectFlag + * - #kLPI2C_MasterNackDetectFlag + * - #kLPI2C_MasterArbitrationLostFlag + * - #kLPI2C_MasterFifoErrFlag + * - #kLPI2C_MasterPinLowTimeoutFlag + * - #kLPI2C_MasterDataMatchFlag + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @note These enums are meant to be OR'd together to form a bit mask. + */ +enum +{ + kLPI2C_MasterTxReadyFlag = LPI2C_MSR_TDF_MASK, /*!< Transmit data flag */ + kLPI2C_MasterRxReadyFlag = LPI2C_MSR_RDF_MASK, /*!< Receive data flag */ + kLPI2C_MasterEndOfPacketFlag = LPI2C_MSR_EPF_MASK, /*!< End Packet flag */ + kLPI2C_MasterStopDetectFlag = LPI2C_MSR_SDF_MASK, /*!< Stop detect flag */ + kLPI2C_MasterNackDetectFlag = LPI2C_MSR_NDF_MASK, /*!< NACK detect flag */ + kLPI2C_MasterArbitrationLostFlag = LPI2C_MSR_ALF_MASK, /*!< Arbitration lost flag */ + kLPI2C_MasterFifoErrFlag = LPI2C_MSR_FEF_MASK, /*!< FIFO error flag */ + kLPI2C_MasterPinLowTimeoutFlag = LPI2C_MSR_PLTF_MASK, /*!< Pin low timeout flag */ + kLPI2C_MasterDataMatchFlag = LPI2C_MSR_DMF_MASK, /*!< Data match flag */ + kLPI2C_MasterBusyFlag = LPI2C_MSR_MBF_MASK, /*!< Master busy flag */ + kLPI2C_MasterBusBusyFlag = LPI2C_MSR_BBF_MASK /*!< Bus busy flag */ +}; + +/*! @brief Direction of master and slave transfers. */ +typedef enum _lpi2c_direction +{ + kLPI2C_Write = 0U, /*!< Master transmit. */ + kLPI2C_Read = 1U /*!< Master receive. */ +} lpi2c_direction_t; + +/*! @brief LPI2C pin configuration. */ +typedef enum _lpi2c_master_pin_config +{ + kLPI2C_2PinOpenDrain = 0x0U, /*!< LPI2C Configured for 2-pin open drain mode */ + kLPI2C_2PinOutputOnly = 0x1U, /*!< LPI2C Configured for 2-pin output only mode (ultra-fast mode) */ + kLPI2C_2PinPushPull = 0x2U, /*!< LPI2C Configured for 2-pin push-pull mode */ + kLPI2C_4PinPushPull = 0x3U, /*!< LPI2C Configured for 4-pin push-pull mode */ + kLPI2C_2PinOpenDrainWithSeparateSlave = + 0x4U, /*!< LPI2C Configured for 2-pin open drain mode with separate LPI2C slave */ + kLPI2C_2PinOutputOnlyWithSeparateSlave = + 0x5U, /*!< LPI2C Configured for 2-pin output only mode(ultra-fast mode) with separate LPI2C slave */ + kLPI2C_2PinPushPullWithSeparateSlave = + 0x6U, /*!< LPI2C Configured for 2-pin push-pull mode with separate LPI2C slave */ + kLPI2C_4PinPushPullWithInvertedOutput = 0x7U /*!< LPI2C Configured for 4-pin push-pull mode(inverted outputs) */ +} lpi2c_master_pin_config_t; + +/*! @brief LPI2C master host request selection. */ +typedef enum _lpi2c_host_request_source +{ + kLPI2C_HostRequestExternalPin = 0x0U, /*!< Select the LPI2C_HREQ pin as the host request input */ + kLPI2C_HostRequestInputTrigger = 0x1U, /*!< Select the input trigger as the host request input */ +} lpi2c_host_request_source_t; + +/*! @brief LPI2C master host request pin polarity configuration. */ +typedef enum _lpi2c_host_request_polarity +{ + kLPI2C_HostRequestPinActiveLow = 0x0U, /*!< Configure the LPI2C_HREQ pin active low */ + kLPI2C_HostRequestPinActiveHigh = 0x1U /*!< Configure the LPI2C_HREQ pin active high */ +} lpi2c_host_request_polarity_t; + +/*! + * @brief Structure with settings to initialize the LPI2C master module. + * + * This structure holds configuration settings for the LPI2C peripheral. To initialize this + * structure to reasonable defaults, call the LPI2C_MasterGetDefaultConfig() function and + * pass a pointer to your configuration structure instance. + * + * The configuration structure can be made constant so it resides in flash. + */ +typedef struct _lpi2c_master_config +{ + bool enableMaster; /*!< Whether to enable master mode. */ + bool enableDoze; /*!< Whether master is enabled in doze mode. */ + bool debugEnable; /*!< Enable transfers to continue when halted in debug mode. */ + bool ignoreAck; /*!< Whether to ignore ACK/NACK. */ + lpi2c_master_pin_config_t pinConfig; /*!< The pin configuration option. */ + uint32_t baudRate_Hz; /*!< Desired baud rate in Hertz. */ + uint32_t busIdleTimeout_ns; /*!< Bus idle timeout in nanoseconds. Set to 0 to disable. */ + uint32_t pinLowTimeout_ns; /*!< Pin low timeout in nanoseconds. Set to 0 to disable. */ + uint8_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SDA pin. Set to 0 to disable. */ + uint8_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SCL pin. Set to 0 to disable. */ + struct + { + bool enable; /*!< Enable host request. */ + lpi2c_host_request_source_t source; /*!< Host request source. */ + lpi2c_host_request_polarity_t polarity; /*!< Host request pin polarity. */ + } hostRequest; /*!< Host request options. */ +} lpi2c_master_config_t; + +/*! @brief LPI2C master data match configuration modes. */ +typedef enum _lpi2c_data_match_config_mode +{ + kLPI2C_MatchDisabled = 0x0U, /*!< LPI2C Match Disabled */ + kLPI2C_1stWordEqualsM0OrM1 = 0x2U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0 OR MATCH1 */ + kLPI2C_AnyWordEqualsM0OrM1 = 0x3U, /*!< LPI2C Match Enabled and any data word equals MATCH0 OR MATCH1 */ + kLPI2C_1stWordEqualsM0And2ndWordEqualsM1 = + 0x4U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0, 2nd data equals MATCH1 */ + kLPI2C_AnyWordEqualsM0AndNextWordEqualsM1 = + 0x5U, /*!< LPI2C Match Enabled and any data word equals MATCH0, next data equals MATCH1 */ + kLPI2C_1stWordAndM1EqualsM0AndM1 = + 0x6U, /*!< LPI2C Match Enabled and 1st data word and MATCH0 equals MATCH0 and MATCH1 */ + kLPI2C_AnyWordAndM1EqualsM0AndM1 = + 0x7U /*!< LPI2C Match Enabled and any data word and MATCH0 equals MATCH0 and MATCH1 */ +} lpi2c_data_match_config_mode_t; + +/*! @brief LPI2C master data match configuration structure. */ +typedef struct _lpi2c_match_config +{ + lpi2c_data_match_config_mode_t matchMode; /*!< Data match configuration setting. */ + bool rxDataMatchOnly; /*!< When set to true, received data is ignored until a successful match. */ + uint32_t match0; /*!< Match value 0. */ + uint32_t match1; /*!< Match value 1. */ +} lpi2c_data_match_config_t; + +/* Forward declaration of the transfer descriptor and handle typedefs. */ +typedef struct _lpi2c_master_transfer lpi2c_master_transfer_t; +typedef struct _lpi2c_master_handle lpi2c_master_handle_t; + +/*! + * @brief Master completion callback function pointer type. + * + * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use + * in the call to LPI2C_MasterTransferCreateHandle(). + * + * @param base The LPI2C peripheral base address. + * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*lpi2c_master_transfer_callback_t)(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + status_t completionStatus, + void *userData); + +/*! + * @brief Transfer option flags. + * + * @note These enumerations are intended to be OR'd together to form a bit mask of options for + * the #_lpi2c_master_transfer::flags field. + */ +enum _lpi2c_master_transfer_flags +{ + kLPI2C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ + kLPI2C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ + kLPI2C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ + kLPI2C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ +}; + +/*! + * @brief Non-blocking transfer descriptor structure. + * + * This structure is used to pass transaction parameters to the LPI2C_MasterTransferNonBlocking() API. + */ +struct _lpi2c_master_transfer +{ + uint32_t flags; /*!< Bit mask of options for the transfer. See enumeration #_lpi2c_master_transfer_flags for + available options. Set to 0 or #kLPI2C_TransferDefaultFlag for normal transfers. */ + uint16_t slaveAddress; /*!< The 7-bit slave address. */ + lpi2c_direction_t direction; /*!< Either #kLPI2C_Read or #kLPI2C_Write. */ + uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ + size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ + void *data; /*!< Pointer to data to transfer. */ + size_t dataSize; /*!< Number of bytes to transfer. */ +}; + +/*! + * @brief Driver handle for master non-blocking APIs. + * @note The contents of this structure are private and subject to change. + */ +struct _lpi2c_master_handle +{ + uint8_t state; /*!< Transfer state machine current state. */ + uint16_t remainingBytes; /*!< Remaining byte count in current state. */ + uint8_t *buf; /*!< Buffer pointer for current state. */ + uint16_t commandBuffer[7]; /*!< LPI2C command sequence. */ + lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ + lpi2c_master_transfer_callback_t completionCallback; /*!< Callback function pointer. */ + void *userData; /*!< Application data passed to callback. */ +}; + +/*! @} */ + +/*! + * @addtogroup lpi2c_slave_driver + * @{ + */ + +/*! + * @brief LPI2C slave peripheral flags. + * + * The following status register flags can be cleared: + * - #kLPI2C_SlaveRepeatedStartDetectFlag + * - #kLPI2C_SlaveStopDetectFlag + * - #kLPI2C_SlaveBitErrFlag + * - #kLPI2C_SlaveFifoErrFlag + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @note These enumerations are meant to be OR'd together to form a bit mask. + */ +enum _lpi2c_slave_flags +{ + kLPI2C_SlaveTxReadyFlag = LPI2C_SSR_TDF_MASK, /*!< Transmit data flag */ + kLPI2C_SlaveRxReadyFlag = LPI2C_SSR_RDF_MASK, /*!< Receive data flag */ + kLPI2C_SlaveAddressValidFlag = LPI2C_SSR_AVF_MASK, /*!< Address valid flag */ + kLPI2C_SlaveTransmitAckFlag = LPI2C_SSR_TAF_MASK, /*!< Transmit ACK flag */ + kLPI2C_SlaveRepeatedStartDetectFlag = LPI2C_SSR_RSF_MASK, /*!< Repeated start detect flag */ + kLPI2C_SlaveStopDetectFlag = LPI2C_SSR_SDF_MASK, /*!< Stop detect flag */ + kLPI2C_SlaveBitErrFlag = LPI2C_SSR_BEF_MASK, /*!< Bit error flag */ + kLPI2C_SlaveFifoErrFlag = LPI2C_SSR_FEF_MASK, /*!< FIFO error flag */ + kLPI2C_SlaveAddressMatch0Flag = LPI2C_SSR_AM0F_MASK, /*!< Address match 0 flag */ + kLPI2C_SlaveAddressMatch1Flag = LPI2C_SSR_AM1F_MASK, /*!< Address match 1 flag */ + kLPI2C_SlaveGeneralCallFlag = LPI2C_SSR_GCF_MASK, /*!< General call flag */ + kLPI2C_SlaveBusyFlag = LPI2C_SSR_SBF_MASK, /*!< Master busy flag */ + kLPI2C_SlaveBusBusyFlag = LPI2C_SSR_BBF_MASK, /*!< Bus busy flag */ +}; + +/*! @brief LPI2C slave address match options. */ +typedef enum _lpi2c_slave_address_match +{ + kLPI2C_MatchAddress0 = 0U, /*!< Match only address 0. */ + kLPI2C_MatchAddress0OrAddress1 = 2U, /*!< Match either address 0 or address 1. */ + kLPI2C_MatchAddress0ThroughAddress1 = 6U, /*!< Match a range of slave addresses from address 0 through address 1. */ +} lpi2c_slave_address_match_t; + +/*! + * @brief Structure with settings to initialize the LPI2C slave module. + * + * This structure holds configuration settings for the LPI2C slave peripheral. To initialize this + * structure to reasonable defaults, call the LPI2C_SlaveGetDefaultConfig() function and + * pass a pointer to your configuration structure instance. + * + * The configuration structure can be made constant so it resides in flash. + */ +typedef struct _lpi2c_slave_config +{ + bool enableSlave; /*!< Enable slave mode. */ + uint8_t address0; /*!< Slave's 7-bit address. */ + uint8_t address1; /*!< Alternate slave 7-bit address. */ + lpi2c_slave_address_match_t addressMatchMode; /*!< Address matching options. */ + bool filterDozeEnable; /*!< Enable digital glitch filter in doze mode. */ + bool filterEnable; /*!< Enable digital glitch filter. */ + bool enableGeneralCall; /*!< Enable general call address matching. */ + struct + { + bool enableAck; /*!< Enables SCL clock stretching during slave-transmit address byte(s) + and slave-receiver address and data byte(s) to allow software to + write the Transmit ACK Register before the ACK or NACK is transmitted. + Clock stretching occurs when transmitting the 9th bit. When + enableAckSCLStall is enabled, there is no need to set either + enableRxDataSCLStall or enableAddressSCLStall. */ + bool enableTx; /*!< Enables SCL clock stretching when the transmit data flag is set + during a slave-transmit transfer. */ + bool enableRx; /*!< Enables SCL clock stretching when receive data flag is set during + a slave-receive transfer. */ + bool enableAddress; /*!< Enables SCL clock stretching when the address valid flag is asserted. */ + } sclStall; + bool ignoreAck; /*!< Continue transfers after a NACK is detected. */ + bool enableReceivedAddressRead; /*!< Enable reading the address received address as the first byte of data. */ + uint32_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SDA signal. */ + uint32_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SCL signal. */ + uint32_t dataValidDelay_ns; /*!< Width in nanoseconds of the data valid delay. */ + uint32_t clockHoldTime_ns; /*!< Width in nanoseconds of the clock hold time. */ +} lpi2c_slave_config_t; + +/*! + * @brief Set of events sent to the callback for non blocking slave transfers. + * + * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together + * events is passed to LPI2C_SlaveTransferNonBlocking() in order to specify which events to enable. + * Then, when the slave callback is invoked, it is passed the current event through its @a transfer + * parameter. + * + * @note These enumerations are meant to be OR'd together to form a bit mask of events. + */ +typedef enum _lpi2c_slave_transfer_event +{ + kLPI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */ + kLPI2C_SlaveTransmitEvent = 0x02U, /*!< Callback is requested to provide data to transmit + (slave-transmitter role). */ + kLPI2C_SlaveReceiveEvent = 0x04U, /*!< Callback is requested to provide a buffer in which to place received + data (slave-receiver role). */ + kLPI2C_SlaveTransmitAckEvent = 0x08U, /*!< Callback needs to either transmit an ACK or NACK. */ + kLPI2C_SlaveRepeatedStartEvent = 0x10U, /*!< A repeated start was detected. */ + kLPI2C_SlaveCompletionEvent = 0x20U, /*!< A stop was detected, completing the transfer. */ + + /*! Bit mask of all available events. */ + kLPI2C_SlaveAllEvents = kLPI2C_SlaveAddressMatchEvent | kLPI2C_SlaveTransmitEvent | kLPI2C_SlaveReceiveEvent | + kLPI2C_SlaveTransmitAckEvent | kLPI2C_SlaveRepeatedStartEvent | kLPI2C_SlaveCompletionEvent, +} lpi2c_slave_transfer_event_t; + +/*! @brief LPI2C slave transfer structure */ +typedef struct _lpi2c_slave_transfer +{ + lpi2c_slave_transfer_event_t event; /*!< Reason the callback is being invoked. */ + uint8_t receivedAddress; /*!< Matching address send by master. */ + uint8_t *data; /*!< Transfer buffer */ + size_t dataSize; /*!< Transfer size */ + status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for + #kLPI2C_SlaveCompletionEvent. */ + size_t transferredCount; /*!< Number of bytes actually transferred since start or last repeated start. */ +} lpi2c_slave_transfer_t; + +/* Forward declaration. */ +typedef struct _lpi2c_slave_handle lpi2c_slave_handle_t; + +/*! + * @brief Slave event callback function pointer type. + * + * This callback is used only for the slave non-blocking transfer API. To install a callback, + * use the LPI2C_SlaveSetCallback() function after you have created a handle. + * + * @param base Base address for the LPI2C instance on which the event occurred. + * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*lpi2c_slave_transfer_callback_t)(LPI2C_Type *base, lpi2c_slave_transfer_t *transfer, void *userData); + +/*! + * @brief LPI2C slave handle structure. + * @note The contents of this structure are private and subject to change. + */ +struct _lpi2c_slave_handle +{ + lpi2c_slave_transfer_t transfer; /*!< LPI2C slave transfer copy. */ + bool isBusy; /*!< Whether transfer is busy. */ + bool wasTransmit; /*!< Whether the last transfer was a transmit. */ + uint32_t eventMask; /*!< Mask of enabled events. */ + uint32_t transferredCount; /*!< Count of bytes transferred. */ + lpi2c_slave_transfer_callback_t callback; /*!< Callback function called at transfer event. */ + void *userData; /*!< Callback parameter passed to callback. */ +}; + +/*! @} */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @addtogroup lpi2c_master_driver + * @{ + */ + +/*! @name Initialization and deinitialization */ +/** @{ */ + +/*! + * @brief Provides a default configuration for the LPI2C master peripheral. + * + * This function provides the following default configuration for the LPI2C master peripheral: + * @code + * masterConfig->enableMaster = true; + * masterConfig->debugEnable = false; + * masterConfig->ignoreAck = false; + * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; + * masterConfig->baudRate_Hz = 100000U; + * masterConfig->busIdleTimeout_ns = 0; + * masterConfig->pinLowTimeout_ns = 0; + * masterConfig->sdaGlitchFilterWidth_ns = 0; + * masterConfig->sclGlitchFilterWidth_ns = 0; + * masterConfig->hostRequest.enable = false; + * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; + * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; + * @endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the master driver with LPI2C_MasterInit(). + * + * @param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. + */ +void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig); + +/*! + * @brief Initializes the LPI2C master peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user + * provided configuration. A software reset is performed prior to configuration. + * + * @param base The LPI2C peripheral base address. + * @param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of + * defaults + * that you can override. + * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz); + +/*! + * @brief Deinitializes the LPI2C master peripheral. + * + * This function disables the LPI2C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +void LPI2C_MasterDeinit(LPI2C_Type *base); + +/*! + * @brief Configures LPI2C master data match feature. + * + * @param base The LPI2C peripheral base address. + * @param config Settings for the data match feature. + */ +void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *config); + +/* Not static so it can be used from fsl_lpi2c_edma.c. */ +status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status); + +/* Not static so it can be used from fsl_lpi2c_edma.c. */ +status_t LPI2C_CheckForBusyBus(LPI2C_Type *base); + +/*! + * @brief Performs a software reset. + * + * Restores the LPI2C master peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +static inline void LPI2C_MasterReset(LPI2C_Type *base) +{ + base->MCR = LPI2C_MCR_RST_MASK; + base->MCR = 0; +} + +/*! + * @brief Enables or disables the LPI2C module as master. + * + * @param base The LPI2C peripheral base address. + * @param enable Pass true to enable or false to disable the specified LPI2C as master. + */ +static inline void LPI2C_MasterEnable(LPI2C_Type *base, bool enable) +{ + base->MCR = (base->MCR & ~LPI2C_MCR_MEN_MASK) | LPI2C_MCR_MEN(enable); +} + +/** @} */ + +/*! @name Status */ +/** @{ */ + +/*! + * @brief Gets the LPI2C master status flags. + * + * A bit mask with the state of all LPI2C master status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _lpi2c_master_flags + */ +static inline uint32_t LPI2C_MasterGetStatusFlags(LPI2C_Type *base) +{ + return base->MSR; +} + +/*! + * @brief Clears the LPI2C master status flag state. + * + * The following status register flags can be cleared: + * - #kLPI2C_MasterEndOfPacketFlag + * - #kLPI2C_MasterStopDetectFlag + * - #kLPI2C_MasterNackDetectFlag + * - #kLPI2C_MasterArbitrationLostFlag + * - #kLPI2C_MasterFifoErrFlag + * - #kLPI2C_MasterPinLowTimeoutFlag + * - #kLPI2C_MasterDataMatchFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The LPI2C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * _lpi2c_master_flags enumerators OR'd together. You may pass the result of a previous call to + * LPI2C_MasterGetStatusFlags(). + * @see _lpi2c_master_flags. + */ +static inline void LPI2C_MasterClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) +{ + base->MSR = statusMask; +} + +/** @} */ + +/*! @name Interrupts */ +/** @{ */ + +/*! + * @brief Enables the LPI2C master interrupt requests. + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See _lpi2c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_MasterEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->MIER |= interruptMask; +} + +/*! + * @brief Disables the LPI2C master interrupt requests. + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See _lpi2c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_MasterDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->MIER &= ~interruptMask; +} + +/*! + * @brief Returns the set of currently enabled LPI2C master interrupt requests. + * + * @param base The LPI2C peripheral base address. + * @return A bitmask composed of _lpi2c_master_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t LPI2C_MasterGetEnabledInterrupts(LPI2C_Type *base) +{ + return base->MIER; +} + +/** @} */ + +/*! @name DMA control */ +/** @{ */ + +/*! + * @brief Enables or disables LPI2C master DMA requests. + * + * @param base The LPI2C peripheral base address. + * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. + * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. + */ +static inline void LPI2C_MasterEnableDMA(LPI2C_Type *base, bool enableTx, bool enableRx) +{ + base->MDER = LPI2C_MDER_TDDE(enableTx) | LPI2C_MDER_RDDE(enableRx); +} + +/*! + * @brief Gets LPI2C master transmit data register address for DMA transfer. + * + * @param base The LPI2C peripheral base address. + * @return The LPI2C Master Transmit Data Register address. + */ +static inline uint32_t LPI2C_MasterGetTxFifoAddress(LPI2C_Type *base) +{ + return (uint32_t)&base->MTDR; +} + +/*! + * @brief Gets LPI2C master receive data register address for DMA transfer. + * + * @param base The LPI2C peripheral base address. + * @return The LPI2C Master Receive Data Register address. + */ +static inline uint32_t LPI2C_MasterGetRxFifoAddress(LPI2C_Type *base) +{ + return (uint32_t)&base->MRDR; +} + +/** @} */ + +/*! @name FIFO control */ +/** @{ */ + +/*! + * @brief Sets the watermarks for LPI2C master FIFOs. + * + * @param base The LPI2C peripheral base address. + * @param txWords Transmit FIFO watermark value in words. The #kLPI2C_MasterTxReadyFlag flag is set whenever + * the number of words in the transmit FIFO is equal or less than @a txWords. Writing a value equal or + * greater than the FIFO size is truncated. + * @param rxWords Receive FIFO watermark value in words. The #kLPI2C_MasterRxReadyFlag flag is set whenever + * the number of words in the receive FIFO is greater than @a rxWords. Writing a value equal or greater + * than the FIFO size is truncated. + */ +static inline void LPI2C_MasterSetWatermarks(LPI2C_Type *base, size_t txWords, size_t rxWords) +{ + base->MFCR = LPI2C_MFCR_TXWATER(txWords) | LPI2C_MFCR_RXWATER(rxWords); +} + +/*! + * @brief Gets the current number of words in the LPI2C master FIFOs. + * + * @param base The LPI2C peripheral base address. + * @param[out] txCount Pointer through which the current number of words in the transmit FIFO is returned. + * Pass NULL if this value is not required. + * @param[out] rxCount Pointer through which the current number of words in the receive FIFO is returned. + * Pass NULL if this value is not required. + */ +static inline void LPI2C_MasterGetFifoCounts(LPI2C_Type *base, size_t *rxCount, size_t *txCount) +{ + if (NULL != txCount) + { + *txCount = (base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) >> LPI2C_MFSR_TXCOUNT_SHIFT; + } + if (NULL != rxCount) + { + *rxCount = (base->MFSR & LPI2C_MFSR_RXCOUNT_MASK) >> LPI2C_MFSR_RXCOUNT_SHIFT; + } +} + +/** @} */ + +/*! @name Bus operations */ +/** @{ */ + +/*! + * @brief Sets the I2C bus frequency for master transactions. + * + * The LPI2C master is automatically disabled and re-enabled as necessary to configure the baud + * rate. Do not call this function during a transfer, or the transfer is aborted. + * + * @note Please note that the second parameter is the clock frequency of LPI2C module, the third + * parameter means user configured bus baudrate, this implementation is different from other I2C drivers + * which use baudrate configuration as second parameter and source clock frequency as third parameter. + * + * @param base The LPI2C peripheral base address. + * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. + * @param baudRate_Hz Requested bus frequency in Hertz. + */ +void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz); + +/*! + * @brief Returns whether the bus is idle. + * + * Requires the master mode to be enabled. + * + * @param base The LPI2C peripheral base address. + * @retval true Bus is busy. + * @retval false Bus is idle. + */ +static inline bool LPI2C_MasterGetBusIdleState(LPI2C_Type *base) +{ + return ((base->MSR & LPI2C_MSR_BBF_MASK) >> LPI2C_MSR_BBF_SHIFT) == 1U ? true : false; +} + +/*! + * @brief Sends a START signal and slave address on the I2C bus. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the @a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * @param base The LPI2C peripheral base address. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + */ +status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir); + +/*! + * @brief Sends a repeated START signal and slave address on the I2C bus. + * + * This function is used to send a Repeated START signal when a transfer is already in progress. Like + * LPI2C_MasterStart(), it also sends the specified 7-bit address. + * + * @note This function exists primarily to maintain compatible APIs between LPI2C and I2C drivers, + * as well as to better document the intent of code that uses these APIs. + * + * @param base The LPI2C peripheral base address. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + */ +static inline status_t LPI2C_MasterRepeatedStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) +{ + return LPI2C_MasterStart(base, address, dir); +} + +/*! + * @brief Performs a polling send transfer on the I2C bus. + * + * Sends up to @a txSize number of bytes to the previously addressed slave device. The slave may + * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this + * function returns #kStatus_LPI2C_Nak. + * + * @param base The LPI2C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @retval kStatus_Success Data was sent successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or over run. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterSend(LPI2C_Type *base, void *txBuff, size_t txSize); + +/*! + * @brief Performs a polling receive transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @retval kStatus_Success Data was received successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize); + +/*! + * @brief Sends a STOP signal on the I2C bus. + * + * This function does not return until the STOP signal is seen on the bus, or an error occurs. + * + * @param base The LPI2C peripheral base address. + * @retval kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterStop(LPI2C_Type *base); + +/*! + * @brief Performs a master polling transfer on the I2C bus. + * + * @note The API does not return until the transfer succeeds or fails due + * to error happens during transfer. + * + * @param base The LPI2C peripheral base address. + * @param transfer Pointer to the transfer structure. + * @retval kStatus_Success Data was received successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer); + +/** @} */ + +/*! @name Non-blocking */ +/** @{ */ + +/*! + * @brief Creates a new handle for the LPI2C master non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_MasterTransferAbort() API shall be called. + * + * + * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + * + * @param base The LPI2C peripheral base address. + * @param[out] handle Pointer to the LPI2C master driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_callback_t callback, + void *userData); + +/*! + * @brief Performs a non-blocking transaction on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param transfer The pointer to the transfer descriptor. + * @retval kStatus_Success The transaction was started successfully. + * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_t *transfer); + +/*! + * @brief Returns number of bytes transferred so far. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param[out] count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + */ +status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count); + +/*! + * @brief Terminates a non-blocking LPI2C master transmission early. + * + * @note It is not safe to call this function from an IRQ handler that has a higher priority than the + * LPI2C peripheral's IRQ priority. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @retval kStatus_Success A transaction was successfully aborted. + * @retval #kStatus_LPI2C_Idle There is not a non-blocking transaction currently in progress. + */ +void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle); + +/** @} */ + +/*! @name IRQ handler */ +/** @{ */ + +/*! + * @brief Reusable routine to handle master interrupts. + * @note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + */ +void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, lpi2c_master_handle_t *handle); + +/** @} */ + +/*! @} */ + +/*! + * @addtogroup lpi2c_slave_driver + * @{ + */ + +/*! @name Slave initialization and deinitialization */ +/** @{ */ + +/*! + * @brief Provides a default configuration for the LPI2C slave peripheral. + * + * This function provides the following default configuration for the LPI2C slave peripheral: + * @code + * slaveConfig->enableSlave = true; + * slaveConfig->address0 = 0U; + * slaveConfig->address1 = 0U; + * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; + * slaveConfig->filterDozeEnable = true; + * slaveConfig->filterEnable = true; + * slaveConfig->enableGeneralCall = false; + * slaveConfig->sclStall.enableAck = false; + * slaveConfig->sclStall.enableTx = true; + * slaveConfig->sclStall.enableRx = true; + * slaveConfig->sclStall.enableAddress = true; + * slaveConfig->ignoreAck = false; + * slaveConfig->enableReceivedAddressRead = false; + * slaveConfig->sdaGlitchFilterWidth_ns = 0; + * slaveConfig->sclGlitchFilterWidth_ns = 0; + * slaveConfig->dataValidDelay_ns = 0; + * slaveConfig->clockHoldTime_ns = 0; + * @endcode + * + * After calling this function, override any settings to customize the configuration, + * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the @a + * address0 member of the configuration structure with the desired slave address. + * + * @param[out] slaveConfig User provided configuration structure that is set to default values. Refer to + * #lpi2c_slave_config_t. + */ +void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig); + +/*! + * @brief Initializes the LPI2C slave peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user + * provided configuration. + * + * @param base The LPI2C peripheral base address. + * @param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults + * that you can override. + * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, + * data valid delay, and clock hold time. + */ +void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz); + +/*! + * @brief Deinitializes the LPI2C slave peripheral. + * + * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +void LPI2C_SlaveDeinit(LPI2C_Type *base); + +/*! + * @brief Performs a software reset of the LPI2C slave peripheral. + * + * @param base The LPI2C peripheral base address. + */ +static inline void LPI2C_SlaveReset(LPI2C_Type *base) +{ + base->SCR = LPI2C_SCR_RST_MASK; + base->SCR = 0; +} + +/*! + * @brief Enables or disables the LPI2C module as slave. + * + * @param base The LPI2C peripheral base address. + * @param enable Pass true to enable or false to disable the specified LPI2C as slave. + */ +static inline void LPI2C_SlaveEnable(LPI2C_Type *base, bool enable) +{ + base->SCR = (base->SCR & ~LPI2C_SCR_SEN_MASK) | LPI2C_SCR_SEN(enable); +} + +/** @} */ + +/*! @name Slave status */ +/** @{ */ + +/*! + * @brief Gets the LPI2C slave status flags. + * + * A bit mask with the state of all LPI2C slave status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _lpi2c_slave_flags + */ +static inline uint32_t LPI2C_SlaveGetStatusFlags(LPI2C_Type *base) +{ + return base->SSR; +} + +/*! + * @brief Clears the LPI2C status flag state. + * + * The following status register flags can be cleared: + * - #kLPI2C_SlaveRepeatedStartDetectFlag + * - #kLPI2C_SlaveStopDetectFlag + * - #kLPI2C_SlaveBitErrFlag + * - #kLPI2C_SlaveFifoErrFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The LPI2C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * #_lpi2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to + * LPI2C_SlaveGetStatusFlags(). + * @see _lpi2c_slave_flags. + */ +static inline void LPI2C_SlaveClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) +{ + base->SSR = statusMask; +} + +/** @} */ + +/*! @name Slave interrupts */ +/** @{ */ + +/*! + * @brief Enables the LPI2C slave interrupt requests. + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See #_lpi2c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_SlaveEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->SIER |= interruptMask; +} + +/*! + * @brief Disables the LPI2C slave interrupt requests. + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See #_lpi2c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_SlaveDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->SIER &= ~interruptMask; +} + +/*! + * @brief Returns the set of currently enabled LPI2C slave interrupt requests. + * @param base The LPI2C peripheral base address. + * @return A bitmask composed of #_lpi2c_slave_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t LPI2C_SlaveGetEnabledInterrupts(LPI2C_Type *base) +{ + return base->SIER; +} + +/** @} */ + +/*! @name Slave DMA control */ +/** @{ */ + +/*! + * @brief Enables or disables the LPI2C slave peripheral DMA requests. + * + * @param base The LPI2C peripheral base address. + * @param enableAddressValid Enable flag for the address valid DMA request. Pass true for enable, false for disable. + * The address valid DMA request is shared with the receive data DMA request. + * @param enableRx Enable flag for the receive data DMA request. Pass true for enable, false for disable. + * @param enableTx Enable flag for the transmit data DMA request. Pass true for enable, false for disable. + */ +static inline void LPI2C_SlaveEnableDMA(LPI2C_Type *base, bool enableAddressValid, bool enableRx, bool enableTx) +{ + base->SDER = (base->SDER & ~(LPI2C_SDER_AVDE_MASK | LPI2C_SDER_RDDE_MASK | LPI2C_SDER_TDDE_MASK)) | + LPI2C_SDER_AVDE(enableAddressValid) | LPI2C_SDER_RDDE(enableRx) | LPI2C_SDER_TDDE(enableTx); +} + +/** @} */ + +/*! @name Slave bus operations */ +/** @{ */ + +/*! + * @brief Returns whether the bus is idle. + * + * Requires the slave mode to be enabled. + * + * @param base The LPI2C peripheral base address. + * @retval true Bus is busy. + * @retval false Bus is idle. + */ +static inline bool LPI2C_SlaveGetBusIdleState(LPI2C_Type *base) +{ + return ((base->SSR & LPI2C_SSR_BBF_MASK) >> LPI2C_SSR_BBF_SHIFT) == 1U ? true : false; +} + +/*! + * @brief Transmits either an ACK or NAK on the I2C bus in response to a byte from the master. + * + * Use this function to send an ACK or NAK when the #kLPI2C_SlaveTransmitAckFlag is asserted. This + * only happens if you enable the sclStall.enableAck field of the ::lpi2c_slave_config_t configuration + * structure used to initialize the slave peripheral. + * + * @param base The LPI2C peripheral base address. + * @param ackOrNack Pass true for an ACK or false for a NAK. + */ +static inline void LPI2C_SlaveTransmitAck(LPI2C_Type *base, bool ackOrNack) +{ + base->STAR = LPI2C_STAR_TXNACK(!ackOrNack); +} + +/*! + * @brief Returns the slave address sent by the I2C master. + * + * This function should only be called if the #kLPI2C_SlaveAddressValidFlag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return The 8-bit address matched by the LPI2C slave. Bit 0 contains the R/w direction bit, and + * the 7-bit slave address is in the upper 7 bits. + */ +static inline uint32_t LPI2C_SlaveGetReceivedAddress(LPI2C_Type *base) +{ + return base->SASR & LPI2C_SASR_RADDR_MASK; +} + +/*! + * @brief Performs a polling send transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @param[out] actualTxSize + * @return Error or success status returned by API. + */ +status_t LPI2C_SlaveSend(LPI2C_Type *base, void *txBuff, size_t txSize, size_t *actualTxSize); + +/*! + * @brief Performs a polling receive transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @param[out] actualRxSize + * @return Error or success status returned by API. + */ +status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize); + +/** @} */ + +/*! @name Slave non-blocking */ +/** @{ */ + +/*! + * @brief Creates a new handle for the LPI2C slave non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_SlaveTransferAbort() API shall be called. + * + * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + + * @param base The LPI2C peripheral base address. + * @param[out] handle Pointer to the LPI2C slave driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, + lpi2c_slave_handle_t *handle, + lpi2c_slave_transfer_callback_t callback, + void *userData); + +/*! + * @brief Starts accepting slave transfers. + * + * Call this API after calling I2C_SlaveInit() and LPI2C_SlaveTransferCreateHandle() to start processing + * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the + * callback that was passed into the call to LPI2C_SlaveTransferCreateHandle(). The callback is always invoked + * from the interrupt context. + * + * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to + * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. + * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_SlaveReceiveEvent events are always enabled and do not need + * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and + * receive events that are always enabled. In addition, the #kLPI2C_SlaveAllEvents constant is provided as + * a convenient way to enable all events. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + * @param eventMask Bit mask formed by OR'ing together #lpi2c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. Other accepted values are 0 to get a default set of + * only the transmit and receive events, and #kLPI2C_SlaveAllEvents to enable all events. + * + * @retval kStatus_Success Slave transfers were successfully started. + * @retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. + */ +status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask); + +/*! + * @brief Gets the slave transfer status during a non-blocking transfer. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to i2c_slave_handle_t structure. + * @param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not + * required. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress + */ +status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count); + +/*! + * @brief Aborts the slave non-blocking transfers. + * @note This API could be called at any time to stop slave for handling the bus events. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + * @retval kStatus_Success + * @retval #kStatus_LPI2C_Idle + */ +void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle); + +/** @} */ + +/*! @name Slave IRQ handler */ +/** @{ */ + +/*! + * @brief Reusable routine to handle slave interrupts. + * @note This function does not need to be called unless you are reimplementing the + * non blocking API's interrupt handler routines to add special functionality. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + */ +void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle); + +/** @} */ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +#endif /* _FSL_LPI2C_H_ */ diff --git a/platform/drivers/lpit/Makefile b/platform/drivers/lpit/Makefile new file mode 100755 index 0000000..0fe0901 --- /dev/null +++ b/platform/drivers/lpit/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/lpit/fsl_lpit.o + +DIRS += $(OUT)/drivers/lpit + diff --git a/platform/drivers/lpit/fsl_lpit.h b/platform/drivers/lpit/fsl_lpit.h new file mode 100755 index 0000000..c6234f6 --- /dev/null +++ b/platform/drivers/lpit/fsl_lpit.h @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_LPIT_H_ +#define _FSL_LPIT_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpit + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +#define FSL_LPIT_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) /*!< Version 2.0.1 */ + /** @{ */ + +/*! + * @brief List of LPIT channels + * @note Actual number of available channels is SoC-dependent + */ +typedef enum _lpit_chnl +{ + kLPIT_Chnl_0 = 0U, /*!< LPIT channel number 0*/ + kLPIT_Chnl_1, /*!< LPIT channel number 1 */ + kLPIT_Chnl_2, /*!< LPIT channel number 2 */ + kLPIT_Chnl_3, /*!< LPIT channel number 3 */ +} lpit_chnl_t; + +/*! @brief Mode options available for the LPIT timer. */ +typedef enum _lpit_timer_modes +{ + kLPIT_PeriodicCounter = 0U, /*!< Use the all 32-bits, counter loads and decrements to zero */ + kLPIT_DualPeriodicCounter, /*!< Counter loads, lower 16-bits decrement to zero, then + upper 16-bits decrement */ + kLPIT_TriggerAccumulator, /*!< Counter loads on first trigger and decrements on each trigger */ + kLPIT_InputCapture /*!< Counter loads with 0xFFFFFFFF, decrements to zero. It stores + the inverse of the current value when a input trigger is detected */ +} lpit_timer_modes_t; + +/*! + * @brief Trigger options available. + * + * This is used for both internal and external trigger sources. The actual trigger options + * available is SoC-specific, user should refer to the reference manual. + */ +typedef enum _lpit_trigger_select +{ + kLPIT_Trigger_TimerChn0 = 0U, /*!< Channel 0 is selected as a trigger source */ + kLPIT_Trigger_TimerChn1, /*!< Channel 1 is selected as a trigger source */ + kLPIT_Trigger_TimerChn2, /*!< Channel 2 is selected as a trigger source */ + kLPIT_Trigger_TimerChn3, /*!< Channel 3 is selected as a trigger source */ + kLPIT_Trigger_TimerChn4, /*!< Channel 4 is selected as a trigger source */ + kLPIT_Trigger_TimerChn5, /*!< Channel 5 is selected as a trigger source */ + kLPIT_Trigger_TimerChn6, /*!< Channel 6 is selected as a trigger source */ + kLPIT_Trigger_TimerChn7, /*!< Channel 7 is selected as a trigger source */ + kLPIT_Trigger_TimerChn8, /*!< Channel 8 is selected as a trigger source */ + kLPIT_Trigger_TimerChn9, /*!< Channel 9 is selected as a trigger source */ + kLPIT_Trigger_TimerChn10, /*!< Channel 10 is selected as a trigger source */ + kLPIT_Trigger_TimerChn11, /*!< Channel 11 is selected as a trigger source */ + kLPIT_Trigger_TimerChn12, /*!< Channel 12 is selected as a trigger source */ + kLPIT_Trigger_TimerChn13, /*!< Channel 13 is selected as a trigger source */ + kLPIT_Trigger_TimerChn14, /*!< Channel 14 is selected as a trigger source */ + kLPIT_Trigger_TimerChn15 /*!< Channel 15 is selected as a trigger source */ +} lpit_trigger_select_t; + +/*! @brief Trigger source options available */ +typedef enum _lpit_trigger_source +{ + kLPIT_TriggerSource_External = 0U, /*!< Use external trigger input */ + kLPIT_TriggerSource_Internal /*!< Use internal trigger */ +} lpit_trigger_source_t; + +/*! + * @brief List of LPIT interrupts. + * + * @note Number of timer channels are SoC-specific. See the SoC Reference Manual. + */ +typedef enum _lpit_interrupt_enable +{ + kLPIT_Channel0TimerInterruptEnable = (1U << 0), /*!< Channel 0 Timer interrupt */ + kLPIT_Channel1TimerInterruptEnable = (1U << 1), /*!< Channel 1 Timer interrupt */ + kLPIT_Channel2TimerInterruptEnable = (1U << 2), /*!< Channel 2 Timer interrupt */ + kLPIT_Channel3TimerInterruptEnable = (1U << 3), /*!< Channel 3 Timer interrupt */ +} lpit_interrupt_enable_t; + +/*! + * @brief List of LPIT status flags + * + * @note Number of timer channels are SoC-specific. See the SoC Reference Manual. + */ +typedef enum _lpit_status_flags +{ + kLPIT_Channel0TimerFlag = (1U << 0), /*!< Channel 0 Timer interrupt flag */ + kLPIT_Channel1TimerFlag = (1U << 1), /*!< Channel 1 Timer interrupt flag */ + kLPIT_Channel2TimerFlag = (1U << 2), /*!< Channel 2 Timer interrupt flag */ + kLPIT_Channel3TimerFlag = (1U << 3), /*!< Channel 3 Timer interrupt flag */ +} lpit_status_flags_t; + +/*! @brief Structure to configure the channel timer. */ +typedef struct _lpit_chnl_params +{ + bool chainChannel; /*!< true: Timer chained to previous timer; + false: Timer not chained */ + lpit_timer_modes_t timerMode; /*!< Timers mode of operation. */ + lpit_trigger_select_t triggerSelect; /*!< Trigger selection for the timer */ + lpit_trigger_source_t triggerSource; /*!< Decides if we use external or internal trigger. */ + bool enableReloadOnTrigger; /*!< true: Timer reloads when a trigger is detected; + false: No effect */ + bool enableStopOnTimeout; /*!< true: Timer will stop after timeout; + false: does not stop after timeout */ + bool enableStartOnTrigger; /*!< true: Timer starts when a trigger is detected; + false: decrement immediately */ +} lpit_chnl_params_t; + +/*! + * @brief LPIT configuration structure + * + * This structure holds the configuration settings for the LPIT peripheral. To initialize this + * structure to reasonable defaults, call the LPIT_GetDefaultConfig() function and pass a + * pointer to the configuration structure instance. + * + * The configuration structure can be made constant so as to reside in flash. + */ +typedef struct _lpit_config +{ + bool enableRunInDebug; /*!< true: Timers run in debug mode; false: Timers stop in debug mode */ + bool enableRunInDoze; /*!< true: Timers run in doze mode; false: Timers stop in doze mode */ +} lpit_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Ungates the LPIT clock and configures the peripheral for a basic operation. + * + * This function issues a software reset to reset all channels and registers except the Module + * Control register. + * + * @note This API should be called at the beginning of the application using the LPIT driver. + * + * @param base LPIT peripheral base address. + * @param config Pointer to the user configuration structure. + */ +void LPIT_Init(LPIT_Type *base, const lpit_config_t *config); + +/*! + * @brief Disables the module and gates the LPIT clock. + * + * @param base LPIT peripheral base address. + */ +void LPIT_Deinit(LPIT_Type *base); + +/*! + * @brief Fills in the LPIT configuration structure with default settings. + * + * The default values are: + * @code + * config->enableRunInDebug = false; + * config->enableRunInDoze = false; + * @endcode + * @param config Pointer to the user configuration structure. + */ +void LPIT_GetDefaultConfig(lpit_config_t *config); + +/*! + * @brief Sets up an LPIT channel based on the user's preference. + * + * This function sets up the operation mode to one of the options available in the + * enumeration ::lpit_timer_modes_t. It sets the trigger source as either internal or external, + * trigger selection and the timers behaviour when a timeout occurs. It also chains + * the timer if a prior timer if requested by the user. + * + * @param base LPIT peripheral base address. + * @param channel Channel that is being configured. + * @param chnlSetup Configuration parameters. + */ +status_t LPIT_SetupChannel(LPIT_Type *base, lpit_chnl_t channel, const lpit_chnl_params_t *chnlSetup); + +/*! @}*/ + +/*! + * @name Interrupt Interface + * @{ + */ + +/*! + * @brief Enables the selected PIT interrupts. + * + * @param base LPIT peripheral base address. + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::lpit_interrupt_enable_t + */ +static inline void LPIT_EnableInterrupts(LPIT_Type *base, uint32_t mask) +{ + base->MIER |= mask; +} + +/*! + * @brief Disables the selected PIT interrupts. + * + * @param base LPIT peripheral base address. + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::lpit_interrupt_enable_t + */ +static inline void LPIT_DisableInterrupts(LPIT_Type *base, uint32_t mask) +{ + base->MIER &= ~mask; +} + +/*! + * @brief Gets the enabled LPIT interrupts. + * + * @param base LPIT peripheral base address. + * + * @return The enabled interrupts. This is the logical OR of members of the + * enumeration ::lpit_interrupt_enable_t + */ +static inline uint32_t LPIT_GetEnabledInterrupts(LPIT_Type *base) +{ + return base->MIER; +} + +/*! @}*/ + +/*! + * @name Status Interface + * @{ + */ + +/*! + * @brief Gets the LPIT status flags. + * + * @param base LPIT peripheral base address. + * + * @return The status flags. This is the logical OR of members of the + * enumeration ::lpit_status_flags_t + */ +static inline uint32_t LPIT_GetStatusFlags(LPIT_Type *base) +{ + return base->MSR; +} + +/*! + * @brief Clears the LPIT status flags. + * + * @param base LPIT peripheral base address. + * @param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::lpit_status_flags_t + */ +static inline void LPIT_ClearStatusFlags(LPIT_Type *base, uint32_t mask) +{ + /* Writing a 1 to the status bit will clear the flag */ + base->MSR = mask; +} + +/*! @}*/ + +/*! + * @name Read and Write the timer period + * @{ + */ + +/*! + * @brief Sets the timer period in units of count. + * + * Timers begin counting down from the value set by this function until it reaches 0, at which point + * it generates an interrupt and loads this register value again. + * Writing a new value to this register does not restart the timer. Instead, the value + * is loaded after the timer expires. + * + * @note User can call the utility macros provided in fsl_common.h to convert to ticks. + * + * @param base LPIT peripheral base address. + * @param channel Timer channel number. + * @param ticks Timer period in units of ticks. + */ +static inline void LPIT_SetTimerPeriod(LPIT_Type *base, lpit_chnl_t channel, uint32_t ticks) +{ + base->CHANNEL[channel].TVAL = ticks; +} + +/*! + * @brief Reads the current timer counting value. + * + * This function returns the real-time timer counting value, in a range from 0 to a + * timer period. + * + * @note User can call the utility macros provided in fsl_common.h to convert ticks to microseconds or milliseconds. + * + * @param base LPIT peripheral base address. + * @param channel Timer channel number. + * + * @return Current timer counting value in ticks. + */ +static inline uint32_t LPIT_GetCurrentTimerCount(LPIT_Type *base, lpit_chnl_t channel) +{ + return base->CHANNEL[channel].CVAL; +} + +/*! @}*/ + +/*! + * @name Timer Start and Stop + * @{ + */ + +/*! + * @brief Starts the timer counting. + * + * After calling this function, timers load the period value and count down to 0. When the timer + * reaches 0, it generates a trigger pulse and sets the timeout interrupt flag. + * + * @param base LPIT peripheral base address. + * @param channel Timer channel number. + */ +static inline void LPIT_StartTimer(LPIT_Type *base, lpit_chnl_t channel) +{ + uint32_t shift = LPIT_SETTEN_SET_T_EN_0_MASK; + + base->SETTEN |= shift << ((uint32_t)channel); +} +/*! + * @brief Stops the timer counting. + * + * @param base LPIT peripheral base address. + * @param channel Timer channel number. + */ +static inline void LPIT_StopTimer(LPIT_Type *base, lpit_chnl_t channel) +{ + uint32_t shift = LPIT_CLRTEN_CLR_T_EN_0_MASK; + + base->CLRTEN |= shift << ((uint32_t)channel); +} + +/*! @}*/ + +/*! + * @brief Performs a software reset on the LPIT module. + * + * This resets all channels and registers except the Module Control Register. + * + * @param base LPIT peripheral base address. + */ +static inline void LPIT_Reset(LPIT_Type *base) +{ + base->MCR |= LPIT_MCR_SW_RST_MASK; + base->MCR &= ~LPIT_MCR_SW_RST_MASK; +} + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* __FSL_LPIT_H__ */ diff --git a/platform/drivers/lpuart/Makefile b/platform/drivers/lpuart/Makefile new file mode 100755 index 0000000..a2e6a89 --- /dev/null +++ b/platform/drivers/lpuart/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/lpuart/fsl_lpuart.o + +DIRS += $(OUT)/drivers/lpuart + diff --git a/platform/drivers/lpuart/fsl_lpuart.h b/platform/drivers/lpuart/fsl_lpuart.h new file mode 100755 index 0000000..22c15bd --- /dev/null +++ b/platform/drivers/lpuart/fsl_lpuart.h @@ -0,0 +1,864 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_LPUART_H_ +#define _FSL_LPUART_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpuart_driver + * @{ + */ + +/*! @file*/ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief LPUART driver version 2.3.0. */ +#define FSL_LPUART_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) +/** @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef UART_RETRY_TIMES +#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */ +#endif + +/*! @brief Error codes for the LPUART driver. */ +enum +{ + kStatus_LPUART_TxBusy = MAKE_STATUS(kStatusGroup_LPUART, 0), /*!< TX busy */ + kStatus_LPUART_RxBusy = MAKE_STATUS(kStatusGroup_LPUART, 1), /*!< RX busy */ + kStatus_LPUART_TxIdle = MAKE_STATUS(kStatusGroup_LPUART, 2), /*!< LPUART transmitter is idle. */ + kStatus_LPUART_RxIdle = MAKE_STATUS(kStatusGroup_LPUART, 3), /*!< LPUART receiver is idle. */ + kStatus_LPUART_TxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 4), /*!< TX FIFO watermark too large */ + kStatus_LPUART_RxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 5), /*!< RX FIFO watermark too large */ + kStatus_LPUART_FlagCannotClearManually = MAKE_STATUS(kStatusGroup_LPUART, 6), /*!< Some flag can't manually clear */ + kStatus_LPUART_Error = MAKE_STATUS(kStatusGroup_LPUART, 7), /*!< Error happens on LPUART. */ + kStatus_LPUART_RxRingBufferOverrun = + MAKE_STATUS(kStatusGroup_LPUART, 8), /*!< LPUART RX software ring buffer overrun. */ + kStatus_LPUART_RxHardwareOverrun = MAKE_STATUS(kStatusGroup_LPUART, 9), /*!< LPUART RX receiver overrun. */ + kStatus_LPUART_NoiseError = MAKE_STATUS(kStatusGroup_LPUART, 10), /*!< LPUART noise error. */ + kStatus_LPUART_FramingError = MAKE_STATUS(kStatusGroup_LPUART, 11), /*!< LPUART framing error. */ + kStatus_LPUART_ParityError = MAKE_STATUS(kStatusGroup_LPUART, 12), /*!< LPUART parity error. */ + kStatus_LPUART_BaudrateNotSupport = + MAKE_STATUS(kStatusGroup_LPUART, 13), /*!< Baudrate is not support in current clock source */ + kStatus_LPUART_IdleLineDetected = MAKE_STATUS(kStatusGroup_LPUART, 14), /*!< IDLE flag. */ + kStatus_LPUART_Timeout = MAKE_STATUS(kStatusGroup_LPUART, 15), /*!< LPUART times out. */ +}; + +/*! @brief LPUART parity mode. */ +typedef enum _lpuart_parity_mode +{ + kLPUART_ParityDisabled = 0x0U, /*!< Parity disabled */ + kLPUART_ParityEven = 0x2U, /*!< Parity enabled, type even, bit setting: PE|PT = 10 */ + kLPUART_ParityOdd = 0x3U, /*!< Parity enabled, type odd, bit setting: PE|PT = 11 */ +} lpuart_parity_mode_t; + +/*! @brief LPUART data bits count. */ +typedef enum _lpuart_data_bits +{ + kLPUART_EightDataBits = 0x0U, /*!< Eight data bit */ +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + kLPUART_SevenDataBits = 0x1U, /*!< Seven data bit */ +#endif +} lpuart_data_bits_t; + +/*! @brief LPUART stop bit count. */ +typedef enum _lpuart_stop_bit_count +{ + kLPUART_OneStopBit = 0U, /*!< One stop bit */ + kLPUART_TwoStopBit = 1U, /*!< Two stop bits */ +} lpuart_stop_bit_count_t; + +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT +/*! @brief LPUART transmit CTS source. */ +typedef enum _lpuart_transmit_cts_source +{ + kLPUART_CtsSourcePin = 0U, /*!< CTS resource is the LPUART_CTS pin. */ + kLPUART_CtsSourceMatchResult = 1U, /*!< CTS resource is the match result. */ +} lpuart_transmit_cts_source_t; + +/*! @brief LPUART transmit CTS configure. */ +typedef enum _lpuart_transmit_cts_config +{ + kLPUART_CtsSampleAtStart = 0U, /*!< CTS input is sampled at the start of each character. */ + kLPUART_CtsSampleAtIdle = 1U, /*!< CTS input is sampled when the transmitter is idle */ +} lpuart_transmit_cts_config_t; +#endif + +/*! @brief LPUART idle flag type defines when the receiver starts counting. */ +typedef enum _lpuart_idle_type_select +{ + kLPUART_IdleTypeStartBit = 0U, /*!< Start counting after a valid start bit. */ + kLPUART_IdleTypeStopBit = 1U, /*!< Start counting after a stop bit. */ +} lpuart_idle_type_select_t; + +/*! @brief LPUART idle detected configuration. + * This structure defines the number of idle characters that must be received before + * the IDLE flag is set. + */ +typedef enum _lpuart_idle_config +{ + kLPUART_IdleCharacter1 = 0U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter2 = 1U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter4 = 2U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter8 = 3U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter16 = 4U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter32 = 5U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter64 = 6U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter128 = 7U, /*!< the number of idle characters. */ +} lpuart_idle_config_t; + +/*! + * @brief LPUART interrupt configuration structure, default settings all disabled. + * + * This structure contains the settings for all LPUART interrupt configurations. + */ +enum _lpuart_interrupt_enable +{ +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + kLPUART_LinBreakInterruptEnable = (LPUART_BAUD_LBKDIE_MASK >> 8), /*!< LIN break detect. */ +#endif + kLPUART_RxActiveEdgeInterruptEnable = (LPUART_BAUD_RXEDGIE_MASK >> 8), /*!< Receive Active Edge. */ + kLPUART_TxDataRegEmptyInterruptEnable = (LPUART_CTRL_TIE_MASK), /*!< Transmit data register empty. */ + kLPUART_TransmissionCompleteInterruptEnable = (LPUART_CTRL_TCIE_MASK), /*!< Transmission complete. */ + kLPUART_RxDataRegFullInterruptEnable = (LPUART_CTRL_RIE_MASK), /*!< Receiver data register full. */ + kLPUART_IdleLineInterruptEnable = (LPUART_CTRL_ILIE_MASK), /*!< Idle line. */ + kLPUART_RxOverrunInterruptEnable = (LPUART_CTRL_ORIE_MASK), /*!< Receiver Overrun. */ + kLPUART_NoiseErrorInterruptEnable = (LPUART_CTRL_NEIE_MASK), /*!< Noise error flag. */ + kLPUART_FramingErrorInterruptEnable = (LPUART_CTRL_FEIE_MASK), /*!< Framing error flag. */ + kLPUART_ParityErrorInterruptEnable = (LPUART_CTRL_PEIE_MASK), /*!< Parity error flag. */ +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + kLPUART_TxFifoOverflowInterruptEnable = (LPUART_FIFO_TXOFE_MASK >> 8), /*!< Transmit FIFO Overflow. */ + kLPUART_RxFifoUnderflowInterruptEnable = (LPUART_FIFO_RXUFE_MASK >> 8), /*!< Receive FIFO Underflow. */ +#endif +}; + +/*! + * @brief LPUART status flags. + * + * This provides constants for the LPUART status flags for use in the LPUART functions. + */ +enum _lpuart_flags +{ + kLPUART_TxDataRegEmptyFlag = + (LPUART_STAT_TDRE_MASK), /*!< Transmit data register empty flag, sets when transmit buffer is empty */ + kLPUART_TransmissionCompleteFlag = + (LPUART_STAT_TC_MASK), /*!< Transmission complete flag, sets when transmission activity complete */ + kLPUART_RxDataRegFullFlag = + (LPUART_STAT_RDRF_MASK), /*!< Receive data register full flag, sets when the receive data buffer is full */ + kLPUART_IdleLineFlag = (LPUART_STAT_IDLE_MASK), /*!< Idle line detect flag, sets when idle line detected */ + kLPUART_RxOverrunFlag = (LPUART_STAT_OR_MASK), /*!< Receive Overrun, sets when new data is received before data is + read from receive register */ + kLPUART_NoiseErrorFlag = (LPUART_STAT_NF_MASK), /*!< Receive takes 3 samples of each received bit. If any of these + samples differ, noise flag sets */ + kLPUART_FramingErrorFlag = + (LPUART_STAT_FE_MASK), /*!< Frame error flag, sets if logic 0 was detected where stop bit expected */ + kLPUART_ParityErrorFlag = (LPUART_STAT_PF_MASK), /*!< If parity enabled, sets upon parity error detection */ +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + kLPUART_LinBreakFlag = (int)(LPUART_STAT_LBKDIF_MASK), /*!< LIN break detect interrupt flag, sets when LIN break + char detected and LIN circuit enabled */ +#endif + kLPUART_RxActiveEdgeFlag = + (LPUART_STAT_RXEDGIF_MASK), /*!< Receive pin active edge interrupt flag, sets when active edge detected */ + kLPUART_RxActiveFlag = + (LPUART_STAT_RAF_MASK), /*!< Receiver Active Flag (RAF), sets at beginning of valid start bit */ +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + kLPUART_DataMatch1Flag = LPUART_STAT_MA1F_MASK, /*!< The next character to be read from LPUART_DATA matches MA1*/ + kLPUART_DataMatch2Flag = LPUART_STAT_MA2F_MASK, /*!< The next character to be read from LPUART_DATA matches MA2*/ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS) && FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS + kLPUART_NoiseErrorInRxDataRegFlag = + (LPUART_DATA_NOISY_MASK >> 10), /*!< NOISY bit, sets if noise detected in current data word */ + kLPUART_ParityErrorInRxDataRegFlag = + (LPUART_DATA_PARITYE_MASK >> 10), /*!< PARITY bit, sets if noise detected in current data word */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + kLPUART_TxFifoEmptyFlag = (LPUART_FIFO_TXEMPT_MASK >> 16), /*!< TXEMPT bit, sets if transmit buffer is empty */ + kLPUART_RxFifoEmptyFlag = (LPUART_FIFO_RXEMPT_MASK >> 16), /*!< RXEMPT bit, sets if receive buffer is empty */ + kLPUART_TxFifoOverflowFlag = + (LPUART_FIFO_TXOF_MASK >> 16), /*!< TXOF bit, sets if transmit buffer overflow occurred */ + kLPUART_RxFifoUnderflowFlag = + (LPUART_FIFO_RXUF_MASK >> 16), /*!< RXUF bit, sets if receive buffer underflow occurred */ +#endif +}; + +/*! @brief LPUART configuration structure. */ +typedef struct _lpuart_config +{ + uint32_t baudRate_Bps; /*!< LPUART baud rate */ + lpuart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */ + lpuart_data_bits_t dataBitsCount; /*!< Data bits count, eight (default), seven */ + bool isMsb; /*!< Data bits order, LSB (default), MSB */ +#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT + lpuart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + uint8_t txFifoWatermark; /*!< TX FIFO watermark */ + uint8_t rxFifoWatermark; /*!< RX FIFO watermark */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT + bool enableRxRTS; /*!< RX RTS enable */ + bool enableTxCTS; /*!< TX CTS enable */ + lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */ + lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */ +#endif + lpuart_idle_type_select_t rxIdleType; /*!< RX IDLE type. */ + lpuart_idle_config_t rxIdleConfig; /*!< RX IDLE configuration. */ + bool enableTx; /*!< Enable TX */ + bool enableRx; /*!< Enable RX */ +} lpuart_config_t; + +/*! @brief LPUART transfer structure. */ +typedef struct _lpuart_transfer +{ + uint8_t *data; /*!< The buffer of data to be transfer.*/ + size_t dataSize; /*!< The byte count to be transfer. */ +} lpuart_transfer_t; + +/* Forward declaration of the handle typedef. */ +typedef struct _lpuart_handle lpuart_handle_t; + +/*! @brief LPUART transfer callback function. */ +typedef void (*lpuart_transfer_callback_t)(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData); + +/*! @brief LPUART handle structure. */ +struct _lpuart_handle +{ + uint8_t *volatile txData; /*!< Address of remaining data to send. */ + volatile size_t txDataSize; /*!< Size of the remaining data to send. */ + size_t txDataSizeAll; /*!< Size of the data to send out. */ + uint8_t *volatile rxData; /*!< Address of remaining data to receive. */ + volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */ + size_t rxDataSizeAll; /*!< Size of the data to receive. */ + + uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */ + size_t rxRingBufferSize; /*!< Size of the ring buffer. */ + volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */ + volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */ + + lpuart_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< LPUART callback function parameter.*/ + + volatile uint8_t txState; /*!< TX transfer state. */ + volatile uint8_t rxState; /*!< RX transfer state. */ + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + bool isSevenDataBits; /*!< Seven data bits flag. */ +#endif +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +#if defined(FSL_FEATURE_LPUART_HAS_GLOBAL) && FSL_FEATURE_LPUART_HAS_GLOBAL + +/*! + * @name Software Reset + * @{ + */ + +/*! + * @brief Resets the LPUART using software. + * + * This function resets all internal logic and registers except the Global Register. + * Remains set until cleared by software. + * + * @param base LPUART peripheral base address. + */ +static inline void LPUART_SoftwareReset(LPUART_Type *base) +{ + base->GLOBAL |= LPUART_GLOBAL_RST_MASK; + base->GLOBAL &= ~LPUART_GLOBAL_RST_MASK; +} +/** @} */ +#endif /*FSL_FEATURE_LPUART_HAS_GLOBAL*/ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes an LPUART instance with the user configuration structure and the peripheral clock. + * + * This function configures the LPUART module with user-defined settings. Call the LPUART_GetDefaultConfig() function + * to configure the configuration structure and get the default configuration. + * The example below shows how to use this API to configure the LPUART. + * @code + * lpuart_config_t lpuartConfig; + * lpuartConfig.baudRate_Bps = 115200U; + * lpuartConfig.parityMode = kLPUART_ParityDisabled; + * lpuartConfig.dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig.isMsb = false; + * lpuartConfig.stopBitCount = kLPUART_OneStopBit; + * lpuartConfig.txFifoWatermark = 0; + * lpuartConfig.rxFifoWatermark = 1; + * LPUART_Init(LPUART1, &lpuartConfig, 20000000U); + * @endcode + * + * @param base LPUART peripheral base address. + * @param config Pointer to a user-defined configuration structure. + * @param srcClock_Hz LPUART clock source frequency in HZ. + * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not support in current clock source. + * @retval kStatus_Success LPUART initialize succeed + */ +status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz); + +/*! + * @brief Deinitializes a LPUART instance. + * + * This function waits for transmit to complete, disables TX and RX, and disables the LPUART clock. + * + * @param base LPUART peripheral base address. + */ +void LPUART_Deinit(LPUART_Type *base); + +/*! + * @brief Gets the default configuration structure. + * + * This function initializes the LPUART configuration structure to a default value. The default + * values are: + * lpuartConfig->baudRate_Bps = 115200U; + * lpuartConfig->parityMode = kLPUART_ParityDisabled; + * lpuartConfig->dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig->isMsb = false; + * lpuartConfig->stopBitCount = kLPUART_OneStopBit; + * lpuartConfig->txFifoWatermark = 0; + * lpuartConfig->rxFifoWatermark = 1; + * lpuartConfig->rxIdleType = kLPUART_IdleTypeStartBit; + * lpuartConfig->rxIdleConfig = kLPUART_IdleCharacter1; + * lpuartConfig->enableTx = false; + * lpuartConfig->enableRx = false; + * + * @param config Pointer to a configuration structure. + */ +void LPUART_GetDefaultConfig(lpuart_config_t *config); + +/*! + * @brief Sets the LPUART instance baudrate. + * + * This function configures the LPUART module baudrate. This function is used to update + * the LPUART module baudrate after the LPUART module is initialized by the LPUART_Init. + * @code + * LPUART_SetBaudRate(LPUART1, 115200U, 20000000U); + * @endcode + * + * @param base LPUART peripheral base address. + * @param baudRate_Bps LPUART baudrate to be set. + * @param srcClock_Hz LPUART clock source frequency in HZ. + * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not supported in the current clock source. + * @retval kStatus_Success Set baudrate succeeded. + */ +status_t LPUART_SetBaudRate(LPUART_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); + +/** @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets LPUART status flags. + * + * This function gets all LPUART status flags. The flags are returned as the logical + * OR value of the enumerators @ref _lpuart_flags. To check for a specific status, + * compare the return value with enumerators in the @ref _lpuart_flags. + * For example, to check whether the TX is empty: + * @code + * if (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(LPUART1)) + * { + * ... + * } + * @endcode + * + * @param base LPUART peripheral base address. + * @return LPUART status flags which are ORed by the enumerators in the _lpuart_flags. + */ +uint32_t LPUART_GetStatusFlags(LPUART_Type *base); + +/*! + * @brief Clears status flags with a provided mask. + * + * This function clears LPUART status flags with a provided mask. Automatically cleared flags + * can't be cleared by this function. + * Flags that can only cleared or set by hardware are: + * kLPUART_TxDataRegEmptyFlag, kLPUART_TransmissionCompleteFlag, kLPUART_RxDataRegFullFlag, + * kLPUART_RxActiveFlag, kLPUART_NoiseErrorInRxDataRegFlag, kLPUART_ParityErrorInRxDataRegFlag, + * kLPUART_TxFifoEmptyFlag,kLPUART_RxFifoEmptyFlag + * Note: This API should be called when the Tx/Rx is idle, otherwise it takes no effects. + * + * @param base LPUART peripheral base address. + * @param mask the status flags to be cleared. The user can use the enumerators in the + * _lpuart_status_flag_t to do the OR operation and get the mask. + * @return 0 succeed, others failed. + * @retval kStatus_LPUART_FlagCannotClearManually The flag can't be cleared by this function but + * it is cleared automatically by hardware. + * @retval kStatus_Success Status in the mask are cleared. + */ +status_t LPUART_ClearStatusFlags(LPUART_Type *base, uint32_t mask); + +/** @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables LPUART interrupts according to a provided mask. + * + * This function enables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See the @ref _lpuart_interrupt_enable. + * This examples shows how to enable TX empty interrupt and RX full interrupt: + * @code + * LPUART_EnableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * @endcode + * + * @param base LPUART peripheral base address. + * @param mask The interrupts to enable. Logical OR of the enumeration _uart_interrupt_enable. + */ +void LPUART_EnableInterrupts(LPUART_Type *base, uint32_t mask); + +/*! + * @brief Disables LPUART interrupts according to a provided mask. + * + * This function disables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See @ref _lpuart_interrupt_enable. + * This example shows how to disable the TX empty interrupt and RX full interrupt: + * @code + * LPUART_DisableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * @endcode + * + * @param base LPUART peripheral base address. + * @param mask The interrupts to disable. Logical OR of @ref _lpuart_interrupt_enable. + */ +void LPUART_DisableInterrupts(LPUART_Type *base, uint32_t mask); + +/*! + * @brief Gets enabled LPUART interrupts. + * + * This function gets the enabled LPUART interrupts. The enabled interrupts are returned + * as the logical OR value of the enumerators @ref _lpuart_interrupt_enable. To check + * a specific interrupt enable status, compare the return value with enumerators + * in @ref _lpuart_interrupt_enable. + * For example, to check whether the TX empty interrupt is enabled: + * @code + * uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(LPUART1); + * + * if (kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts) + * { + * ... + * } + * @endcode + * + * @param base LPUART peripheral base address. + * @return LPUART interrupt flags which are logical OR of the enumerators in @ref _lpuart_interrupt_enable. + */ +uint32_t LPUART_GetEnabledInterrupts(LPUART_Type *base); + +#if defined(FSL_FEATURE_LPUART_HAS_DMA_ENABLE) && FSL_FEATURE_LPUART_HAS_DMA_ENABLE +/*! + * @brief Gets the LPUART data register address. + * + * This function returns the LPUART data register address, which is mainly used by the DMA/eDMA. + * + * @param base LPUART peripheral base address. + * @return LPUART data register addresses which are used both by the transmitter and receiver. + */ +static inline uint32_t LPUART_GetDataRegisterAddress(LPUART_Type *base) +{ + return (uint32_t) & (base->DATA); +} + +/*! + * @brief Enables or disables the LPUART transmitter DMA request. + * + * This function enables or disables the transmit data register empty flag, STAT[TDRE], to generate DMA requests. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableTxDMA(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->BAUD |= LPUART_BAUD_TDMAE_MASK; + } + else + { + base->BAUD &= ~LPUART_BAUD_TDMAE_MASK; + } +} + +/*! + * @brief Enables or disables the LPUART receiver DMA. + * + * This function enables or disables the receiver data register full flag, STAT[RDRF], to generate DMA requests. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableRxDMA(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->BAUD |= LPUART_BAUD_RDMAE_MASK; + } + else + { + base->BAUD &= ~LPUART_BAUD_RDMAE_MASK; + } +} + +/** @} */ +#endif /* FSL_FEATURE_LPUART_HAS_DMA_ENABLE */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Get the LPUART instance from peripheral base address. + * + * @param base LPUART peripheral base address. + * @return LPUART instance. + */ +uint32_t LPUART_GetInstance(LPUART_Type *base); + +/*! + * @brief Enables or disables the LPUART transmitter. + * + * This function enables or disables the LPUART transmitter. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableTx(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= LPUART_CTRL_TE_MASK; + } + else + { + base->CTRL &= ~LPUART_CTRL_TE_MASK; + } +} + +/*! + * @brief Enables or disables the LPUART receiver. + * + * This function enables or disables the LPUART receiver. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableRx(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= LPUART_CTRL_RE_MASK; + } + else + { + base->CTRL &= ~LPUART_CTRL_RE_MASK; + } +} + +/*! + * @brief Writes to the transmitter register. + * + * This function writes data to the transmitter register directly. The upper layer must + * ensure that the TX register is empty or that the TX FIFO has room before calling this function. + * + * @param base LPUART peripheral base address. + * @param data Data write to the TX register. + */ +static inline void LPUART_WriteByte(LPUART_Type *base, uint8_t data) +{ + base->DATA = data; +} + +/*! + * @brief Reads the receiver register. + * + * This function reads data from the receiver register directly. The upper layer must + * ensure that the receiver register is full or that the RX FIFO has data before calling this function. + * + * @param base LPUART peripheral base address. + * @return Data read from data register. + */ +static inline uint8_t LPUART_ReadByte(LPUART_Type *base) +{ +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + uint32_t ctrl = base->CTRL; + uint8_t result; + bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || + (((ctrl & LPUART_CTRL_M7_MASK) == 0U) && ((ctrl & LPUART_CTRL_M_MASK) == 0U) && + ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); + + if (isSevenDataBits) + { + result = (uint8_t)(base->DATA & 0x7FU); + } + else + { + result = (uint8_t)base->DATA; + } + + return result; +#else + return (uint8_t)(base->DATA); +#endif +} + +/*! + * @brief Writes to the transmitter register using a blocking method. + * + * This function polls the transmitter register, first waits for the register to be empty or TX FIFO to have room, + * and writes data to the transmitter buffer, then waits for the dat to be sent out to the bus. + * + * @param base LPUART peripheral base address. + * @param data Start address of the data to write. + * @param length Size of the data to write. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully wrote all data. + */ +status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length); + +/*! + * @brief Reads the receiver data register using a blocking method. + * + * This function polls the receiver register, waits for the receiver register full or receiver FIFO + * has data, and reads data from the TX register. + * + * @param base LPUART peripheral base address. + * @param data Start address of the buffer to store the received data. + * @param length Size of the buffer. + * @retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. + * @retval kStatus_LPUART_NoiseError Noise error happened while receiving data. + * @retval kStatus_LPUART_FramingError Framing error happened while receiving data. + * @retval kStatus_LPUART_ParityError Parity error happened while receiving data. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully received all data. + */ +status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length); + +/** @} */ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the LPUART handle. + * + * This function initializes the LPUART handle, which can be used for other LPUART + * transactional APIs. Usually, for a specified LPUART instance, + * call this API once to get the initialized handle. + * + * The LPUART driver supports the "background" receiving, which means that user can set up + * an RX ring buffer optionally. Data received is stored into the ring buffer even when the + * user doesn't call the LPUART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * The ring buffer is disabled if passing NULL as @p ringBuffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param callback Callback function. + * @param userData User data. + */ +void LPUART_TransferCreateHandle(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_callback_t callback, + void *userData); +/*! + * @brief Transmits a buffer of data using the interrupt method. + * + * This function send data using an interrupt method. This is a non-blocking function, which + * returns directly without waiting for all data written to the transmitter register. When + * all data is written to the TX register in the ISR, the LPUART driver calls the callback + * function and passes the @ref kStatus_LPUART_TxIdle as status parameter. + * + * @note The kStatus_LPUART_TxIdle is passed to the upper layer when all data are written + * to the TX register. However, there is no check to ensure that all the data sent out. Before disabling the TX, + * check the kLPUART_TransmissionCompleteFlag to ensure that the transmit is finished. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param xfer LPUART transfer structure, see #lpuart_transfer_t. + * @retval kStatus_Success Successfully start the data transmission. + * @retval kStatus_LPUART_TxBusy Previous transmission still not finished, data not all written to the TX register. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferSendNonBlocking(LPUART_Type *base, lpuart_handle_t *handle, lpuart_transfer_t *xfer); + +/*! + * @brief Sets up the RX ring buffer. + * + * This function sets up the RX ring buffer to a specific UART handle. + * + * When the RX ring buffer is used, data received is stored into the ring buffer even when + * the user doesn't call the UART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * + * @note When using RX ring buffer, one byte is reserved for internal use. In other + * words, if @p ringBufferSize is 32, then only 31 bytes are used for saving data. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. + * @param ringBufferSize size of the ring buffer. + */ +void LPUART_TransferStartRingBuffer(LPUART_Type *base, + lpuart_handle_t *handle, + uint8_t *ringBuffer, + size_t ringBufferSize); + +/*! + * @brief Aborts the background transfer and uninstalls the ring buffer. + * + * This function aborts the background transfer and uninstalls the ring buffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferStopRingBuffer(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Get the length of received data in RX ring buffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @return Length of received data in RX ring buffer. + */ +size_t LPUART_TransferGetRxRingBufferLength(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Aborts the interrupt-driven data transmit. + * + * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out + * how many bytes are not sent out. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferAbortSend(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Gets the number of bytes that have been sent out to bus. + * + * This function gets the number of bytes that have been sent out to bus by an interrupt method. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Send bytes count. + * @retval kStatus_NoTransferInProgress No send in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetSendCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); + +/*! + * @brief Receives a buffer of data using the interrupt method. + * + * This function receives data using an interrupt method. This is a non-blocking function + * which returns without waiting to ensure that all data are received. + * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and + * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer. + * After copying, if the data in the ring buffer is not enough for read, the receive + * request is saved by the LPUART driver. When the new data arrives, the receive request + * is serviced first. When all data is received, the LPUART driver notifies the upper layer + * through a callback function and passes a status parameter kStatus_UART_RxIdle. + * For example, the upper layer needs 10 bytes but there are only 5 bytes in ring buffer. + * The 5 bytes are copied to xfer->data, which returns with the + * parameter @p receivedBytes set to 5. For the remaining 5 bytes, the newly arrived data is + * saved from xfer->data[5]. When 5 bytes are received, the LPUART driver notifies the upper layer. + * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt + * to receive data to xfer->data. When all data is received, the upper layer is notified. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param xfer LPUART transfer structure, see uart_transfer_t. + * @param receivedBytes Bytes received from the ring buffer directly. + * @retval kStatus_Success Successfully queue the transfer into the transmit queue. + * @retval kStatus_LPUART_RxBusy Previous receive request is not finished. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferReceiveNonBlocking(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_t *xfer, + size_t *receivedBytes); + +/*! + * @brief Aborts the interrupt-driven data receiving. + * + * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out + * how many bytes not received yet. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferAbortReceive(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Gets the number of bytes that have been received. + * + * This function gets the number of bytes that have been received. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Receive bytes count. + * @retval kStatus_NoTransferInProgress No receive in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetReceiveCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); + +/*! + * @brief LPUART IRQ handle function. + * + * This function handles the LPUART transmit and receive IRQ request. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferHandleIRQ(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief LPUART Error IRQ handle function. + * + * This function handles the LPUART error IRQ request. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferHandleErrorIRQ(LPUART_Type *base, lpuart_handle_t *handle); + +/** @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* _FSL_LPUART_H_ */ diff --git a/platform/drivers/mtr/Makefile b/platform/drivers/mtr/Makefile new file mode 100644 index 0000000..159105d --- /dev/null +++ b/platform/drivers/mtr/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/mtr/fsl_mtr.o + +DIRS += $(OUT)/drivers/mtr + diff --git a/platform/drivers/mtr/fsl_mtr.h b/platform/drivers/mtr/fsl_mtr.h new file mode 100755 index 0000000..0d6c2d8 --- /dev/null +++ b/platform/drivers/mtr/fsl_mtr.h @@ -0,0 +1,68 @@ +/* + * Copyright 2018-2019 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SDRVL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FSL_MTR_H +#define FSL_MTR_H + +#include "fsl_common.h" + +/*! + * @addtogroup mtr + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +sc_bool_t MTR_repair_mem(uint8_t power_plane_sel); + +sc_bool_t MTR_bisr_xfer(uint32_t bisr_addr, uint32_t start_addr, uint32_t end_addr); + +sc_bool_t MTR_bisr_soft_reset(uint32_t bisr_addr); + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ + +#endif /* FSL_MTR_H */ diff --git a/platform/drivers/mu/Makefile b/platform/drivers/mu/Makefile new file mode 100755 index 0000000..0e6156e --- /dev/null +++ b/platform/drivers/mu/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/mu/fsl_mu.o + +DIRS += $(OUT)/drivers/mu + diff --git a/platform/drivers/mu/fsl_mu.h b/platform/drivers/mu/fsl_mu.h new file mode 100755 index 0000000..e727ac0 --- /dev/null +++ b/platform/drivers/mu/fsl_mu.h @@ -0,0 +1,741 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_MU_H_ +#define _FSL_MU_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup mu + * @{ + */ + +/****************************************************************************** + * Definitions + *****************************************************************************/ + +/* Compatibility Macros */ +#ifndef MU_CR_NMI_MASK +#define MU_CR_NMI_MASK 0U +#endif + +#if (defined(FSL_FEATURE_MU_HAS_RESET_INT) && FSL_FEATURE_MU_HAS_RESET_INT) + +#ifndef FSL_FEATURE_MU_HAS_RESET_ASSERT_INT +#define FSL_FEATURE_MU_HAS_RESET_ASSERT_INT 1 +#endif + +#ifndef FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT +#define FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT 1 +#endif + +#endif /* FSL_FEATURE_MU_HAS_RESET_INT */ + +/*! @name Driver version */ +/** @{ */ +/*! @brief MU driver version 2.0.3. */ +#define FSL_MU_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) +/** @} */ + +/*! + * @brief MU status flags. + */ +enum _mu_status_flags +{ + kMU_Tx0EmptyFlag = (1U << (MU_SR_TEn_SHIFT + 3U)), /*!< TX0 empty. */ + kMU_Tx1EmptyFlag = (1U << (MU_SR_TEn_SHIFT + 2U)), /*!< TX1 empty. */ + kMU_Tx2EmptyFlag = (1U << (MU_SR_TEn_SHIFT + 1U)), /*!< TX2 empty. */ + kMU_Tx3EmptyFlag = (1U << (MU_SR_TEn_SHIFT + 0U)), /*!< TX3 empty. */ + + kMU_Rx0FullFlag = (1U << (MU_SR_RFn_SHIFT + 3U)), /*!< RX0 full. */ + kMU_Rx1FullFlag = (1U << (MU_SR_RFn_SHIFT + 2U)), /*!< RX1 full. */ + kMU_Rx2FullFlag = (1U << (MU_SR_RFn_SHIFT + 1U)), /*!< RX2 full. */ + kMU_Rx3FullFlag = (1U << (MU_SR_RFn_SHIFT + 0U)), /*!< RX3 full. */ + + kMU_GenInt0Flag = (int)(1U << (MU_SR_GIPn_SHIFT + 3U)), /*!< General purpose interrupt 0 pending. */ + kMU_GenInt1Flag = (1U << (MU_SR_GIPn_SHIFT + 2U)), /*!< General purpose interrupt 0 pending. */ + kMU_GenInt2Flag = (1U << (MU_SR_GIPn_SHIFT + 1U)), /*!< General purpose interrupt 0 pending. */ + kMU_GenInt3Flag = (1U << (MU_SR_GIPn_SHIFT + 0U)), /*!< General purpose interrupt 0 pending. */ + + kMU_EventPendingFlag = MU_SR_EP_MASK, /*!< MU event pending. */ + kMU_FlagsUpdatingFlag = MU_SR_FUP_MASK, /*!< MU flags update is on-going. */ + +#if (defined(FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + kMU_ResetAssertInterruptFlag = MU_SR_RAIP_MASK, /*!< The other core reset assert interrupt pending. */ +#endif +#if (defined(FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT) + kMU_ResetDeassertInterruptFlag = MU_SR_RDIP_MASK, /*!< The other core reset de-assert interrupt pending. */ +#endif + +#if (defined(FSL_FEATURE_MU_HAS_SR_RS) && FSL_FEATURE_MU_HAS_SR_RS) + kMU_OtherSideInResetFlag = MU_SR_RS_MASK /*!< The other side is in reset. */ +#endif + +#if (defined(FSL_FEATURE_MU_HAS_SR_MURIP) && FSL_FEATURE_MU_HAS_SR_MURIP) + kMU_MuResetInterruptFlag = MU_SR_MURIP_MASK, /*!< The other side initializes MU reset. */ +#endif +#if (defined(FSL_FEATURE_MU_HAS_SR_HRIP) && FSL_FEATURE_MU_HAS_SR_HRIP) + kMU_HardwareResetInterruptFlag = MU_SR_HRIP_MASK, /*!< Current side has been hardware reset by the other side. */ +#endif +}; + +/*! + * @brief MU interrupt source to enable. + */ +enum _mu_interrupt_enable +{ + kMU_Tx0EmptyInterruptEnable = (1U << (MU_CR_TIEn_SHIFT + 3U)), /*!< TX0 empty. */ + kMU_Tx1EmptyInterruptEnable = (1U << (MU_CR_TIEn_SHIFT + 2U)), /*!< TX1 empty. */ + kMU_Tx2EmptyInterruptEnable = (1U << (MU_CR_TIEn_SHIFT + 1U)), /*!< TX2 empty. */ + kMU_Tx3EmptyInterruptEnable = (1U << (MU_CR_TIEn_SHIFT + 0U)), /*!< TX3 empty. */ + + kMU_Rx0FullInterruptEnable = (1U << (MU_CR_RIEn_SHIFT + 3U)), /*!< RX0 full. */ + kMU_Rx1FullInterruptEnable = (1U << (MU_CR_RIEn_SHIFT + 2U)), /*!< RX1 full. */ + kMU_Rx2FullInterruptEnable = (1U << (MU_CR_RIEn_SHIFT + 1U)), /*!< RX2 full. */ + kMU_Rx3FullInterruptEnable = (1U << (MU_CR_RIEn_SHIFT + 0U)), /*!< RX3 full. */ + + kMU_GenInt0InterruptEnable = (int)(1U << (MU_CR_GIEn_SHIFT + 3U)), /*!< General purpose interrupt 0. */ + kMU_GenInt1InterruptEnable = (1U << (MU_CR_GIEn_SHIFT + 2U)), /*!< General purpose interrupt 1. */ + kMU_GenInt2InterruptEnable = (1U << (MU_CR_GIEn_SHIFT + 1U)), /*!< General purpose interrupt 2. */ + kMU_GenInt3InterruptEnable = (1U << (MU_CR_GIEn_SHIFT + 0U)), /*!< General purpose interrupt 3. */ + +#if (defined(FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + kMU_ResetAssertInterruptEnable = MU_CR_RAIE_MASK, /*!< The other core reset assert interrupt. */ +#endif +#if (defined(FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + kMU_ResetDeassertInterruptEnable = MU_CR_RDIE_MASK, /*!< The other core reset de-assert interrupt. */ +#endif +#if (defined(FSL_FEATURE_MU_HAS_SR_MURIP) && FSL_FEATURE_MU_HAS_SR_MURIP) + kMU_MuResetInterruptEnable = MU_CR_MURIE_MASK, /*!< The other side initializes MU reset. The interrupt + is ORed with the general purpose interrupt 3. The + general purpose interrupt 3 is issued when the other side + set the MU reset and this interrupt is enabled. */ +#endif +#if (defined(FSL_FEATURE_MU_HAS_SR_HRIP) && FSL_FEATURE_MU_HAS_SR_HRIP) + kMU_HardwareResetInterruptEnable = MU_CR_HRIE_MASK, /*!< Current side has been hardware reset by the other side. */ +#endif +}; + +/*! + * @brief MU interrupt that could be triggered to the other core. + */ +enum _mu_interrupt_trigger +{ +#if !(defined(FSL_FEATURE_MU_NO_NMI) && FSL_FEATURE_MU_NO_NMI) + kMU_NmiInterruptTrigger = MU_CR_NMI_MASK, /*!< NMI interrupt. */ +#endif + kMU_GenInt0InterruptTrigger = (1U << (MU_CR_GIRn_SHIFT + 3U)), /*!< General purpose interrupt 0. */ + kMU_GenInt1InterruptTrigger = (1U << (MU_CR_GIRn_SHIFT + 2U)), /*!< General purpose interrupt 1. */ + kMU_GenInt2InterruptTrigger = (1U << (MU_CR_GIRn_SHIFT + 1U)), /*!< General purpose interrupt 2. */ + kMU_GenInt3InterruptTrigger = (1U << (MU_CR_GIRn_SHIFT + 0U)) /*!< General purpose interrupt 3. */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name MU initialization. + * @{ + */ +/*! + * @brief Initializes the MU module. + * + * This function enables the MU clock only. + * + * @param base MU peripheral base address. + */ +void MU_Init(MU_Type *base); + +/*! + * @brief De-initializes the MU module. + * + * This function disables the MU clock only. + * + * @param base MU peripheral base address. + */ +void MU_Deinit(MU_Type *base); + +/** @} */ + +/*! + * @name MU Message + * @{ + */ + +/*! + * @brief Writes a message to the TX register. + * + * This function writes a message to the specific TX register. It does not check + * whether the TX register is empty or not. The upper layer should make sure the TX + * register is empty before calling this function. This function can be used + * in ISR for better performance. + * + * @code + * while (!(kMU_Tx0EmptyFlag & MU_GetStatusFlags(base))) { } Wait for TX0 register empty. + * MU_SendMsgNonBlocking(base, 0U, MSG_VAL); Write message to the TX0 register. + * @endcode + * + * @param base MU peripheral base address. + * @param regIndex TX register index. + * @param msg Message to send. + */ +static inline void MU_SendMsgNonBlocking(MU_Type *base, uint32_t regIndex, uint32_t msg) +{ + assert(regIndex < MU_TR_COUNT); + + base->TR[regIndex] = msg; +} + +/*! + * @brief Blocks to send a message. + * + * This function waits until the TX register is empty and sends the message. + * + * @param base MU peripheral base address. + * @param regIndex TX register index. + * @param msg Message to send. + */ +void MU_SendMsg(MU_Type *base, uint32_t regIndex, uint32_t msg); + +/*! + * @brief Reads a message from the RX register. + * + * This function reads a message from the specific RX register. It does not check + * whether the RX register is full or not. The upper layer should make sure the RX + * register is full before calling this function. This function can be used + * in ISR for better performance. + * + * @code + * uint32_t msg; + * while (!(kMU_Rx0FullFlag & MU_GetStatusFlags(base))) + * { + * } Wait for the RX0 register full. + * + * msg = MU_ReceiveMsgNonBlocking(base, 0U); Read message from RX0 register. + * @endcode + * + * @param base MU peripheral base address. + * @param regIndex TX register index. + * @return The received message. + */ +static inline uint32_t MU_ReceiveMsgNonBlocking(MU_Type *base, uint32_t regIndex) +{ + assert(regIndex < MU_TR_COUNT); + + return base->RR[regIndex]; +} + +/*! + * @brief Blocks to receive a message. + * + * This function waits until the RX register is full and receives the message. + * + * @param base MU peripheral base address. + * @param regIndex RX register index. + * @return The received message. + */ +uint32_t MU_ReceiveMsg(MU_Type *base, uint32_t regIndex); + +/** @} */ + +/*! + * @name MU Flags + * @{ + */ + +/*! + * @brief Sets the 3-bit MU flags reflect on the other MU side. + * + * This function sets the 3-bit MU flags directly. Every time the 3-bit MU flags are changed, + * the status flag \c kMU_FlagsUpdatingFlag asserts indicating the 3-bit MU flags are + * updating to the other side. After the 3-bit MU flags are updated, the status flag + * \c kMU_FlagsUpdatingFlag is cleared by hardware. During the flags updating period, + * the flags cannot be changed. The upper layer should make sure the status flag + * \c kMU_FlagsUpdatingFlag is cleared before calling this function. + * + * @code + * while (kMU_FlagsUpdatingFlag & MU_GetStatusFlags(base)) + * { + * } Wait for previous MU flags updating. + * + * MU_SetFlagsNonBlocking(base, 0U); Set the mU flags. + * @endcode + * + * @param base MU peripheral base address. + * @param flags The 3-bit MU flags to set. + */ +static inline void MU_SetFlagsNonBlocking(MU_Type *base, uint32_t flags) +{ + uint32_t reg = base->CR; + reg = (reg & ~((MU_CR_GIRn_MASK | MU_CR_NMI_MASK) | MU_CR_Fn_MASK)) | MU_CR_Fn(flags); + base->CR = reg; +} + +/*! + * @brief Blocks setting the 3-bit MU flags reflect on the other MU side. + * + * This function blocks setting the 3-bit MU flags. Every time the 3-bit MU flags are changed, + * the status flag \c kMU_FlagsUpdatingFlag asserts indicating the 3-bit MU flags are + * updating to the other side. After the 3-bit MU flags are updated, the status flag + * \c kMU_FlagsUpdatingFlag is cleared by hardware. During the flags updating period, + * the flags cannot be changed. This function waits for the MU status flag + * \c kMU_FlagsUpdatingFlag cleared and sets the 3-bit MU flags. + * + * @param base MU peripheral base address. + * @param flags The 3-bit MU flags to set. + */ +void MU_SetFlags(MU_Type *base, uint32_t flags); + +/*! + * @brief Gets the current value of the 3-bit MU flags set by the other side. + * + * This function gets the current 3-bit MU flags on the current side. + * + * @param base MU peripheral base address. + * @return flags Current value of the 3-bit flags. + */ +static inline uint32_t MU_GetFlags(MU_Type *base) +{ + return (base->SR & MU_SR_Fn_MASK) >> MU_SR_Fn_SHIFT; +} + +/** @} */ + +/*! + * @name Status and Interrupt. + * @{ + */ + +/*! + * @brief Gets the MU status flags. + * + * This function returns the bit mask of the MU status flags. See _mu_status_flags. + * + * @code + * uint32_t flags; + * flags = MU_GetStatusFlags(base); Get all status flags. + * if (kMU_Tx0EmptyFlag & flags) + * { + * The TX0 register is empty. Message can be sent. + * MU_SendMsgNonBlocking(base, 0U, MSG0_VAL); + * } + * if (kMU_Tx1EmptyFlag & flags) + * { + * The TX1 register is empty. Message can be sent. + * MU_SendMsgNonBlocking(base, 1U, MSG1_VAL); + * } + * @endcode + * + * @param base MU peripheral base address. + * @return Bit mask of the MU status flags, see _mu_status_flags. + */ +static inline uint32_t MU_GetStatusFlags(MU_Type *base) +{ + return (base->SR & (MU_SR_TEn_MASK | MU_SR_RFn_MASK | MU_SR_GIPn_MASK | MU_SR_EP_MASK | MU_SR_FUP_MASK +#if (defined(FSL_FEATURE_MU_HAS_SR_RS) && FSL_FEATURE_MU_HAS_SR_RS) + | MU_SR_RS_MASK +#endif +#if (defined(FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + | MU_SR_RAIP_MASK +#endif +#if (defined(FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + | MU_SR_RDIP_MASK +#endif +#if (defined(FSL_FEATURE_MU_HAS_SR_MURIP) && FSL_FEATURE_MU_HAS_SR_MURIP) + | MU_SR_MURIP_MASK +#endif +#if (defined(FSL_FEATURE_MU_HAS_SR_HRIP) && FSL_FEATURE_MU_HAS_SR_HRIP) + | MU_SR_HRIP_MASK +#endif + )); +} + +/*! + * @brief Gets the MU IRQ pending status. + * + * This function returns the bit mask of the pending MU IRQs. + * + * @param base MU peripheral base address. + * @return Bit mask of the MU IRQs pending. + */ +static inline uint32_t MU_GetInterruptsPending(MU_Type *base) +{ + uint32_t irqMask = base->CR & (MU_CR_GIRn_MASK | MU_CR_TIEn_MASK | MU_CR_RIEn_MASK); + return (base->SR & irqMask); +} + +/*! + * @brief Clears the specific MU status flags. + * + * This function clears the specific MU status flags. The flags to clear should + * be passed in as bit mask. See _mu_status_flags. + * + * @code + * Clear general interrupt 0 and general interrupt 1 pending flags. + * MU_ClearStatusFlags(base, kMU_GenInt0Flag | kMU_GenInt1Flag); + * @endcode + * + * @param base MU peripheral base address. + * @param mask Bit mask of the MU status flags. See _mu_status_flags. The following + * flags are cleared by hardware, this function could not clear them. + * - kMU_Tx0EmptyFlag + * - kMU_Tx1EmptyFlag + * - kMU_Tx2EmptyFlag + * - kMU_Tx3EmptyFlag + * - kMU_Rx0FullFlag + * - kMU_Rx1FullFlag + * - kMU_Rx2FullFlag + * - kMU_Rx3FullFlag + * - kMU_EventPendingFlag + * - kMU_FlagsUpdatingFlag + * - kMU_OtherSideInResetFlag + */ +static inline void MU_ClearStatusFlags(MU_Type *base, uint32_t mask) +{ + /* regMask is the mask of w1c status bits. */ + uint32_t regMask = MU_SR_GIPn_MASK; + +#if (defined(FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + regMask |= MU_SR_RAIP_MASK; +#endif +#if (defined(FSL_FEATURE_MU_HAS_RESET_DEASSERT_INT) && FSL_FEATURE_MU_HAS_RESET_ASSERT_INT) + regMask |= MU_SR_RDIP_MASK; +#endif + +#if (defined(FSL_FEATURE_MU_HAS_SR_MURIP) && FSL_FEATURE_MU_HAS_SR_MURIP) + regMask |= MU_SR_MURIP_MASK; +#endif + +#if (defined(FSL_FEATURE_MU_HAS_SR_HRIP) && FSL_FEATURE_MU_HAS_SR_HRIP) + regMask |= MU_SR_HRIP_MASK; +#endif + + base->SR = (mask & regMask); +} + +/*! + * @brief Enables the specific MU interrupts. + * + * This function enables the specific MU interrupts. The interrupts to enable + * should be passed in as bit mask. See _mu_interrupt_enable. + * + * @code + * Enable general interrupt 0 and TX0 empty interrupt. + * MU_EnableInterrupts(base, kMU_GenInt0InterruptEnable | kMU_Tx0EmptyInterruptEnable); + * @endcode + * + * @param base MU peripheral base address. + * @param mask Bit mask of the MU interrupts. See _mu_interrupt_enable. + */ +static inline void MU_EnableInterrupts(MU_Type *base, uint32_t mask) +{ + uint32_t reg = base->CR; + reg = (reg & ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK)) | mask; + base->CR = reg; +} + +/*! + * @brief Disables the specific MU interrupts. + * + * This function disables the specific MU interrupts. The interrupts to disable + * should be passed in as bit mask. See _mu_interrupt_enable. + * + * @code + * Disable general interrupt 0 and TX0 empty interrupt. + * MU_DisableInterrupts(base, kMU_GenInt0InterruptEnable | kMU_Tx0EmptyInterruptEnable); + * @endcode + * + * @param base MU peripheral base address. + * @param mask Bit mask of the MU interrupts. See _mu_interrupt_enable. + */ +static inline void MU_DisableInterrupts(MU_Type *base, uint32_t mask) +{ + uint32_t reg = base->CR; + reg &= ~((MU_CR_GIRn_MASK | MU_CR_NMI_MASK) | mask); + base->CR = reg; +} + +/*! + * @brief Triggers interrupts to the other core. + * + * This function triggers the specific interrupts to the other core. The interrupts + * to trigger are passed in as bit mask. See \ref _mu_interrupt_trigger. + * The MU should not trigger an interrupt to the other core when the previous interrupt + * has not been processed by the other core. This function checks whether the + * previous interrupts have been processed. If not, it returns an error. + * + * @code + * if (kStatus_Success != MU_TriggerInterrupts(base, kMU_GenInt0InterruptTrigger | kMU_GenInt2InterruptTrigger)) + * { + * Previous general purpose interrupt 0 or general purpose interrupt 2 + * has not been processed by the other core. + * } + * @endcode + * + * @param base MU peripheral base address. + * @param mask Bit mask of the interrupts to trigger. See _mu_interrupt_trigger. + * @retval kStatus_Success Interrupts have been triggered successfully. + * @retval kStatus_Fail Previous interrupts have not been accepted. + */ +status_t MU_TriggerInterrupts(MU_Type *base, uint32_t mask); + +#if !(defined(FSL_FEATURE_MU_NO_NMI) && FSL_FEATURE_MU_NO_NMI) +/*! + * @brief Clear non-maskable interrupt (NMI) sent by the other core. + * + * This function clears non-maskable interrupt (NMI) sent by the other core. + * + * @param base MU peripheral base address. + */ +static inline void MU_ClearNmi(MU_Type *base) +{ + base->SR = MU_SR_NMIC_MASK; +} +#endif /* FSL_FEATURE_MU_NO_NMI */ + +/** @} */ + +/*! + * @name MU misc functions + * @{ + */ + +#if !(defined(FSL_FEATURE_MU_NO_RSTH) && FSL_FEATURE_MU_NO_RSTH) +/*! + * @brief Boots the core at B side. + * + * This function sets the B side core's boot configuration and releases the + * core from reset. + * + * @param base MU peripheral base address. + * @param mode Core B boot mode. + * @note Only MU side A can use this function. + */ +void MU_BootCoreB(MU_Type *base, mu_core_boot_mode_t mode); + +/*! + * @brief Holds the core reset of B side. + * + * This function causes the core of B side to be held in reset following any reset event. + * + * @param base MU peripheral base address. + * @note Only A side could call this function. + */ +static inline void MU_HoldCoreBReset(MU_Type *base) +{ +#if (defined(FSL_FEATURE_MU_HAS_CCR) && FSL_FEATURE_MU_HAS_CCR) + base->CCR |= MU_CCR_RSTH_MASK; +#else /* FSL_FEATURE_MU_HAS_CCR */ + uint32_t reg = base->CR; + reg = (reg & ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK)) | MU_CR_RSTH_MASK; + base->CR = reg; +#endif /* FSL_FEATURE_MU_HAS_CCR */ +} + +/*! + * @brief Boots the other core. + * + * This function boots the other core with a boot configuration. + * + * @param base MU peripheral base address. + * @param mode The other core boot mode. + */ +void MU_BootOtherCore(MU_Type *base, mu_core_boot_mode_t mode); + +/*! + * @brief Holds the other core reset. + * + * This function causes the other core to be held in reset following any reset event. + * + * @param base MU peripheral base address. + */ +static inline void MU_HoldOtherCoreReset(MU_Type *base) +{ + /* + * MU_HoldOtherCoreReset and MU_HoldCoreBReset are the same, MU_HoldCoreBReset + * is kept for compatible with older platforms. + */ + MU_HoldCoreBReset(base); +} +#endif /* FSL_FEATURE_MU_NO_RSTH */ + +#if !(defined(FSL_FEATURE_MU_NO_MUR) && FSL_FEATURE_MU_NO_MUR) +/*! + * @brief Resets the MU for both A side and B side. + * + * This function resets the MU for both A side and B side. Before reset, it is + * recommended to interrupt processor B, because this function may affect the + * ongoing processor B programs. + * + * @param base MU peripheral base address. + * @note For some platforms, only MU side A could use this function, check + * reference manual for details. + */ +static inline void MU_ResetBothSides(MU_Type *base) +{ + uint32_t reg = base->CR; + reg = (reg & ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK)) | MU_CR_MUR_MASK; + base->CR = reg; + +#if (defined(FSL_FEATURE_MU_HAS_SR_RS) && FSL_FEATURE_MU_HAS_SR_RS) + /* Wait for the other side out of reset. */ + while (0U != (base->SR & MU_SR_RS_MASK)) + { + } +#endif /* FSL_FEATURE_MU_HAS_SR_RS */ +} +#endif /* FSL_FEATURE_MU_NO_MUR */ + +#if (defined(FSL_FEATURE_MU_HAS_HRM) && FSL_FEATURE_MU_HAS_HRM) +/*! + * @brief Mask hardware reset by the other core. + * + * The other core could call MU_HardwareResetOtherCore() to reset current core. + * To mask the reset, call this function and pass in true. + * + * @param base MU peripheral base address. + * @param mask Pass true to mask the hardware reset, pass false to unmask it. + */ +static inline void MU_MaskHardwareReset(MU_Type *base, bool mask) +{ +#if (defined(FSL_FEATURE_MU_HAS_CCR) && FSL_FEATURE_MU_HAS_CCR) + if (mask) + { + base->CCR |= MU_CCR_HRM_MASK; + } + else + { + base->CCR &= ~MU_CCR_HRM_MASK; + } +#else /* FSL_FEATURE_MU_HAS_CCR */ + if (mask) + { + base->CR |= MU_CR_HRM_MASK; + } + else + { + base->CR &= ~MU_CR_HRM_MASK; + } +#endif /* FSL_FEATURE_MU_HAS_CCR */ +} +#endif /* FSL_FEATURE_MU_HAS_HRM */ + +#if !(defined(FSL_FEATURE_MU_NO_HR) && FSL_FEATURE_MU_NO_HR) +/*! + * @brief Hardware reset the other core. + * + * This function resets the other core, the other core could mask the + * hardware reset by calling MU_MaskHardwareReset. The hardware reset + * mask feature is only available for some platforms. + * This function could be used together with MU_BootOtherCore to control the + * other core reset workflow. + * + * Example 1: Reset the other core, and no hold reset + * @code + * MU_HardwareResetOtherCore(MU_A, true, false, bootMode); + * @endcode + * In this example, the core at MU side B will reset with the specified boot mode. + * + * Example 2: Reset the other core and hold it, then boot the other core later. + * @code + * Here the other core enters reset, and the reset is hold + * MU_HardwareResetOtherCore(MU_A, true, true, modeDontCare); + * Current core boot the other core when necessary. + * MU_BootOtherCore(MU_A, bootMode); + * @endcode + * + * @param base MU peripheral base address. + * @param waitReset Wait the other core enters reset. + * - true: Wait until the other core enters reset, if the other + * core has masked the hardware reset, then this function will + * be blocked. + * - false: Don't wait the reset. + * @param holdReset Hold the other core reset or not. + * - true: Hold the other core in reset, this function returns + * directly when the other core enters reset. + * - false: Don't hold the other core in reset, this function + * waits until the other core out of reset. + * @param bootMode Boot mode of the other core, if @p holdReset is true, this + * parameter is useless. + */ +void MU_HardwareResetOtherCore(MU_Type *base, bool waitReset, bool holdReset, mu_core_boot_mode_t bootMode); +#endif /* FSL_FEATURE_MU_NO_HR */ + +#if !(defined(FSL_FEATURE_MU_NO_CLKE) && FSL_FEATURE_MU_NO_CLKE) +/*! + * @brief Enables or disables the clock on the other core. + * + * This function enables or disables the platform clock on the other core when + * that core enters a stop mode. If disabled, the platform clock for the other + * core is disabled when it enters stop mode. If enabled, the platform clock + * keeps running on the other core in stop mode, until this core also enters + * stop mode. + * + * @param base MU peripheral base address. + * @param enable Enable or disable the clock on the other core. + */ +static inline void MU_SetClockOnOtherCoreEnable(MU_Type *base, bool enable) +{ +#if (defined(FSL_FEATURE_MU_HAS_CCR) && FSL_FEATURE_MU_HAS_CCR) + if (enable) + { + base->CCR |= MU_CCR_CLKE_MASK; + } + else + { + base->CCR &= ~MU_CCR_CLKE_MASK; + } +#else /* FSL_FEATURE_MU_HAS_CCR */ + uint32_t reg = base->CR; + + reg &= ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK); + + if (enable) + { + reg |= MU_CR_CLKE_MASK; + } + else + { + reg &= ~MU_CR_CLKE_MASK; + } + + base->CR = reg; +#endif /* FSL_FEATURE_MU_HAS_CCR */ +} +#endif /* FSL_FEATURE_MU_NO_CLKE */ + +#if !(defined(FSL_FEATURE_MU_NO_PM) && FSL_FEATURE_MU_NO_PM) +/*! + * @brief Gets the power mode of the other core. + * + * This function gets the power mode of the other core. + * + * @param base MU peripheral base address. + * @return Power mode of the other core. + */ +static inline mu_power_mode_t MU_GetOtherCorePowerMode(MU_Type *base) +{ + uint32_t ret = (base->SR & MU_SR_PM_MASK) >> MU_SR_PM_SHIFT; + + return (mu_power_mode_t)ret; +} +#endif /* FSL_FEATURE_MU_NO_PM */ + +/** @} */ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/** @} */ + +#endif /* _FSL_MU_H_*/ diff --git a/platform/drivers/nic400/Makefile b/platform/drivers/nic400/Makefile new file mode 100644 index 0000000..4d1f9a8 --- /dev/null +++ b/platform/drivers/nic400/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/nic400/fsl_nic400.o + +DIRS += $(OUT)/drivers/nic400 + diff --git a/platform/drivers/nic400/fsl_nic400.h b/platform/drivers/nic400/fsl_nic400.h new file mode 100755 index 0000000..2828f75 --- /dev/null +++ b/platform/drivers/nic400/fsl_nic400.h @@ -0,0 +1,98 @@ +/* + * Copyright 2017-2019 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FSL_NIC400_H +#define FSL_NIC400_H + +#include "fsl_common.h" + +/*! + * @addtogroup nic400_driver + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief NIC400 driver version 1.0.0. */ +#define FSL_NIC400_DRIVER_VERSION (MAKE_VERSION(1, 0, 0)) +/** @} */ + +/*! @brief NIC400 Master interface base offset. */ +#define NIC400_MSTR_INTF_OFFSET 0x00002000U + +/*! @brief NIC400 Slave interface base offset. */ +#define NIC400_SLV_INTF_OFFSET 0x00042000U + +/*! @brief NIC400 Internal interface base offset. */ +#define NIC400_INT_INTF_OFFSET 0x000C2000U + +/*! @brief NIC400 Slave interface size. */ +#define NIC400_SLV_INTF_BLKSZ 0x00001000U + +/*! @brief NIC400 Max index of Slave interface. */ +#define NIC400_MAX_SLV_INTF_IDX 127U + +#define NIC400_ASIB_READ_QOS_REG 0x100U +#define NIC400_ASIB_WRITE_QOS_REG 0x104U +#define NIC400_ASIB_FN_MOD_REG 0x108U + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +/*! + * @brief Set NIC400 ASIB register. + */ +void NIC400_Set_ASIB(uint32_t base, uint8_t slave_num, + uint16_t register_offset, uint8_t val); + +/*! + * @brief Get NIC400 ASIB register. + */ +uint32_t NIC400_Get_ASIB(uint32_t base, uint8_t slave_num, + uint16_t register_offset); + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_NIC400_H */ + diff --git a/platform/drivers/otp/Makefile b/platform/drivers/otp/Makefile new file mode 100755 index 0000000..646211c --- /dev/null +++ b/platform/drivers/otp/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/otp/fsl_otp.o + +DIRS += $(OUT)/drivers/otp + diff --git a/platform/drivers/otp/fsl_otp.h b/platform/drivers/otp/fsl_otp.h new file mode 100755 index 0000000..41eb615 --- /dev/null +++ b/platform/drivers/otp/fsl_otp.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017-2019 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_OTP_H +#define DRV_OTP_H + +/*! + * @addtogroup otp_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "svc/misc/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +sc_err_t OTP_Read(OTP_Type *base, uint32_t word, uint32_t *val); +sc_err_t OTP_Write(OTP_Type *base, uint32_t word, const uint32_t *val); +sc_err_t OTP_Set_Fuse(uint32_t word, const uint32_t *val); +sc_err_t OTP_Get_Fuse(uint32_t word, uint32_t *val); +sc_err_t OTP_Check_Locked(uint32_t word, sc_bool_t *locked); + +#endif /* DRV_OTP_H */ + +/** @} */ + diff --git a/platform/drivers/pad/Makefile b/platform/drivers/pad/Makefile new file mode 100755 index 0000000..e1df43d --- /dev/null +++ b/platform/drivers/pad/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/pad/fsl_pad.o + +DIRS += $(OUT)/drivers/pad + diff --git a/platform/drivers/pad/fsl_pad.h b/platform/drivers/pad/fsl_pad.h new file mode 100755 index 0000000..66c8d15 --- /dev/null +++ b/platform/drivers/pad/fsl_pad.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_PAD_H +#define DRV_PAD_H + +/*! + * @addtogroup pad_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "fsl_device_registers.h" + +/* Defines */ + +/*! + * This define is used to access PAD registers. + */ +#ifdef NO_DEVICE_ACCESS + #define PAD_BASE_ADDR ((PADRING_Type*) (temp_pad)) +#else + #define PAD_BASE_ADDR ((PADRING_Type*) (PAD_BASE)) +#endif + +/* Types */ + +/* Externs */ + +#ifdef NO_DEVICE_ACCESS + /*! + * This variable is used to access fake pads. + */ + extern uint8_t temp_pad[]; +#endif + +/* Functions */ + +void PAD_Init(void); +uint8_t PAD_ExtractMux(uint32_t val); +void PAD_Set(sc_saddr_t ofs, uint32_t val); +void PAD_Get(sc_saddr_t ofs, uint32_t *val); +void PAD_SetMux(sc_saddr_t ofs, uint8_t mux, uint8_t config, + uint8_t iso); +void PAD_GetMux(sc_saddr_t ofs, uint8_t *mux, uint8_t *config, + uint8_t *iso); +void PAD_SetGP(sc_saddr_t ofs, uint32_t ctrl); +void PAD_GetGP(sc_saddr_t ofs, uint32_t *ctrl); +#if FSL_FEATURE_PAD_HAS_28FDSOI +void PAD_SetGP28Fdsoi(sc_saddr_t ofs, uint8_t dse, uint8_t ps); +void PAD_GetGP28Fdsoi(sc_saddr_t ofs, uint8_t *dse, uint8_t *ps); +void PAD_SetGP28FdsoiHsic(sc_saddr_t ofs, uint8_t dse, sc_bool_t hys, + uint8_t pus, sc_bool_t pke, sc_bool_t pue); +void PAD_GetGP28FdsoiHsic(sc_saddr_t ofs, uint8_t *dse, sc_bool_t *hys, + uint8_t *pus, sc_bool_t *pke, sc_bool_t *pue); +void PAD_SetGP28FdsoiComp(sc_saddr_t ofs, uint8_t compen, sc_bool_t fastfrz, + uint8_t rasrcp, uint8_t rasrcn, sc_bool_t nasrc_sel, sc_bool_t psw_ovr); +void PAD_GetGP28FdsoiComp(sc_saddr_t ofs, uint8_t *compen, sc_bool_t *fastfrz, + uint8_t *rasrcp, uint8_t *rasrcn, sc_bool_t *nasrc_sel, sc_bool_t *compok, + uint8_t *nasrc, sc_bool_t *psw_ovr); +#endif +void PAD_SetWakeup(sc_saddr_t ofs, uint8_t wakeup); +void PAD_GetWakeup(sc_saddr_t ofs, uint8_t *wakeup); +void PAD_SetAll(sc_saddr_t ofs, uint8_t mux, uint8_t config, + uint8_t iso, uint32_t ctrl, uint8_t wakeup); +void PAD_GetAll(sc_saddr_t ofs, uint8_t *mux, uint8_t *config, + uint8_t *iso, uint32_t *ctrl, uint8_t *wakeup); + +#ifdef DEBUG + /*! + * @name Debug Functions + * @{ + */ + + /*! + * This function dumps the pads. It's only used for debug. Should + * only be called if the power domain containing the PAD is powered on. + */ + void PAD_Dump(void); + + /** @} */ +#endif + +#endif /* DRV_PAD_H */ + +/** @} */ + diff --git a/platform/drivers/pmic/Makefile b/platform/drivers/pmic/Makefile new file mode 100755 index 0000000..4010ffc --- /dev/null +++ b/platform/drivers/pmic/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/pmic/fsl_pmic.o + +DIRS += $(OUT)/drivers/pmic + diff --git a/platform/drivers/pmic/doxygen/fsl_pmic.dox b/platform/drivers/pmic/doxygen/fsl_pmic.dox new file mode 100755 index 0000000..4d0e8a2 --- /dev/null +++ b/platform/drivers/pmic/doxygen/fsl_pmic.dox @@ -0,0 +1,9 @@ +/*! +@defgroup pmic_driver PMIC: Power Management IC Driver +Module for the PMIC driver. + +@details It is an SDK driver for the PMIC module of i.MX devices. PMIC users +shoud not call the PMIC driver functions directly. Instead, use the PMIC access +macros. This allows for quick PMIC change and dynamic PMIC binding. + +*/ diff --git a/platform/drivers/pmic/fsl_pmic.c b/platform/drivers/pmic/fsl_pmic.c new file mode 100755 index 0000000..b0c0a1a --- /dev/null +++ b/platform/drivers/pmic/fsl_pmic.c @@ -0,0 +1,637 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "fsl_device_registers.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "fsl_common.h" + +/* Local Defines */ +#define MAX_DATA_LENGTH 8U +#define POLY 0x1DU /* SAE J1850 Polynomial */ + +/* Local Functions */ + +uint8_t pf8x00_crc_data(uint8_t addr, uint8_t reg, const uint8_t * const data, + uint32_t msg_size); + +/* Local Variables */ + +/*--------------------------------------------------------------------------*/ +/* Write to the PMIC via the I2C */ +/*--------------------------------------------------------------------------*/ +status_t i2c_write_sub(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ + status_t status = I32(kStatus_Success); + size_t rx, tx; + + do + { + /* Send start and device address */ + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, + kLPI2C_Write); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Send register address */ + status = LPI2C_MasterSend(LPI2C_PMIC, ®, 1); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Send data */ + status = LPI2C_MasterSend(LPI2C_PMIC, data, dataLength); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Send stop */ + status = LPI2C_MasterStop(LPI2C_PMIC); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* FIFO empty barrier */ + do + { + LPI2C_MasterGetFifoCounts(LPI2C_PMIC, &rx, &tx); + } + while(tx > 0U); + /* if we get this far we have succeeded */ + } while (SC_FALSE); + + return status; +} + +/*--------------------------------------------------------------------------*/ +/* Write to the PMIC via the I2C (with clock management) */ +/*--------------------------------------------------------------------------*/ +status_t i2c_write(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ +#ifdef SC_MANAGE_LPI2C_CLK + // Enable clocking using LPCG + if (LPI2C_PMIC == LPI2C_SC) + { + CLOCK_EnableClockEx(kCLOCK_LPI2C_SC); + } + + // Do the transfer + status_t stat = i2c_write_sub(device_addr, reg, data, dataLength); + + if(stat != I32(kStatus_Success))/* do a MasterStop if we ever fail */ + { + pmic_print(1, "I2C Error: %d \n", stat); + (void) LPI2C_MasterStop(LPI2C_PMIC); + } + + if (LPI2C_PMIC == LPI2C_SC) + { + // Enter exclusive attempt to disable clock + uint32_t lpcgVal = CLOCK_DisableClockExEnter(kCLOCK_LPI2C_SC); + + // Check if conditions allow clock gating + if (!LPI2C_MasterGetBusIdleState(LPI2C_PMIC)) + { + // Mask to disable IPG and BAUD clocks + uint32_t lpcgMask = ~(BIT(LPCG__SS_SCU__IPG_CLK__SWEN) | + BIT(LPCG__SS_SCU__PER_CLK__SWEN)); + + lpcgVal &= lpcgMask; + } + + // Leave exclusive attempt to disable clock + CLOCK_DisableClockExLeave(kCLOCK_LPI2C_SC, lpcgVal); + } + + return stat; +#else + return i2c_write_sub(device_addr, reg, data, dataLength); +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Write to the PMIC via the I2C with CRC and clock management */ +/*--------------------------------------------------------------------------*/ +status_t i2c_j1850_write(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ status_t status = I32(kStatus_Success); + uint8_t crc; + size_t rx,tx; + +#ifdef SC_MANAGE_LPI2C_CLK + // Enable clocking using LPCG + if (LPI2C_PMIC == LPI2C_SC) + { + CLOCK_EnableClockEx(kCLOCK_LPI2C_SC); + } +#endif + /* calculate the CRC for data */ + crc = pf8x00_crc_data((device_addr << 1), reg, data, dataLength); + + // Do the transfer + do + { /* use a do while loop to jump out if error */ + + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, kLPI2C_Write); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, ®, 1); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, data, dataLength); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, &crc, 1); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterStop(LPI2C_PMIC); + if (status != I32(kStatus_Success)) + { + break; + } + + do/* FIFO empty barrier */ + { + LPI2C_MasterGetFifoCounts(LPI2C_PMIC, &rx, &tx); + } + while(tx>0U); + /* if we got here we succeeded */ + } while (SC_FALSE); + + if (status != I32(kStatus_Success)) + { + pmic_print(1, "LPI2C error kStatus = %x", status); + (void)LPI2C_MasterStop(LPI2C_PMIC); + } + +#ifdef SC_MANAGE_LPI2C_CLK + // Disable Clock after write + if (LPI2C_PMIC == LPI2C_SC) + { + // Enter exclusive attempt to disable clock + uint32_t lpcgVal = CLOCK_DisableClockExEnter(kCLOCK_LPI2C_SC); + + // Check if conditions allow clock gating + if (!LPI2C_MasterGetBusIdleState(LPI2C_PMIC)) + { + // Mask to disable IPG and BAUD clocks + uint32_t lpcgMask = ~(BIT(LPCG__SS_SCU__IPG_CLK__SWEN) | + BIT(LPCG__SS_SCU__PER_CLK__SWEN)); + + lpcgVal &= lpcgMask; + } + + // Leave exclusive attempt to disable clock + CLOCK_DisableClockExLeave(kCLOCK_LPI2C_SC, lpcgVal); + } +#endif + + return status; +} + +/*--------------------------------------------------------------------------*/ +/* Read from the PMIC via the I2C with CRC and clock management */ +/*--------------------------------------------------------------------------*/ +status_t i2c_j1850_read(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ + status_t status = I32(kStatus_Success); + + if (dataLength > MAX_DATA_LENGTH) + { + status = I32(kStatus_OutOfRange); + } + else + { + uint32_t flags; + uint8_t crc; + uint8_t buff[MAX_DATA_LENGTH + 1U]; + + /* Init CRC */ + buff[dataLength] = 0U; + +#ifdef SC_MANAGE_LPI2C_CLK + // Enable clocking using LPCG + if (LPI2C_PMIC == LPI2C_SC) + { + CLOCK_EnableClockEx(kCLOCK_LPI2C_SC); + } +#endif + + /* Calculate the CRC for address + register */ + crc = pf8x00_crc_data(((device_addr << 1) | 0x1U), reg, data, 0U); + + // Do the transfer + do + {/* use a true while loop to jump out if error */ + + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, kLPI2C_Write); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, ®, 1); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, &crc, 1); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, kLPI2C_Read); + if (status != I32(kStatus_Success)) + { + break; + } + + status = LPI2C_MasterReceive(LPI2C_PMIC, buff, dataLength + 1U); + if (status != I32(kStatus_Success)) { break;} + + while (SC_TRUE) + { + flags = LPI2C_MasterGetStatusFlags(LPI2C_PMIC); + + if ((flags & U32(kLPI2C_MasterNackDetectFlag)) == 0U) + { + break; + } + + if ((flags & i2c_error_flags) != 0U) + { + pmic_print(1, "i2c error flag: %d \n", flags); + } + } + + status = LPI2C_MasterStop(LPI2C_PMIC); + /* if we got here we succeeded */ + } while (SC_FALSE); + + /* Calculate CRC with data returned and check for validity */ + crc = pf8x00_crc_data(((device_addr << 1) | 0x1U), reg, buff, dataLength); + if (crc != buff[dataLength]) + { + status = I32(kStatus_Fail); + pmic_print(1,"CRC returned not correct got %x expected %x\n", + buff[dataLength], crc); + } + + if (status != I32(kStatus_Success)) + { + pmic_print(1, "LPI2C error kStatus = %x", status); + (void)LPI2C_MasterStop(LPI2C_PMIC); + } + else + { + /* Copy out data */ + uint8_t *ptr = (uint8_t*) data; + + for (uint8_t index = 0U; index < dataLength; index++) + { + ptr[index] = buff[index]; + } + } + +#ifdef SC_MANAGE_LPI2C_CLK + // Disable Clock after write + if (LPI2C_PMIC == LPI2C_SC) + { + // Enter exclusive attempt to disable clock + uint32_t lpcgVal = CLOCK_DisableClockExEnter(kCLOCK_LPI2C_SC); + + // Check if conditions allow clock gating + if (!LPI2C_MasterGetBusIdleState(LPI2C_PMIC)) + { + // Mask to disable IPG and BAUD clocks + uint32_t lpcgMask = ~(BIT(LPCG__SS_SCU__IPG_CLK__SWEN) | + BIT(LPCG__SS_SCU__PER_CLK__SWEN)); + + lpcgVal &= lpcgMask; + } + + // Leave exclusive attempt to disable clock + CLOCK_DisableClockExLeave(kCLOCK_LPI2C_SC, lpcgVal); + } +#endif + } + + return status; +} + +/*--------------------------------------------------------------------------*/ +/* Read from the PMIC via I2C */ +/*--------------------------------------------------------------------------*/ +status_t i2c_read_sub(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ + status_t status = I32(kStatus_Success); + uint32_t flags; + + do + { + /* Send start and device address */ + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, kLPI2C_Write); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Send register */ + status = LPI2C_MasterSend(LPI2C_PMIC, ®, 1); + /* Check for error */ + if (status != I32(kStatus_Success) ) + { + break; + } + + /* Read response address */ + status = LPI2C_MasterStart(LPI2C_PMIC, device_addr, kLPI2C_Read); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Read data */ + status = LPI2C_MasterReceive(LPI2C_PMIC, data, dataLength); + /* Check for error */ + if (status != I32(kStatus_Success)) + { + break; + } + + /* Check for error */ + while (SC_TRUE) + { + flags = LPI2C_MasterGetStatusFlags(LPI2C_PMIC); + + if ((flags & U32(kLPI2C_MasterNackDetectFlag)) == 0U) + { + break; + } + + if ((flags & i2c_error_flags) != 0U) + { + pmic_print(1, "i2c error flag: %d \n", flags); + } + } + /* Stop transfer */ + status = LPI2C_MasterStop(LPI2C_PMIC); + /* if we got here we had a succesful read */ + } while (SC_FALSE); + + return status; +} + +/*--------------------------------------------------------------------------*/ +/* Read from the PMIC via I2C (with clock management) */ +/*--------------------------------------------------------------------------*/ +status_t i2c_read(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength) +{ +#ifdef SC_MANAGE_LPI2C_CLK + // Enable clocking using LPCG + if (LPI2C_PMIC == LPI2C_SC) + { + CLOCK_EnableClockEx(kCLOCK_LPI2C_SC); + } + + // Do the transfer + status_t stat = i2c_read_sub(device_addr, reg, data, dataLength); + + if(stat != I32(kStatus_Success))/* do a MasterStop if we ever fail */ + { + pmic_print(1, "I2C error : %d \n", stat); + (void) LPI2C_MasterStop(LPI2C_PMIC); + } + + if (LPI2C_PMIC == LPI2C_SC) + { + // Enter exclusive attempt to disable clock + uint32_t lpcgVal = CLOCK_DisableClockExEnter(kCLOCK_LPI2C_SC); + + // Check if conditions allow clock gating + if (!LPI2C_MasterGetBusIdleState(LPI2C_PMIC)) + { + // Mask to disable IPG and BAUD clocks + uint32_t lpcgMask = ~(BIT(LPCG__SS_SCU__IPG_CLK__SWEN) | + BIT(LPCG__SS_SCU__PER_CLK__SWEN)); + + lpcgVal &= lpcgMask; + } + + // Leave exclusive attempt to disable clock + CLOCK_DisableClockExLeave(kCLOCK_LPI2C_SC, lpcgVal); + } + + return stat; +#else + return i2c_read_sub(device_addr, reg, data, dataLength); +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC device ID */ +/*--------------------------------------------------------------------------*/ +uint8_t pmic_get_device_id(uint8_t address) +{ + status_t status; + uint32_t flags; + uint8_t dev_id_read = 0U; + uint8_t dev_reg = 0U; + + #ifdef SC_MANAGE_LPI2C_CLK + // Enable clocking using LPCG + if (LPI2C_PMIC == LPI2C_SC) + { + CLOCK_EnableClockEx(kCLOCK_LPI2C_SC); + } + #endif + + do + { + /* Send master blocking data to slave */ + status = LPI2C_MasterStart(LPI2C_PMIC, address, kLPI2C_Write); + if (status != I32(kStatus_Success)) /* check if status valid */ + { + break; + } + + status = LPI2C_MasterSend(LPI2C_PMIC, &dev_reg, 1);/* send reg 0 address */ + if (status != I32(kStatus_Success)) /* check if status valid */ + { + break; + } + + status = LPI2C_MasterStart(LPI2C_PMIC, address, kLPI2C_Read); + if (status != I32(kStatus_Success)) /* check if status valid */ + { + break; + } + + status = LPI2C_MasterReceive(LPI2C_PMIC, &dev_id_read, 1); + if (status != I32(kStatus_Success)) /* check if status valid */ + { + break; + } + + while (SC_TRUE) + { + flags = LPI2C_MasterGetStatusFlags(LPI2C_PMIC); + + if ((flags & U32(kLPI2C_MasterNackDetectFlag)) == 0U) + { + break; + } + + if ((flags & i2c_error_flags) != 0U) + { + pmic_print(1, "i2c error flag: %d \n", flags); + } + } + + status = LPI2C_MasterStop(LPI2C_PMIC); + /* if we got here it was successful up until stop */ + } while (SC_FALSE); + + if ((status != I32(kStatus_Success)) && (status != I32(kStatus_LPI2C_Nak))) + {/* reset if there was an error */ + pmic_print(1, "I2C Error %d \n", status); + (void)LPI2C_MasterStop(LPI2C_PMIC); + dev_id_read = 0U; + } + + #ifdef SC_MANAGE_LPI2C_CLK + if (LPI2C_PMIC == LPI2C_SC) + { + // Enter exclusive attempt to disable clock + uint32_t lpcgVal = CLOCK_DisableClockExEnter(kCLOCK_LPI2C_SC); + + // Check if conditions allow clock gating + if (!LPI2C_MasterGetBusIdleState(LPI2C_PMIC)) + { + // Mask to disable IPG and BAUD clocks + uint32_t lpcgMask = ~(BIT(LPCG__SS_SCU__IPG_CLK__SWEN) | + BIT(LPCG__SS_SCU__PER_CLK__SWEN)); + + lpcgVal &= lpcgMask; + } + + // Leave exclusive attempt to disable clock + CLOCK_DisableClockExLeave(kCLOCK_LPI2C_SC, lpcgVal); + } + #endif + + return dev_id_read; +} + +/*--------------------------------------------------------------------------*/ +/* Helper Function for j1850 crc write or read */ +/*--------------------------------------------------------------------------*/ +uint8_t pf8x00_crc_data(uint8_t addr, uint8_t reg, const uint8_t * const data, + uint32_t msg_size) +{ + uint8_t rtn = 0U; + const uint8_t *d = data; + + /* Check return pointer */ + if (d != NULL) + { + uint8_t i, j, crc = 0xFFU; + + /* CRC the address first */ + crc ^= addr; + for (i = 0U; i < 8U; i++) + { + crc = ((crc & 0x80U) != 0U) ? ((crc << 1U) ^ POLY ) + : U8(crc << 1U); + } + + /* CRC the register address next */ + crc ^= reg; + for (i = 0U; i < 8U; i++) + { + crc = ((crc & 0x80U) != 0U) ? ((crc << 1U) ^ POLY ) + : U8(crc << 1U); + } + + /* Finally do the data */ + j = 0U; + while (j < msg_size) + { + crc ^= *d; + d++; + /* Loop over all data */ + for (i = 0U; i < 8U; i++) + { + crc = ((crc & 0x80U) != 0U) ? ((crc << 1U) ^ POLY ) + : U8(crc << 1U); + } + j++; + } + + rtn = crc; + } + + return rtn; +} + diff --git a/platform/drivers/pmic/fsl_pmic.h b/platform/drivers/pmic/fsl_pmic.h new file mode 100755 index 0000000..c07019f --- /dev/null +++ b/platform/drivers/pmic/fsl_pmic.h @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_PMIC_H +#define DRV_PMIC_H + +/*! + * @addtogroup pmic_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "drivers/lpi2c/fsl_lpi2c.h" + +/* Defines */ +#define i2c_error_flags (U32(kLPI2C_MasterArbitrationLostFlag) | \ + U32(kLPI2C_MasterFifoErrFlag) | \ + U32(kLPI2C_MasterPinLowTimeoutFlag) | \ + U32(kLPI2C_MasterDataMatchFlag) | \ + U32(kLPI2C_MasterBusyFlag) | \ + U32(kLPI2C_MasterBusBusyFlag)) +/* Types */ + +/*! + * This type is used to declare which PMIC to address + */ +typedef uint8_t pmic_id_t; + +/*! + * Structure for ID and Revision of PMIC + */ +typedef struct +{ + uint8_t device_id; /*!< dev ID value (reg location may differ per device) */ + uint8_t si_rev; /*!< silicon revision value read from device */ +} pmic_version_t; + +/*! + * This function is a simple write to an i2c register on the PMIC + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[in] data data to be written + * @param[in] dataLength length of data to be written + * + * @return Returns the status of the write (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + * + * Note there is no clock management in this function + */ +status_t i2c_write_sub(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + +/*! + * This function writes an i2c register on the PMIC device + * with clock management + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[in] data data to be written + * @param[in] dataLength length of data to be written + * + * @return Returns the status of the write (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + */ + +status_t i2c_write(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + +/*! + * This function is a simple read of an i2c register on the PMIC + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[out] data data to be read + * @param[in] dataLength length of data to be read + * + * @returns Returns the status of the read (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + */ + +status_t i2c_read_sub(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + +/*! + * This function reads an i2c register on the PMIC device + * with clock management + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[out] data data to be read + * @param[in] dataLength length of data to be read + * + * @returns Returns the status of the read (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + */ + +status_t i2c_read(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + + +/*! + * This function writes an i2c register on the PMIC device + * with j1850 CRC appended and clock management + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[in] data data to be written + * @param[in] dataLength length of data to be written + * + * @return Returns the status of the write (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + */ +status_t i2c_j1850_write(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + +/*! + * This function reads an i2c register on the PMIC device with j1850 CRC + * and clock management + * + * @param[in] device_addr I2C address of device + * @param[in] reg address of register on device + * @param[out] data data to be read + * @param[in] dataLength length of data to be read + * + * @returns Returns the status of the read (success = kStatus_Success) + * + * Return errors + * - kStatus_Fail if any of the transactions failed + */ +status_t i2c_j1850_read(uint8_t device_addr, uint8_t reg, void *data, + uint32_t dataLength); + +/*! + * This function reads the register at address 0x0 for the Device ID + * + * @param[in] address I2C address of device + * + * @returns Returns the device ID + * + * Return Errors + * - 0 if any error in the function + */ +uint8_t pmic_get_device_id(uint8_t address); + +#endif + +/** @} */ + diff --git a/platform/drivers/pmic/pf100/Makefile b/platform/drivers/pmic/pf100/Makefile new file mode 100755 index 0000000..03e610a --- /dev/null +++ b/platform/drivers/pmic/pf100/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/pmic/pf100/fsl_pf100.o + +DIRS += $(OUT)/drivers/pmic/pf100 + diff --git a/platform/drivers/pmic/pf100/doxygen/fsl_pf100.dox b/platform/drivers/pmic/pf100/doxygen/fsl_pf100.dox new file mode 100755 index 0000000..e9ae7cd --- /dev/null +++ b/platform/drivers/pmic/pf100/doxygen/fsl_pf100.dox @@ -0,0 +1,8 @@ +/*! +@defgroup pf100_driver PF100: PF100 Power Management IC Driver +Module for the PF100 PMIC driver. + +@details This is an SDK driver for the NXP PF100 PMIC. For more information, +see the PF100 Datasheet. + +*/ diff --git a/platform/drivers/pmic/pf100/fsl_pf100.c b/platform/drivers/pmic/pf100/fsl_pf100.c new file mode 100755 index 0000000..dbc4445 --- /dev/null +++ b/platform/drivers/pmic/pf100/fsl_pf100.c @@ -0,0 +1,689 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "fsl_device_registers.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/pf100/fsl_pf100.h" +#include "fsl_common.h" + +/* Local Defines */ +#define VGEN_EN 0x10U /*!< Voltage Generator enable mask */ +#define SW_VOLT_MASK 0x3FU /*!< Switching regulator voltage mask */ +#define VGEN_VOLT_MASK 0xFU /*!< LDO regulator voltage mask */ +#define SW_BIT6_MASK 0x40U /*!< Voltage Range selection bit mask */ +#define SW_MODE_MASK 0xFU +#define VGEN_MODE_MASK (0x7U << 4U) + +/* Defines */ + +/*! + * @name Defines for pf100_ctl_regs_t + */ +/** @{ */ +#define DEVICEID 0x00U +#define SILICONREVID 0x03U +#define FABID 0x04U +#define INTSTAT0 0x05U +#define INTMASK0 0x06U +#define INTSENSE0 0x07U +#define INTSTAT1 0x08U +#define INTMASK1 0x09U +#define INTSENSE1 0x0AU +#define INTSTAT3 0x0EU +#define INTMASK3 0x0FU +#define INTSENSE3 0x10U +#define INTSTAT4 0x11U +#define INTMASK4 0x12U +#define INTSENSE4 0x13U +#define COINCTL 0x1AU +#define PWRCTL 0x1BU +#define MEMA 0x1CU +#define MEMB 0x1DU +#define MEMC 0x1EU +#define MEMD 0x1FU +/** @} */ + +/*! + * @name Defines for pmic_ints_t + */ +/** @{ */ +#define THERM110 BIT8(2U) +#define THERM120 BIT8(3U) +#define THERM125 BIT8(4U) +#define THERM130 BIT8(5U) +/** @} */ + + +/* Types */ +/*! + * This type is used to offset from a register + */ +typedef uint8_t pf100_ctl_regs_t; + +/*! + * This type is used to encode the temperature + */ +typedef uint8_t pmic_ints_t; + +/* Local Functions */ + +/* Local Variables */ + +struct sw_range +{ + uint32_t sw2; /* 0 = un-initialized */ + uint32_t sw3a; /* 1 = low voltage range */ + uint32_t sw3b; /* 2 = high voltage range */ + uint32_t sw4; +}; + +static struct sw_range switching_range = {0U, 0U, 0U, 0U}; + +/*--------------------------------------------------------------------------*/ +/* Get PMIC version */ +/*--------------------------------------------------------------------------*/ +pmic_version_t pf100_get_pmic_version(pmic_id_t id) +{ + pmic_version_t ver; + + if (kStatus_Success != i2c_read(id, DEVICEID, &ver.device_id, 1U)) + { + ver.device_id = 0U; + } + if (kStatus_Success != i2c_read(id, SILICONREVID, &ver.si_rev, 1U)) + { + ver.si_rev = 0U; + } + + ver.device_id &= 0x1FU; + ver.si_rev &= 0xFFU; + + return ver; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf100_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, + uint32_t vol_mv, uint32_t mode_to_set) +{ + status_t err; + uint32_t mode_offset = 0U; + uint32_t new_volt = 0U; + uint8_t val = 0U; + uint32_t volt_mask = SW_VOLT_MASK; + uint8_t pmic_reg8; + + if (pmic_reg >= 0x100U) + { + return SC_ERR_PARM; + } + else + { + pmic_reg8 = U8(pmic_reg); + } + + switch (mode_to_set) + { + case SW_STBY_MODE: + mode_offset = 1U; + break; + case SW_OFF_MODE: + mode_offset = 2U; + break; + default:/* if not stby or off assume run mode */ + ; /* Intentional empty default */ + break; + } + + /* Calculate step voltage */ + switch (pmic_reg8) + { + case SW1AB: + case SW1C: + if (vol_mv < 300U) + { + vol_mv = 300U; + } + new_volt = (vol_mv - 300U) / 25U; + break; + case SW2:/* variable step size based on operating range determined by SW2[6] */ + if (switching_range.sw2 == 0U) + { + if (i2c_read(id, pmic_reg8, &val, 1U) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val &= SW_BIT6_MASK; /* mask off other bits */ + if (val != 0U) + { + switching_range.sw2 = 2U;/* set high voltage range */ + } + else + { + switching_range.sw2 = 1U;/* set low voltage range */ + } + } + if (vol_mv < 400U * switching_range.sw2) + { + vol_mv = 400U * switching_range.sw2; + } + new_volt = (vol_mv - 400U * switching_range.sw2) / 25U * switching_range.sw2; + break; + case SW3A: + if (switching_range.sw3a == 0U) + { + if (i2c_read(id, pmic_reg8, &val, 1U) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val &= SW_BIT6_MASK; /* mask off other bits */ + if (val != 0U) + { + switching_range.sw3a = 2U;/* set high voltage range */ + } + else + { + switching_range.sw3a = 1U;/* set low voltage range */ + } + } + if (vol_mv < (400U * switching_range.sw3a)) + { + vol_mv = 400U * switching_range.sw3a; + } + new_volt = (vol_mv - 400U * switching_range.sw3a) / 25U * switching_range.sw3a; + break; + case SW3B: + if (switching_range.sw3b == 0U) + { + if (i2c_read(id, pmic_reg8, &val, 1U) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val &= SW_BIT6_MASK; /* mask off other bits */ + if (val != 0U) + { + switching_range.sw3b = 2;/* set high voltage range */ + } + else + { + switching_range.sw3b = 1U;/* set low voltage range */ + } + } + if (vol_mv < (400U * switching_range.sw3b)) + { + vol_mv = 400U * switching_range.sw3b; + } + new_volt = (vol_mv - 400U * switching_range.sw3b) / 25U * switching_range.sw3b; + break; + case SW4: + if (switching_range.sw4 == 0U) + { + if (i2c_read(id, pmic_reg8, &val, 1U) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val &= SW_BIT6_MASK; /* mask off other bits */ + if (val != 0U) + { + switching_range.sw4 = 2U;/* set high voltage range */ + } + else + { + switching_range.sw4 = 1U;/* set low voltage range */ + } + } + if (vol_mv < (400U * switching_range.sw4)) + { + vol_mv = 400U * switching_range.sw4; + } + new_volt = (vol_mv - 400U * switching_range.sw4) / 25U * switching_range.sw4; + break; + case VGEN1: + case VGEN2: + if (vol_mv < 800U) + { + vol_mv = 800U; + } + new_volt = ((vol_mv - 800U) / 50U); + volt_mask = VGEN_VOLT_MASK; + break; + case VGEN3: + case VGEN4: + case VGEN5: + case VGEN6: + if (vol_mv < 1800U) + { + vol_mv = 1800U; + } + new_volt = ((vol_mv - 1800U) / 100U); + volt_mask = VGEN_VOLT_MASK; + break; + default: + ; /* Intentional empty default */ + break; + } + + /* Read PMIC register */ + err = i2c_read(id, pmic_reg8 + mode_offset, &val, 1U); + if (err != kStatus_Success) + { + error_print("pmic_set_volt - Fail I2C rd PMIC %d, reg %u\n", + id, pmic_reg8); + + return SC_ERR_FAIL; + } + + /* Update voltage */ + val &= ~volt_mask; + val |= new_volt; + + /* Update PMIC register */ + err = i2c_write(id, pmic_reg8 + mode_offset, &val, 1U); + if (err != kStatus_Success) + { + error_print("pmic_set_volt - Fail to wr PMIC %d, reg %u\n", + id, pmic_reg8); + + return SC_ERR_FAIL; + } + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf100_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, + uint32_t *vol_mv, uint32_t mode_to_get) +{ + status_t err; + uint8_t mode_offset = 0U; + uint8_t val = 0, val2 = 0U; + uint8_t pmic_reg8; + + if (pmic_reg >= 0x100U) + { + return SC_ERR_PARM; + } + else + { + pmic_reg8 = U8(pmic_reg); + } + + switch (mode_to_get) + { + case SW_STBY_MODE: + mode_offset = 1U; + break; + case SW_OFF_MODE: + mode_offset = 2U; + break; + default:/* if not stby or off assume run mode */ + ; /* Intentional empty default */ + break; + } + + /* Read PMIC register */ + err = i2c_read(id, pmic_reg8 + mode_offset, &val, 1U); + if (err != kStatus_Success) + { + error_print("pmic_get_volt - Fail I2C rd PMIC %d, reg %u\n", + id, pmic_reg8); + + return SC_ERR_FAIL; + } + + /* Calculate voltage */ + switch (pmic_reg8) + { + case SW1AB: + case SW1C: + val &= SW_VOLT_MASK; + *vol_mv = (U32(val) * 25UL) + 300UL; + break; + case SW2:/* variable step size based on operating range determined by SW2[6] */ + val &= SW_VOLT_MASK; + if (switching_range.sw2 == 0U) + { + if (i2c_read(id, pmic_reg8, &val2, 1) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val2 &= SW_BIT6_MASK; /* mask off other bits */ + if (val2 != 0U) + { + switching_range.sw2 = 2U;/* set high voltage range */ + } + else + { + switching_range.sw2 = 1U;/* set low voltage range */ + } + } + *vol_mv = (val * 25U * switching_range.sw2) + 400U * switching_range.sw2; + break; + case SW3A: + val &= SW_VOLT_MASK; + if (switching_range.sw3a == 0U) + { + if (i2c_read(id, pmic_reg8, &val2, 1) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val2 &= SW_BIT6_MASK; /* mask off other bits */ + if (val2 != 0U) + { + switching_range.sw3a = 2u;/* set high voltage range */ + } + else + { + switching_range.sw3a = 1U;/* set low voltage range */ + } + } + *vol_mv = (val * 25U * switching_range.sw3a) + 400U * switching_range.sw3a; + break; + case SW3B: + val &= SW_VOLT_MASK; + if (switching_range.sw3b == 0U) + { + if (i2c_read(id, pmic_reg8, &val2, 1) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val2 &= SW_BIT6_MASK; /* mask off other bits */ + if (val2 != 0U) + { + switching_range.sw3b = 2U;/* set high voltage range */ + } + else + { + switching_range.sw3b = 1U;/* set low voltage range */ + } + } + *vol_mv = (val * 25U*switching_range.sw3b) + 400U*switching_range.sw3b; + break; + case SW4: + val &= SW_VOLT_MASK; + if (switching_range.sw4 == 0U) + { + if (i2c_read(id, pmic_reg8, &val2, 1) != kStatus_Success) + { + return SC_ERR_FAIL; /* return if voltage range read failed */ + } + val2 &= SW_BIT6_MASK; /* mask off other bits */ + if (val2 != 0U) + { + switching_range.sw4 = 2U;/* set high voltage range */ + } + else + { + switching_range.sw4 = 1U;/* set low voltage range */ + } + } + *vol_mv = (U32(val) * 25UL * switching_range.sw4) + 400UL * switching_range.sw4; + break; + case VGEN1: + case VGEN2: + val &= VGEN_VOLT_MASK; + *vol_mv = (U32(val) * 50UL) + 800UL; + break; + case VGEN3: + case VGEN4: + case VGEN5: + case VGEN6: + val &= VGEN_VOLT_MASK; + *vol_mv = (U32(val) * 100UL) + 1800UL; + break; + default: + ; /* Intentional empty default */ + break; + } + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf100_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode) +{ + status_t err; + uint32_t val = 0U; + uint32_t mask = VGEN_MODE_MASK; + uint8_t pmic_reg8; + + if (pmic_reg >= 0x100U) + { + return SC_ERR_PARM; + } + else + { + pmic_reg8 = U8(pmic_reg); + } + + switch (pmic_reg8) + { + case SW1AB: + mask = SW_MODE_MASK; + pmic_reg8 = 0x23U; + break; + case SW1C: + mask = SW_MODE_MASK; + pmic_reg8 = 0x31U; + break; + case SW2: + mask = SW_MODE_MASK; + pmic_reg8 = 0x38U; + break; + case SW3A: + mask = SW_MODE_MASK; + pmic_reg8 = 0x3FU; + break; + case SW3B: + mask = SW_MODE_MASK; + pmic_reg8 = 0x46U; + break; + case SW4: + mask = SW_MODE_MASK; + pmic_reg8 = 0x4DU; + break; + default: + ; /* Intentional empty default */ + break; + } + + /* Read PMIC register */ + err = i2c_read(id, pmic_reg8, &val, 1U); + if (err != kStatus_Success) + { + error_print("pmic_set_mode - Fail read PMIC %d, reg %u\n", + id, pmic_reg8); + + return SC_ERR_FAIL; + } + + /* Update mode */ + val &= ~mask; + val |= mode; + + /* Update PMIC register */ + (void) i2c_write(id, pmic_reg8, &val, 1U); + if (err != kStatus_Success) + { + error_print("pmic_set_mode - Fail set mode %u PMIC %d, reg %u\n", + mode, id, pmic_reg8); + + return SC_ERR_FAIL; + } + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC temp */ +/*--------------------------------------------------------------------------*/ +uint32_t pf100_get_pmic_temp(pmic_id_t id) +{ + uint8_t sense = 0U; + + (void) i2c_read(id, INTSENSE0, &sense, 1U); + + if ((sense & THERM130) != 0U) + { + return 130U; + } + else if ((sense & THERM125) != 0U) + { + return 125U; + } + else if ((sense & THERM120) != 0U) + { + return 120U; + } + else if ((sense & THERM110) != 0U) + { + return 110U; + } + else + { + ; /* Intentional empty else */ + } + + return 100U; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC temp alarm */ +/*--------------------------------------------------------------------------*/ +uint32_t pf100_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp) +{ + uint8_t mask; + + /* Round value and determine mask */ + if (temp <= 110U) + { + temp = 110U; + mask = THERM110; + } + else if (temp <= 120U) + { + temp = 120U; + mask = THERM120; + } + else if (temp <= 125U) + { + temp = 125U; + mask = THERM125; + } + else if (temp <= 130U) + { + temp = 130U; + mask = THERM130; + } + else + { + temp = 135U; + mask = 0U; + } + + /* Write new mask */ + mask = (~mask) & 0x3FU; + (void) i2c_write(id, INTMASK0, &mask, 1U); + + return temp; +} + +/*--------------------------------------------------------------------------*/ +/* Access registers of the PF100 */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf100_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value) +{ + status_t err; + + if (read_write == SC_FALSE) + { + err = i2c_read(id, address, value, 1U); + if (err != kStatus_Success) + { + error_print("PMIC reg acc - Fail to rd PMIC %x, reg %x\n", + id, address); + + return SC_ERR_FAIL; + } + } + else + { + err = i2c_write(id, address, value, 1U); + if (err != kStatus_Success) + { + error_print("PMIC reg acc - Fail to wr PMIC %x, reg %x\n", + id, address); + + return SC_ERR_FAIL; + } + } + + return SC_ERR_NONE; + +}; + +/*--------------------------------------------------------------------------*/ +/* Service PMIC interrupt */ +/*--------------------------------------------------------------------------*/ +sc_bool_t pf100_pmic_irq_service(pmic_id_t id) +{ + uint8_t mask = 0U; + uint8_t status = 0U; + + /* PMIC pending? */ + (void) i2c_read(id, INTSTAT0, &status, 1U); + (void) i2c_read(id, INTMASK0, &mask, 1U); + status &= ~mask; + if (status != kStatus_Success) + { + /* Mask off to prevent repeat */ + mask = 0x3F; + (void) i2c_write(id, INTMASK0, &mask, 1U); + + /* Clear */ + (void) i2c_write(id, INTSTAT0, &status, 1U); + + return SC_TRUE; + } + + return SC_FALSE; +} + diff --git a/platform/drivers/pmic/pf100/fsl_pf100.h b/platform/drivers/pmic/pf100/fsl_pf100.h new file mode 100755 index 0000000..0aa2120 --- /dev/null +++ b/platform/drivers/pmic/pf100/fsl_pf100.h @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_PMIC_PF100_H +#define DRV_PMIC_PF100_H + +/*! + * @addtogroup pf100_driver + * @{ + */ + +/*! @file */ + +/*! + * @name Defines for pf100_vol_regs_t + */ +/** @{ */ +#define SW1AB 0x20U /*!< Base register for SW1AB control */ +#define SW1C 0x2EU /*!< Base register for SW1C control */ +#define SW2 0x35U /*!< Base register for SW2 control */ +#define SW3A 0x3cU /*!< Base register for SW3A control */ +#define SW3B 0x43U /*!< Base register for SW3B control */ +#define SW4 0x4AU /*!< Base register for SW4 control */ +#define VGEN1 0x6CU /*!< Base register for VGEN1 control */ +#define VGEN2 0x6DU /*!< Base register for VGEN2 control */ +#define VGEN3 0x6EU /*!< Base register for VGEN3 control */ +#define VGEN4 0x6FU /*!< Base register for VGEN4 control */ +#define VGEN5 0x70U /*!< Base register for VGEN5 control */ +#define VGEN6 0x71U /*!< Base register for VGEN6 control */ +/** @} */ + +/*! + * @name Defines for sw_pmic_mode_t + */ +/** @{ */ +#define SW_MODE_OFF_STBY_OFF 0x0U /*!< Normal Mode: OFF, Standby Mode: OFF */ +#define SW_MODE_PWM_STBY_OFF 0x1U /*!< Normal Mode: PWM, Standby Mode: OFF */ +#define SW_MODE_PFM_STBY_OFF 0x3U /*!< Normal Mode: PFM, Standby Mode: OFF */ +#define SW_MODE_APS_STBY_OFF 0x4U /*!< Normal Mode: APS, Standby Mode: OFF */ +#define SW_MODE_PWM_STBY_PWM 0x5U /*!< Normal Mode: PWM, Standby Mode: PWM */ +#define SW_MODE_PWM_STBY_APS 0x6U /*!< Normal Mode: PWM, Standby Mode: APS */ +#define SW_MODE_APS_STBY_APS 0x8U /*!< Normal Mode: APS, Standby Mode: APS */ +#define SW_MODE_APS_STBY_PFM 0xCU /*!< Normal Mode: APS, Standby Mode: PFM */ +#define SW_MODE_PWM_STBY_PFM 0xDU /*!< Normal Mode: PWM, Standby Mode: PFM */ +/** @} */ + + +/*! + * @name Defines for vgen_pmic_mode_t + */ +/** @{ */ +#define VGEN_MODE_OFF (0x0U << 4U) /*!< VGEN always OFF */ +#define VGEN_MODE_ON (0x1U << 4U) /*!< VGEN always ON */ +#define VGEN_MODE_STBY_OFF (0x3U << 4U) /*!< VGEN Run: ON STBY: OFF */ +#define VGEN_MODE_LP (0x5U << 4U) /*!< VGEN Run: LPWR STBY: LPWR */ +#define VGEN_MODE_LP2 (0x7U << 4U) /*!< VGEN Run: LPWR STBY: LPWR */ +/** @} */ + + +/*! + * @name Defines for sw_vmode_reg_t + */ +/** @{ */ +#define SW_RUN_MODE 0U /*!< SW run mode voltage */ +#define SW_STBY_MODE 1U /*!< SW standby mode voltage */ +#define SW_OFF_MODE 2U /*!< SW off/sleep mode voltage */ +/** @} */ + +/*! + * This type is used to indicate which register to address. + * + * Refer to the PF100 Datasheet for the description of regsiter. + */ +typedef uint8_t pf100_vol_regs_t; +/*! + * This type is used to indicate a switching regulator mode. + * + * Refer to the PF100 Datasheet for the description of each mode. + */ +typedef uint8_t sw_pmic_mode_t; +/*! + * This type is used to indicate a VGEN (LDO) regulator mode. + * + * Refer to the LDO control register description in the PF100 Datasheet + * for possible mode combinations. + */ +typedef uint8_t vgen_pmic_mode_t; +/*! + * This type encodes which voltage mode register to set when calling + * [pf100_pmic_set_voltage()](@ref pf100_pmic_set_voltage). + * + * Possible modes are Run, Standby and Off/Sleep. + */ +typedef uint8_t sw_vmode_reg_t; + +/*! + * This function returns the device ID and revision for the PF100 PMIC. + * + * @param[in] id I2C address of PMIC device + * + * @return Returns a structure with the device ID and revision. + */ +pmic_version_t pf100_get_pmic_version( pmic_id_t id); + +/*! + * This function sets the voltage of a corresponding voltage regulator for the + * PF100 PMIC. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + * see [pf100_vol_regs_t](@ref pf100_vol_regs_t) + * @param[in] vol_mv New voltage setpoint for the regulator in millivolts + * @param[in] mode_to_set Mode to set the voltage for run, standby and off; + * only applicable to switching regulators, ignored + * otherwise; see [sw_vmode_reg_t](@ref sw_vmode_reg_t) + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t pf100_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t vol_mv, + uint32_t mode_to_set); + +/*! + * This function gets the voltage on a corresponding voltage regulator for the + * PF100 PMIC. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + * see [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[out] vol_mv pointer to return voltage in millivolts + * @param[in] mode_to_get Mode to get the voltage for run, standby and off; + * only applicable to switching regulators, ignored + * otherwise; see [sw_vmode_reg_t](@ref sw_vmode_reg_t) + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + */ +sc_err_t pf100_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t *vol_mv, + uint32_t mode_to_get); + +/*! + * This function sets the mode of the specified regulator. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + see [pf100_vol_regs_t](@ref pf100_vol_regs_t) + * @param[in] mode mode to set the regulator; + * see [vgen_pmic_mode_t](@ref vgen_pmic_mode_t) + * and [sw_pmic_mode_t](@ref sw_pmic_mode_t) + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t pf100_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode); + +/*! + * This function gets the current PMIC temperature as sensed by the + * PMIC temperature sensor. + * + * @param[in] id I2C address of PMIC device + * + * @return returns the temp sensed by the PMIC in a UINT32 in Celsius + * + * Return errors: + * - SC_ERR_CONFIG if temperature monitor is not enabled + * + * Note PMIC PF100 temp is returned as the highest temp sensor enabled. + */ +uint32_t pf100_get_pmic_temp(pmic_id_t id); + +/*! + * This function sets the temp alarm for the PMIC in Celsius + * + * @param[in] id I2C address of PMIC device + * @param[in] temp Temperature to set the alarm + * + * Note the granularity for PF100 PMIC only allows the following + * values: + * 110 + * 120 + * 125 + * 130 + * 135 + * + * @return Returns the temperature that the alarm is set to in Celsius + */ +uint32_t pf100_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp); + +/* + * This function allows access to individual registers of the PF100 + * + * @param[in] id I2C address of PMIC device + * @param[in] address register address to access + * @param[in] read_write bool indicating read(SC_FALSE/0) or write(SC_TRUE/1) + * @param[in,out] value value to read or to set + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf100_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value); + +/*! + * This function services the interrupt for the temp alarm + * + * @param[in] id I2C address of PMIC device + * + * @return Returns SC_TRUE if there was a temperature interrupt to be cleared + */ +sc_bool_t pf100_pmic_irq_service(pmic_id_t id); + +#endif + +/** @} */ + diff --git a/platform/drivers/pmic/pf8100/Makefile b/platform/drivers/pmic/pf8100/Makefile new file mode 100755 index 0000000..84d1109 --- /dev/null +++ b/platform/drivers/pmic/pf8100/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/pmic/pf8100/fsl_pf8100.o + +DIRS += $(OUT)/drivers/pmic/pf8100 + diff --git a/platform/drivers/pmic/pf8100/doxygen/fsl_pf8100.dox b/platform/drivers/pmic/pf8100/doxygen/fsl_pf8100.dox new file mode 100755 index 0000000..dbf6359 --- /dev/null +++ b/platform/drivers/pmic/pf8100/doxygen/fsl_pf8100.dox @@ -0,0 +1,10 @@ +/*! +@defgroup pf8100_driver PF8100: PF8100 Power Management IC Driver +Module for the PF8100 PMIC driver. + +@details This is an SDK driver for the NXP PF8100 PMIC. For more information, +see the PF8100 Datasheet. + +If CRC operations are needed PMIC_CRC must be defined globally (usually in board.h) + +*/ diff --git a/platform/drivers/pmic/pf8100/fsl_pf8100.c b/platform/drivers/pmic/pf8100/fsl_pf8100.c new file mode 100755 index 0000000..f966c4d --- /dev/null +++ b/platform/drivers/pmic/pf8100/fsl_pf8100.c @@ -0,0 +1,1037 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This driver meets SRS requirements PMIC_00010, PMIC_00020, PMIC_00030, + and PMIC_00040 */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "fsl_device_registers.h" +#include "drivers/pmic/fsl_pmic.h" +#include "drivers/lpi2c/fsl_lpi2c.h" +#include "drivers/pmic/pf8100/fsl_pf8100.h" +#include "fsl_common.h" + +/* Local Defines */ + +/*! + * @name Defines for PF8100 masks + */ +#define SW_VOLT_MASK 0x3FU +#define LDO_VOLT_MASK 0xFU +#define MODE_MASK 0xFU +#define TMP_MON_EN_MSK 0x10U +#define THERM_I_MSK 0x3FU + +#define NOT_DETECTED 0xE0U +#define A0_SI_REV 0x10U +#define B0_SI_REV 0x20U +#define C0_SI_REV 0x30U + +/* Local Functions */ + +static inline sc_err_t check_si_rev(uint8_t address); + +/* Local Variables */ + +/* variable to keep track of silicon revision + * 0xE0 is not detected + * 0x00 is A0 + * 0x01 is B0 */ +static uint8_t si_rev = NOT_DETECTED; + +/*! + * Defines for pf8100_ctl_regs_t + */ +/** @{ */ +#define PF8100_DEVICEID 0x00U +#define PF8100_SILICONREVID 0x01U +#define PF8100_THERMINT 0x07U +#define PF8100_THERMMASK 0x08U +#define PF8100_THERMSENSE 0x09U +#define PF8100_VMONEN1 0x35U +#define PF8100_VMONEN2 0x36U +#define PF8100_CTRL1 0x37U +#define PF8100_CTRL2 0x38U +#define PF8100_CTRL3 0x39U +#define PF8100_PWRUPCTRL 0x3AU +#define PF8100_VSNVS 0x9DU +#define PF8100_PG_SEL 0x9FU +#define PF8100_RANDOM_GEN 0x33U +#define PF8100_RANDOM_CHK 0x34U +#define PF8100_WD_CONFIG 0x43U +#define PF8100_WD_CLEAR 0x44U + +/* Below are all secure register definitions */ +#define PF8100_FSOB_FLAGS 0x2AU +#define PF8100_ABIST_OV1 0x2CU +#define PF8100_ABIST_OV2 0x2DU +#define PF8100_ABIST_UV1 0x2EU +#define PF8100_ABIST_UV2 0x2FU +#define PF8100_ABIST_RUN 0x31U +#define PF8100_VMONEN1 0x35U +#define PF8100_VMONEN2 0x36U +#define PF8100_CTRL1 0x37U + +/** @} */ + + +/*! + * Defines for sw_regs_t + */ +/** @{ */ +#define sw_config1 0x00U +#define sw_config2 0x01U +#define sw_pwrup 0x02U +#define sw_mode1 0x03U +#define sw_run_volt 0x04U +#define sw_stby_volt 0x05U +/** @} */ + +/*! + * Defines for ldo_regs_t + */ +/** @{ */ +#define ldo_config1 0x00U +#define ldo_config2 0x01U +#define ldo_pwrup 0x02U +#define ldo_run_volt 0x03U +#define ldo_stby_volt 0x04U +/** @} */ + +/*! + * Defines for temp_msk_t + */ +/** @{ */ +#define THERM80 BIT(0U) +#define THERM95 BIT(1U) +#define THERM110 BIT(2U) +#define THERM125 BIT(3U) +#define THERM140 BIT(4U) +#define THERM155 BIT(5U) +/** @} */ + +/*! + * This type is used to declare control register offsets in + * a readable manner for the PF8100/PF8200 + */ +typedef uint8_t pf8100_ctl_regs_t; + +/*! + * This type is used to model the register structure of switching + * regulators in the PF8100 + */ +typedef uint8_t sw_regs_t; + +/*! + * This type is used to model the register structure of LDOs + * in the PF8100 + */ +typedef uint8_t ldo_regs_t; + +/*! + * This type is used to define the different temperature masks + */ +typedef uint8_t temp_msk_t; + +#ifdef PMIC_SECURE_WRITE +/* listing of secure registers */ +static const uint32_t secure_reg_list[] = +{ + PF8100_FSOB_FLAGS, + PF8100_ABIST_OV1, + PF8100_ABIST_OV2, + PF8100_ABIST_UV1, + PF8100_ABIST_UV2, + PF8100_ABIST_RUN, + PF8100_VMONEN1, + PF8100_VMONEN2, + PF8100_CTRL1 +}; +#endif + +static const uint32_t sw7v_lookup[32] = +{ + 1000U, /* value in mV for VSW7 arranged by index */ + 1100U, + 1200U, + 1250U, + 1300U, + 1350U, + 1500U, + 1600U, + 1800U, + 1850U, + 2000U, + 2100U, + 2150U, + 2250U, + 2300U, + 2400U, + 2500U, + 2800U, + 3150U, + 3200U, + 3250U, + 3300U, + 3350U, + 3400U, + 3500U, + 3800U, + 4000U, + 4100U, + 4100U, + 4100U, + 4100U, + 4100U +}; + +static const uint32_t ldo_table_a0[16] = +{ + 1500U, /* lookup for LDO values A0*/ + 1800U, + 1850U, + 2500U, + 2750U, + 2800U, + 2850U, + 3000U, + 3100U, + 3150U, + 3200U, + 3300U, + 3350U, + 4000U, + 4900U, + 5000U +}; + +static const uint32_t ldo_table_b0[16] = +{ + 1500U, /* lookup for LDO values B0*/ + 1600U, + 1800U, + 1850U, + 2150U, + 2500U, + 2800U, + 3000U, + 3100U, + 3150U, + 3200U, + 3300U, + 3350U, + 4000U, + 4900U, + 5000U +}; + +static const uint32_t ldo_table[16] = +{ + 1500U, /* lookup for LDO values in C0 going forward*/ + 1600U, + 1800U, + 1850U, + 2150U, + 2500U, + 2800U, + 3000U, + 3100U, + 3150U, + 3200U, + 3300U, + 3350U, + 1650U, + 1700U, + 5000U +}; + +/*--------------------------------------------------------------------------*/ +/* Get PMIC version */ +/*--------------------------------------------------------------------------*/ +pmic_version_t pf8100_get_pmic_version(pmic_id_t id) +{ + pmic_version_t ver; + + /* Read device ID */ + if (((status_t) kStatus_Success) != I2C_READ(id, PF8100_DEVICEID, + &ver.device_id, 1U)) + { + ver.device_id = 0U; + } + + /* Read PMIC version */ + if (((status_t) kStatus_Success) != I2C_READ(id, PF8100_SILICONREVID, + &ver.si_rev, 1U)) + { + ver.si_rev = 0U; + } + + /* Mask results */ + ver.device_id &= 0xFFU; + ver.si_rev &= 0xFFU; + + /* Return results */ + if(ver.si_rev != 0U) + { + si_rev = ver.si_rev; + } + + return ver; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, + uint32_t vol_mv, uint32_t mode_to_set) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t val = 0U; + uint8_t pmic_reg8 = U8(pmic_reg); + + /* Check parameters */ + ASRT_ERR(pmic_reg < 0x100U, SC_ERR_PARM); + + /* Check PMIC version */ + ASRT_ERR(check_si_rev(id) == SC_ERR_NONE, SC_ERR_FAIL); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + const uint32_t *ldo_lookup = ldo_table; + + /* Select table based on PMIC rev */ + if(si_rev == A0_SI_REV) + { + ldo_lookup = ldo_table_a0; + } + else if ((si_rev == B0_SI_REV) || (si_rev == C0_SI_REV)) + { + ldo_lookup = ldo_table_b0; + } + else + { + ; /* Intentional empty else */ + } + + /* Select supply */ + switch (pmic_reg8) + { + /* Switcher */ + case PF8100_SW1: + case PF8100_SW2: + case PF8100_SW3: + case PF8100_SW4: + case PF8100_SW5: + case PF8100_SW6: + if (vol_mv == 1800U) + { + val = 0xB1U; + } + else if((vol_mv > 1500U) || (vol_mv < 400U)) + { + err = SC_ERR_PARM; + } + /* Shift 3 for floating math */ + else + { + val = (uint8_t)(((vol_mv * 1000U) - 400000U) / 6250U); + } + + if (err == SC_ERR_NONE) + { + pmic_reg8 = U2B(mode_to_set) ? (pmic_reg8 + sw_run_volt) + : (pmic_reg8 + sw_stby_volt); + } + break; + case PF8100_SW7: + if ((vol_mv < 1000U) || (vol_mv > 4100U)) + { + err = SC_ERR_PARM; + } + else + { + /* Use lookup table to get near requested V */ + val = 0U; + while ((val < 32U) && (sw7v_lookup[val] < vol_mv)) + { + val++; + } + pmic_reg8 = pmic_reg8 + sw_run_volt; + } + break; + /* LDO */ + case PF8100_LDO1: + case PF8100_LDO2: + case PF8100_LDO3: + case PF8100_LDO4: + if ((vol_mv < 1500U) || (vol_mv > 5000U)) + { + err = SC_ERR_PARM; + } + else + { + /* Use lookup table to step through possible voltages */ + val = 0U; + for (val = 0U; val < 16U; val ++) + { + if (ldo_lookup[val] == vol_mv) + { + break; + } + } + if (val == 16U) + { + /* Return unavaliable if not found in LDO values */ + err = SC_ERR_UNAVAILABLE; + } + else + { + pmic_reg8 = U2B(mode_to_set) + ? (pmic_reg8 + ldo_run_volt) + : (pmic_reg8 + ldo_stby_volt); + } + } + break; + default: + err = SC_ERR_PARM; + break; + } + } + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + status_t status; + + /* Write PMIC register */ + status = I2C_WRITE(id, pmic_reg8, &val, 1); + if (status != (status_t) kStatus_Success) + { + error_print("pmic_set_voltage - Failed to wr" + " PMIC %d, reg %u\n", id, pmic_reg8); + + /* Return error */ + err = SC_ERR_FAIL; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC Regulator Voltage */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, + uint32_t* vol_mv, uint32_t mode_to_get) +{ + sc_err_t err = SC_ERR_NONE; + const uint32_t *ldo_lookup = ldo_table; + uint8_t pmic_reg8 = U8(pmic_reg); + + /* Check parameters */ + ASRT_ERR(pmic_reg < 0x100U, SC_ERR_PARM); + + /* Check PMIC version */ + ASRT_ERR(check_si_rev(id) == SC_ERR_NONE, SC_ERR_FAIL); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Select table based on PMIC rev */ + if (si_rev == A0_SI_REV) + { + ldo_lookup = ldo_table_a0; + } + else if ((si_rev == B0_SI_REV) || (si_rev == C0_SI_REV)) + { + ldo_lookup = ldo_table_b0; + } + else + { + ; /* Intentional empty else */ + } + + /* Select supply */ + switch (pmic_reg8) + { + /* Switcher */ + case PF8100_SW1: + case PF8100_SW2: + case PF8100_SW3: + case PF8100_SW4: + case PF8100_SW5: + case PF8100_SW6: + /* Add offset for corresponding LDO voltage */ + pmic_reg8 = U2B(mode_to_get) ? (pmic_reg8 + sw_run_volt) : + (pmic_reg8 + sw_stby_volt); + break; + case PF8100_SW7: + /* Add offset for corresponding LDO voltage */ + pmic_reg8 = pmic_reg8 + sw_run_volt; + break; + /* LDO */ + case PF8100_LDO1: + case PF8100_LDO2: + case PF8100_LDO3: + case PF8100_LDO4: + /* Add offset for corresponding LDO voltage */ + pmic_reg8 = U2B(mode_to_get) ? (pmic_reg8 + ldo_run_volt) : + (pmic_reg8 + ldo_stby_volt); + break; + default: + err = SC_ERR_PARM; + break; + } + } + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + uint8_t val = 0U; + status_t status; + + /* Read voltage value from PMIC */ + status = I2C_READ(id, pmic_reg8, &val, 1U); + if (status != (status_t) kStatus_Success) + { + error_print("pmic_get_voltage - Failed to rd for" + " PMIC %d, reg %u\n", id, pmic_reg8); + + err = SC_ERR_FAIL; + } + else + { + /* Convert binary value to mV value */ + switch (pmic_reg) + { + case PF8100_SW1: + case PF8100_SW2: + case PF8100_SW3: + case PF8100_SW4: + case PF8100_SW5: + case PF8100_SW6: + /* 0xB1 (177) == 1.8V*/ + if (val == 0xB1U) + { + *vol_mv = 1800U; + } + /* We are in the .4V to 1.5V range */ + *vol_mv = ((U32(val) * 6250U) + 400000U) / 1000U; + break; + case PF8100_SW7: + /* Obtain voltage from sw7 lookup table */ + *vol_mv = sw7v_lookup[val]; + break; + case PF8100_LDO1: + case PF8100_LDO2: + case PF8100_LDO3: + case PF8100_LDO4: + /* Obtain voltage from LDO lookup table */ + *vol_mv = ldo_lookup[val]; + break; + default: + ; /* Intentional empty default */ + break; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC Regulator Mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t pmic_reg8 = U8(pmic_reg); + + /* Check parameters */ + ASRT_ERR(pmic_reg < 0x100U, SC_ERR_PARM); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Check to make sure a switching supply passed */ + switch (pmic_reg8) + { + /* Switchers */ + case PF8100_SW1: + case PF8100_SW2: + case PF8100_SW3: + case PF8100_SW4: + case PF8100_SW5: + case PF8100_SW6: + case PF8100_SW7: + pmic_reg8 = pmic_reg8 + sw_mode1; + break; + /* LDOs */ + case PF8100_LDO1: + case PF8100_LDO2: + case PF8100_LDO3: + case PF8100_LDO4: + pmic_reg8 = pmic_reg8 + ldo_config2; + break; + default: + err = SC_ERR_PARM; + break; + } + } + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + uint32_t val = 0U; + status_t status; + + /* Read from PMIC */ + status = I2C_READ(id, pmic_reg8, &val, 1U); + + /* Check for success? */ + if (status != (status_t) kStatus_Success) + { + error_print("pmic_set_mode - Failed to rd PMIC %d" + ", reg %u\n", id, pmic_reg8); + + /* Return error */ + err = SC_ERR_FAIL; + } + else + { + /* Calculate value */ + val &= ~MODE_MASK; + val |= mode & MODE_MASK; + + /* Write to PMIC */ + status = I2C_WRITE(id, pmic_reg8, &val, 1U); + + /* Check for success? */ + if (status != (status_t) kStatus_Success) + { + error_print("pmic_set_mode - Failed set mode %u" + " PMIC %d, reg %u\n", mode, id, pmic_reg8); + + /* Return error */ + err = SC_ERR_FAIL; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC Regulator Mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_get_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t *mode) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t pmic_reg8= U8(pmic_reg); + + /* Check parameters */ + ASRT_ERR(pmic_reg < 0x100U, SC_ERR_PARM); + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + /* Check to make sure a switching supply passed */ + switch (pmic_reg8) + { + /* Switchers */ + case PF8100_SW1: + case PF8100_SW2: + case PF8100_SW3: + case PF8100_SW4: + case PF8100_SW5: + case PF8100_SW6: + case PF8100_SW7: + pmic_reg8 = pmic_reg8 + sw_mode1; + break; + /* LDOs */ + case PF8100_LDO1: + case PF8100_LDO2: + case PF8100_LDO3: + case PF8100_LDO4: + pmic_reg8 = pmic_reg8 + ldo_config2; + break; + default: + err = SC_ERR_PARM; + break; + } + } + + /* Check for error? */ + if (err == SC_ERR_NONE) + { + uint32_t val = 0U; + status_t status; + + /* Read from PMIC */ + status = I2C_READ(id, pmic_reg8, &val, 1U); + + /* Check for success? */ + if (status != (status_t) kStatus_Success) + { + error_print("pmic_get_mode - Failed to rd PMIC %d" + ", reg %u\n", id, pmic_reg8); + + /* Return error */ + err = SC_ERR_FAIL; + } + else + { + /* Return result */ + val &= MODE_MASK; + *mode = val; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get PMIC temp */ +/*--------------------------------------------------------------------------*/ +uint32_t pf8100_get_pmic_temp(pmic_id_t id) +{ + uint32_t rtn = 70U; /* return 10 degrees below lowest alarm */ + uint8_t sense = 0U, reg = 0U; + + /* Enabled monitor if off */ + (void) I2C_READ(id, PF8100_CTRL1, ®, 1U); + if((reg & TMP_MON_EN_MSK) == 0U) + { + reg |= TMP_MON_EN_MSK; + (void) I2C_WRITE(id, PF8100_CTRL1, ®, 1U); + } + + /* Read temp sense */ + (void) I2C_READ(id, PF8100_THERMSENSE, &sense, 1U); + + /* Check temp 155C */ + if ((sense & THERM155) != 0U) + { + rtn = 155U; + } + /* Check temp 140C */ + else if ((sense & THERM140) != 0U) + { + rtn = 140U; + } + /* Check temp 125C */ + else if ((sense & THERM125) != 0U) + { + rtn = 125U; + } + /* Check temp 110C */ + else if ((sense & THERM110) != 0U) + { + rtn = 110U; + } + /* Check temp 95C */ + else if ((sense & THERM95) != 0U) + { + rtn = 95U; + } + /* Check temp 80C */ + else if ((sense & THERM80) != 0U) + { + rtn = 80U; + } + else + { + ; /* Intentional empty else */ + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set PMIC temp alarm */ +/*--------------------------------------------------------------------------*/ +uint32_t pf8100_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp) +{ + uint8_t mask, reg = 0U; + + mask = THERM_I_MSK; /* start with all temp alarms enabled */ + if (temp > 80U) /* if less than 80 enable all alarms above 80 */ + { + /* subtract and round temp */ + mask = (mask << ((temp - 80U) / 15U)) & THERM_I_MSK; + } + mask = (~mask) & THERM_I_MSK; + + /* Write new mask */ + (void) I2C_READ(id, PF8100_THERMMASK, ®, 1U); + reg &= U8(~THERM_I_MSK); + reg |= mask; + (void) I2C_WRITE(id, PF8100_THERMMASK, ®, 1U); + + /* Enabled monitor if off */ + (void) I2C_READ(id, PF8100_CTRL1, ®, 1U); + if((reg & TMP_MON_EN_MSK) == 0U) + { + reg |= TMP_MON_EN_MSK; + (void) I2C_WRITE(id, PF8100_CTRL1, ®, 1U); + } + + return temp; +} + +#ifdef PMIC_SECURE_WRITE +/*--------------------------------------------------------------------------*/ +/* check if register need secure write */ +/*--------------------------------------------------------------------------*/ +bool pf8200_reg_need_secure_write(uint8_t reg_address) +{ + uint8_t i; + sc_bool_t secure = SC_FALSE; + for (i = 0; i < ARRAY_SIZE(secure_reg_list); i++) { + if (secure_reg_list[i] == reg_address) + secure = SC_TRUE; + } + return secure; +} +#endif + +/*--------------------------------------------------------------------------*/ +/* Access registers of the PF8100 */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value) +{ + sc_err_t err = SC_ERR_NONE; + status_t status; + + if (read_write == SC_FALSE) + { + status = I2C_READ(id, U8(address), value, 1U); + if (status != (status_t) kStatus_Success) + { + error_print("PMIC reg acc - Failed to rd PMIC" + " %x, reg %x\n", id, address); + + err = SC_ERR_FAIL; + } + } + else + { + status = I2C_WRITE(id, U8(address), value, 1U); + if (status != (status_t) kStatus_Success) + { + error_print("PMIC reg acc - Failed to wr PMIC" + " %x, reg %x\n", id, address); + + err = SC_ERR_FAIL; + } +#ifdef PMIC_SECURE_WRITE + uint8_t temp; + #ifndef PMIC_CRC + #error CRC must be defined for secure writes + #endif + + /* do secure write if one of the protected registers */ + if (pf8200_reg_need_secure_write(address)) + { + /* read RANDOM_GEN register */ + status |= I2C_READ(id, U8(PF8100_RANDOM_GEN), &temp, 1U); + if (status != (status_t) kStatus_Success) + { + error_print("PMIC reg acc - Failed rd PMIC" + " %x, reg %x\n", id, address); + + err = SC_ERR_FAIL; + } + /* Write RANDOM_GEN value to RANDOM_CHK */ + status = I2C_WRITE(id, U8(PF8100_RANDOM_CHK), &temp, 1U); + if (status != (status_t) kStatus_Success) + { + error_print("PMIC register access - Failed wr PMIC" + " %x, reg %x\n", id, address); + + err = SC_ERR_FAIL; + } + } +#endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Service PMIC interrupt */ +/*--------------------------------------------------------------------------*/ +sc_bool_t pf8100_pmic_irq_service(pmic_id_t id) +{ + sc_bool_t rtn = SC_FALSE; + uint8_t mask = 0U; + uint8_t therm_stat = 0U; + + /* PMIC THERM */ + (void) I2C_READ(id, PF8100_THERMINT, &therm_stat, 1U); + (void) I2C_READ(id, PF8100_THERMMASK, &mask, 1U); + therm_stat &= ~mask; + if (therm_stat != 0U) + { + mask = THERM_I_MSK; + /* Mask off to prevent repeat */ + (void) I2C_WRITE(id, PF8100_THERMMASK, &mask, 1U); + + /* Clear */ + (void) I2C_WRITE(id, PF8100_THERMINT, &therm_stat, 1U); + + rtn = SC_TRUE; + } + + /*! @todo enable other interrupt sources to be cleared */ + + return rtn; +} + + +/*--------------------------------------------------------------------------*/ +/* Check for Silicon Revision */ +/*--------------------------------------------------------------------------*/ +static inline sc_err_t check_si_rev(uint8_t address) +{ + sc_err_t err = SC_ERR_NONE; + uint8_t buff = NOT_DETECTED; + + /* Check if already detected? */ + if (si_rev == NOT_DETECTED) + { + /* Read silicon rev from PMIC */ + if (I2C_READ(address, PF8100_SILICONREVID, &buff, 1U) + == (status_t) kStatus_Success) + { + /* Return result */ + si_rev = buff; + } + else + { + /* Return error */ + err = SC_ERR_FAIL; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Enable PF8100 WDOG related bits */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_wdog_enable(pmic_id_t id, sc_bool_t wd_en, + sc_bool_t stby_en, sc_bool_t wdi_stby_active) +{ + uint8_t val = 0U; /* disable all bits by default */ + sc_err_t err = SC_ERR_NONE; + + /* read the CTRL1 register */ + err |= pf8100_pmic_register_access(id, PF8100_CTRL1, SC_FALSE, &val); + + /* wdog enable bit */ + if (wd_en) { val |= 0x8U;} + /* wdog stby enable bit */ + if (stby_en) { val |= 0x4U;} + /* wdi stby enable */ + if (wdi_stby_active) { val |= 0x2U;} + + /* write back the modified register */ + err |= pf8100_pmic_register_access(id, PF8100_CTRL1, SC_TRUE, &val); + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Disable PF8100 WDOG related bits */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_wdog_disable(pmic_id_t id, sc_bool_t wd_dis, + sc_bool_t stby_en, sc_bool_t wdi_stby_active) +{ + uint8_t val = 0U; /* disable all bits by default */ + sc_err_t err = SC_ERR_NONE; + + /* read the CTRL1 register */ + err |= pf8100_pmic_register_access(id, PF8100_CTRL1, SC_FALSE, &val); + + /* wdog disabled */ + if (wd_dis) { val &= 0xF7U;} + /* wdog stby disabled */ + if (stby_en) { val &= 0xFBU;} + /* wdi stby enable disabled */ + if (wdi_stby_active) { val &= 0xFDU;} + + /* write back the modified register */ + err |= pf8100_pmic_register_access(id, PF8100_CTRL1, SC_TRUE, &val); + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set PF8100 WDOG timeout */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_wdog_set_timeout(pmic_id_t id, uint32_t* timeout) +{ + uint8_t counter = 0; + sc_err_t err = SC_ERR_NONE; + if ((*timeout > 0U) && (*timeout < 32768U)) + { + while ((*timeout < BIT32(counter)) && (counter < 0x0FU)) + {counter++;} + + counter = counter & 0x0FU; /* Mask to make sure we only write the bits we want */ + err = pf8100_pmic_register_access(id, PF8100_WD_CONFIG, SC_TRUE, &counter); + if (err == SC_ERR_NONE) + { + *timeout = BIT32(counter); /* return the exact timeout in ms */ + } + } + else + { + err = SC_ERR_PARM; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Service PF8100 WDOG */ +/*--------------------------------------------------------------------------*/ +sc_err_t pf8100_pmic_wdog_service(pmic_id_t id) +{ + uint8_t val = 0x1U; /* write a 1 to bit 0 for the WD_CLEAR register */ + return pf8100_pmic_register_access(id, PF8100_WD_CLEAR, SC_TRUE, &val); +} + diff --git a/platform/drivers/pmic/pf8100/fsl_pf8100.h b/platform/drivers/pmic/pf8100/fsl_pf8100.h new file mode 100755 index 0000000..c8d0a40 --- /dev/null +++ b/platform/drivers/pmic/pf8100/fsl_pf8100.h @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_PMIC_PF8100_H +#define DRV_PMIC_PF8100_H + +/*! + * @addtogroup pf8100_driver + * @{ + */ + +/*! @file */ + +#ifdef PMIC_CRC /* alias the crc functions if CRC is defined */ + #define I2C_WRITE i2c_j1850_write + #define I2C_READ i2c_j1850_read +#else + #define I2C_WRITE i2c_write + #define I2C_READ i2c_read +#endif + +/*! + * @name Defines for pf8100_vregs_t + */ +/** @{ */ +#define PF8100_CTRL1 0x37U /*!< CTRL1 register of PF8100/PF8200 */ +#define PF8100_SW1 0x4DU /*!< Base register for SW1 regulator control */ +#define PF8100_SW2 0x55U /*!< Base register for SW2 regulator control */ +#define PF8100_SW3 0x5DU /*!< Base register for SW3 regulator control */ +#define PF8100_SW4 0x65U /*!< Base register for SW4 regulator control */ +#define PF8100_SW5 0x6DU /*!< Base register for SW5 regulator control */ +#define PF8100_SW6 0x75U /*!< Base register for SW6 regulator control */ +#define PF8100_SW7 0x7DU /*!< Base register for SW7 regulator control */ +#define PF8100_LDO1 0x85U /*!< Base register for LDO1 regulator control */ +#define PF8100_LDO2 0x8BU /*!< Base register for LDO2 regulator control */ +#define PF8100_LDO3 0x91U /*!< Base register for LDO3 regulator control */ +#define PF8100_LDO4 0x97U /*!< Base register for LDO4 regulator control */ +/** @} */ + +/*! + * @name Defines for sw_mode_t + */ +/** @{ */ +#define SW_RUN_OFF 0x0U /*!< Run mode: OFF */ +#define SW_RUN_PWM 0x1U /*!< Run mode: PWM */ +#define SW_RUN_PFM 0x2U /*!< Run mode: PFM */ +#define SW_RUN_ASM 0x3U /*!< Run mode: ASM */ +#define SW_STBY_OFF (0x0U << 2U) /*!< Standby mode: OFF */ +#define SW_STBY_PWM (0x1U << 2U) /*!< Standby mode: PWM */ +#define SW_STBY_PFM (0x2U << 2U) /*!< Standby mode: PFM */ +#define SW_STBY_ASM (0x3U << 2U) /*!< Standby mode: ASM */ +/** @} */ + +/*! + * @name Defines for ldo_mode_t + */ +/** @{ */ +#define RUN_OFF_STBY_OFF 0x0U /*!< Run mode: OFF, Standby mode: OFF */ +#define RUN_OFF_STBY_EN 0x1U /*!< Run mode: OFF, Standby mode: ON */ +#define RUN_EN_STBY_OFF 0x2U /*!< Run mode: ON, Standby mode: OFF */ +#define RUN_EN_STBY_EN 0x3U /*!< Run mode: ON, Standby mode: ON */ +#define VSELECT_EN 0x8U /*!< Enable VSELECT input pin for LDO 2 only */ +/** @} */ + +/*! + * @name Defines for vmode_reg_t + */ +/** @{ */ +#define REG_STBY_MODE 0U +#define REG_RUN_MODE 1U +/** @} */ + +/*! + * This type is used to indicate which register to address. + * + * Refer to the PF8100 Datasheet for the description of regsiter. + */ +typedef uint8_t pf8100_vregs_t; + +/*! + * This type is used to indicate a switching regulator mode. + * + * Refer to the PF8100 Datasheet for the description of each mode. + * + * These modes are used in combination to designate a run and standby mode + * i.e. (SW_RUN_PWM | SW_STBY_OFF). + */ +typedef uint8_t sw_mode_t; + +/*! + * This type is used to indicate an LDO regulator mode. + * + * Refer to the PF8100 Datasheet for the description of each mode. + */ +typedef uint8_t ldo_mode_t; + +/*! + * This type is used to indicate a Switching regulator voltage setpoint + * + * Refer to the PF8100 Datasheet for the description of each mode. + */ +typedef uint8_t vmode_reg_t; + +/* Functions prototypes */ + +/*! + * This function returns the device ID and revision for the PF8100 PMIC. + * + * @param[in] id I2C address of PMIC device + * + * @return Returns a structure with the device ID and revision. + */ +pmic_version_t pf8100_get_pmic_version(pmic_id_t id); + +/*! + * This function sets the voltage of a corresponding voltage regulator for the + * PF8100 PMIC. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + * see [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[in] vol_mv New voltage setpoint for the regulator in millivolts + * @param[in] mode_to_set Mode to set the voltage for run (RUN or STANDBY) + * + * @return Returns an error code (SC_ERR_NONE = success) + + * Note \a mode_to_set is SC_TRUE for RUN and SC_FALSE for STANDBY. + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t pf8100_pmic_set_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t vol_mv, + uint32_t mode_to_set); + +/*! + * This function gets the voltage on a corresponding voltage regulator for the + * PF8100 PMIC. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + * see [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[out] vol_mv pointer to return voltage in millivolts + * @param[in] mode_to_get Mode to get the voltage for (RUN or STANDBY) + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Note \a mode_to_get is SC_TRUE for RUN and SC_FALSE for STANDBY. + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + */ +sc_err_t pf8100_pmic_get_voltage(pmic_id_t id, uint32_t pmic_reg, uint32_t *vol_mv, + uint32_t mode_to_get); + +/*! + * This function sets the mode of the specified regulator. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + see [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[in] mode mode to set the regulator; + * see [sw_mode_t](@ref sw_mode_t) + * and [ldo_mode_t](@ref ldo_mode_t) + * + * Note SW modes are used in combination to designate a run and standby mode + * i.e. (SW_RUN_PWM | SW_STBY_OFF). + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t pf8100_pmic_set_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t mode); + +/*! + * This function gets the mode of the specified regulator. + * + * @param[in] id I2C address of PMIC device + * @param[in] pmic_reg Register corresponding to regulator; + see [pf8100_vregs_t](@ref pf8100_vregs_t) + * @param[out] mode pointer to return mode in raw hex form + * + * Note SW modes are used in combination to designate a run and standby mode + * i.e. (SW_RUN_PWM | SW_STBY_OFF). + * + * @return Returns an error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * - SC_ERR_FAIL if writing the register failed + */ +sc_err_t pf8100_pmic_get_mode(pmic_id_t id, uint32_t pmic_reg, uint32_t *mode); +/*! + * This function gets the current PMIC temperature as sensed by the + * PMIC temperature sensor. + * + * @param[in] id I2C address of PMIC device + * + * @return returns the temp sensed by the PMIC in a UINT32 in Celsius + * + * Return errors: + * - SC_ERR_CONFIG if temperature monitor is not enabled + * + * Note PMIC PF100 temp is returned as the highest temp sensor enabled. + */ +uint32_t pf8100_get_pmic_temp(pmic_id_t id); + +/*! + * This function sets the temp alarm for the PMIC in Celsius + * + * @param[in] id I2C address of PMIC device + * @param[in] temp Temperature to set the alarm + * + * Note the granularity for PF100 PMIC only allows the following + * values: + * 80 + * 95 + * 110 + * 125 + * 140 + * 155 + * + * @return Returns the temperature that the alarm is set to in Celsius + */ +uint32_t pf8100_set_pmic_temp_alarm(pmic_id_t id, uint32_t temp); + +/* + * This function allows access to individual registers of the PF8100 + * + * @param[in] id I2C address of PMIC device + * @param[in] address register address to access + * @param[in] read_write bool indicating read(SC_FALSE/0) or write(SC_TRUE/1) + * @param[in,out] value value to read or to set + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf8100_pmic_register_access(pmic_id_t id, uint32_t address, + sc_bool_t read_write, uint8_t* value); + +/*! + * This function services the interrupt for the temp alarm + * + * @param[in] id I2C address of PMIC device + * + * @return Returns SC_TRUE if the temperature interrupt was cleared + */ +sc_bool_t pf8100_pmic_irq_service(pmic_id_t id); + +/* + * This function enables PF8100 internal WDOG configuration bits + * + * @param[in] id I2C address of PMIC device + * @param[in] wd_en bool indicating to enable(SC_TRUE/1) or to + * ignore the wdog bit + * @param[in] stby_en bool indicating whether to set(SC_TRUE/1) wdog stby en + * bit or ignore(SC_FALSE/0) + * @param[in] wdi_stby_active bool indicating whether wdi stby active bit should be + * set(SC_TRUE/1) or ignored(SC_FALSE/0) + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf8100_pmic_wdog_enable(pmic_id_t id, sc_bool_t wd_en, + sc_bool_t stby_en, sc_bool_t wdi_stby_active); + +/* + * This function disables PF8100 internal WDOG configuration bits + * + * @param[in] id I2C address of PMIC device + * @param[in] wd_dis bool indicating to clear(SC_TRUE/1) or + * ignore wdog enable bit(SC_FALSE/0) + * @param[in] stby_en bool indicating if stby enable bit will be + * cleared(SC_TRUE/1) or ignored(SC_FALSE/0) + * @param[in] wdi_stby_active bool indicating whether to clear(SC_TRUE/1) + * or ignore(SC_FALSE/0) wdi_stby_active bit + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf8100_pmic_wdog_disable(pmic_id_t id, sc_bool_t wd_dis, + sc_bool_t stby_en, sc_bool_t wdi_stby_active); +/* + * This function sets the timeout of the PF8100 internal WDOG + * + * @param[in] id I2C address of PMIC device + * @param[in,out] timeout Desired timeout in ms. The function will + * calculate next largest interval and return the + * exact timeout value in ms. + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf8100_pmic_wdog_set_timeout(pmic_id_t id, uint32_t* timeout); + +/* + * This function services the PF8100 internal WDOG + * + * @param[in] id I2C address of PMIC device + * + * @return Returns ar error code (SC_ERR_NONE = success) + * + * Return errors: + * - SC_ERR_PARM if invalid parameters + * + */ +sc_err_t pf8100_pmic_wdog_service(pmic_id_t id); + +#endif + +/** @} */ + diff --git a/platform/drivers/reset/Makefile b/platform/drivers/reset/Makefile new file mode 100755 index 0000000..7c3acab --- /dev/null +++ b/platform/drivers/reset/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/reset/fsl_reset.o + +DIRS += $(OUT)/drivers/reset + diff --git a/platform/drivers/reset/fsl_reset.h b/platform/drivers/reset/fsl_reset.h new file mode 100755 index 0000000..4a5c9e8 --- /dev/null +++ b/platform/drivers/reset/fsl_reset.h @@ -0,0 +1,58 @@ +/* + * Copyright 2019-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_RESET_H +#define DRV_RESET_H + +/*! + * @addtogroup reset_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "fsl_device_registers.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +void RESET_Peripheral(ECSR_Reset_Type *base, uint32_t reset_reg, + uint32_t reset_mask, sc_bool_t old_sequence, + uint8_t bus_ack_timeout); + +#endif /* DRV_RESET_H */ + +/** @} */ + diff --git a/platform/drivers/rgpio/Makefile b/platform/drivers/rgpio/Makefile new file mode 100755 index 0000000..cfc65d8 --- /dev/null +++ b/platform/drivers/rgpio/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/rgpio/fsl_rgpio.o + +DIRS += $(OUT)/drivers/rgpio + diff --git a/platform/drivers/rgpio/fsl_rgpio.h b/platform/drivers/rgpio/fsl_rgpio.h new file mode 100755 index 0000000..9fc41c9 --- /dev/null +++ b/platform/drivers/rgpio/fsl_rgpio.h @@ -0,0 +1,585 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_RGPIO_H_ +#define _FSL_RGPIO_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup rgpio + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief RGPIO driver version 2.0.2. */ +#define FSL_RGPIO_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) +/** @} */ + +/*! @brief RGPIO direction definition */ +typedef enum _rgpio_pin_direction +{ + kRGPIO_DigitalInput = 0U, /*!< Set current pin as digital input*/ + kRGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output*/ +} rgpio_pin_direction_t; + +#if defined(FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER +/*! @brief RGPIO checker attribute */ +typedef enum _rgpio_checker_attribute +{ + kRGPIO_UsernonsecureRWUsersecureRWPrivilegedsecureRW = + 0x00U, /*!< User nonsecure:Read+Write; User Secure:Read+Write; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureRUsersecureRWPrivilegedsecureRW = + 0x01U, /*!< User nonsecure:Read; User Secure:Read+Write; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureNUsersecureRWPrivilegedsecureRW = + 0x02U, /*!< User nonsecure:None; User Secure:Read+Write; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureRUsersecureRPrivilegedsecureRW = + 0x03U, /*!< User nonsecure:Read; User Secure:Read; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureNUsersecureRPrivilegedsecureRW = + 0x04U, /*!< User nonsecure:None; User Secure:Read; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureNUsersecureNPrivilegedsecureRW = + 0x05U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:Read+Write */ + kRGPIO_UsernonsecureNUsersecureNPrivilegedsecureR = + 0x06U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:Read */ + kRGPIO_UsernonsecureNUsersecureNPrivilegedsecureN = + 0x07U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:None */ + kRGPIO_IgnoreAttributeCheck = 0x80U, /*!< Ignores the attribute check */ +} rgpio_checker_attribute_t; +#endif + +/*! + * @brief The RGPIO pin configuration structure. + * + * Each pin can only be configured as either an output pin or an input pin at a time. + * If configured as an input pin, leave the outputConfig unused. + * Note that in some use cases, the corresponding port property should be configured in advance + * with the PORT_SetPinConfig(). + */ +typedef struct _rgpio_pin_config +{ + rgpio_pin_direction_t pinDirection; /*!< RGPIO direction, input or output */ + /* Output configurations; ignore if configured as an input pin */ + uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */ +} rgpio_pin_config_t; + +/*! @} */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @addtogroup rgpio_driver + * @{ + */ + +/*! @name RGPIO Configuration */ +/** @{ */ + +/*! + * @brief Initializes a RGPIO pin used by the board. + * + * To initialize the RGPIO, define a pin configuration, as either input or output, in the user file. + * Then, call the RGPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration. + * @code + * Define a digital input pin configuration, + * rgpio_pin_config_t config = + * { + * kRGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * rgpio_pin_config_t config = + * { + * kRGPIO_DigitalOutput, + * 0, + * } + * @endcode + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param pin RGPIO port pin number + * @param config RGPIO pin configuration pointer + */ +void RGPIO_PinInit(RGPIO_Type *base, uint32_t pin, const rgpio_pin_config_t *config); + +/*! + * @brief Gets the RGPIO instance according to the RGPIO base + * + * @param base RGPIO peripheral base pointer(PTA, PTB, PTC, etc.) + * @retval RGPIO instance + */ +uint32_t RGPIO_GetInstance(RGPIO_Type *base); +/** @} */ + +/*! @name RGPIO Output Operations */ +/** @{ */ + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 1 or 0. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param pin RGPIO pin number + * @param output RGPIO pin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +static inline void RGPIO_PinWrite(RGPIO_Type *base, uint32_t pin, uint8_t output) +{ + if (output == 0U) + { + base->PCOR = 1UL << pin; + } + else + { + base->PSOR = 1UL << pin; + } +} + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 1 or 0. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PinWrite. + */ +static inline void RGPIO_WritePinOutput(RGPIO_Type *base, uint32_t pin, uint8_t output) +{ + RGPIO_PinWrite(base, pin, output); +} + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 1. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +static inline void RGPIO_PortSet(RGPIO_Type *base, uint32_t mask) +{ + base->PSOR = mask; +} + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 1. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PortSet. + */ +static inline void RGPIO_SetPinsOutput(RGPIO_Type *base, uint32_t mask) +{ + RGPIO_PortSet(base, mask); +} + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 0. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +static inline void RGPIO_PortClear(RGPIO_Type *base, uint32_t mask) +{ + base->PCOR = mask; +} + +/*! + * @brief Sets the output level of the multiple RGPIO pins to the logic 0. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PortClear. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +static inline void RGPIO_ClearPinsOutput(RGPIO_Type *base, uint32_t mask) +{ + RGPIO_PortClear(base, mask); +} + +/*! + * @brief Reverses the current output logic of the multiple RGPIO pins. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +static inline void RGPIO_PortToggle(RGPIO_Type *base, uint32_t mask) +{ + base->PTOR = mask; +} + +/*! + * @brief Reverses the current output logic of the multiple RGPIO pins. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PortToggle. + */ +static inline void RGPIO_TogglePinsOutput(RGPIO_Type *base, uint32_t mask) +{ + RGPIO_PortToggle(base, mask); +} +/** @} */ + +/*! @name RGPIO Input Operations */ +/** @{ */ + +/*! + * @brief Reads the current input value of the RGPIO port. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param pin RGPIO pin number + * @retval RGPIO port input value + * - 0: corresponding pin input low-logic level. + * - 1: corresponding pin input high-logic level. + */ +static inline uint32_t RGPIO_PinRead(RGPIO_Type *base, uint32_t pin) +{ + return (((base->PDIR) >> pin) & 0x01U); +} + +/*! + * @brief Reads the current input value of the RGPIO port. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PinRead. + */ +static inline uint32_t RGPIO_ReadPinInput(RGPIO_Type *base, uint32_t pin) +{ + return RGPIO_PinRead(base, pin); +} + +/** @} */ + +#if defined(FSL_FEATURE_SOC_PORT_COUNT) && FSL_FEATURE_SOC_PORT_COUNT +/*! @name RGPIO Interrupt */ +/** @{ */ + +/*! + * @brief Reads the RGPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @retval The current RGPIO port interrupt status flag, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t RGPIO_PortGetInterruptFlags(RGPIO_Type *base); + +/*! + * @brief Reads the RGPIO port interrupt status flag. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PortGetInterruptFlags. + */ +static inline uint32_t RGPIO_GetPinsInterruptFlags(RGPIO_Type *base) +{ + return RGPIO_PortGetInterruptFlags(base); +} + +/*! + * @brief Clears multiple RGPIO pin interrupt status flags. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +void RGPIO_PortClearInterruptFlags(RGPIO_Type *base, uint32_t mask); + +/*! + * @brief Clears multiple RGPIO pin interrupt status flags. + * @deprecated Do not use this function. It has been superceded by @ref RGPIO_PortClearInterruptFlags. + */ +static inline void RGPIO_ClearPinsInterruptFlags(RGPIO_Type *base, uint32_t mask) +{ + RGPIO_PortClearInterruptFlags(base, mask); +} +#endif +#if defined(FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER +/*! + * @brief The RGPIO module supports a device-specific number of data ports, organized as 32-bit + * words. Each 32-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the RGPIO programming model. The attribute controls for the 4 data + * bytes in the GACR follow a standard little endian + * data convention. + * + * @param base RGPIO peripheral base pointer (RGPIOA, RGPIOB, RGPIOC, and so on.) + * @param mask RGPIO pin number macro + */ +void RGPIO_CheckAttributeBytes(RGPIO_Type *base, rgpio_checker_attribute_t attribute); +#endif + +/** @} */ +/*! @} */ + +/*! + * @addtogroup fgpio_driver + * @{ + */ + +/* + * Introduces the FGPIO feature. + * + * The FGPIO registers are aliased to the IOPORT interface. + * Accesses via the IOPORT interface occur in parallel with any instruction fetches and + * complete in a single cycle. This aliased Fast GPIO memory map is called FGPIO. + */ + +#if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT + +/*! @name FGPIO Configuration */ +/** @{ */ + +#if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL +/*! + * @brief Initializes the FGPIO peripheral. + * + * This function ungates the FGPIO clock. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + */ +void FGPIO_PortInit(FGPIO_Type *base); + +/*! + * @brief Initializes the FGPIO peripheral. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortInit. + */ +static inline void FGPIO_Init(FGPIO_Type *base) +{ + FGPIO_PortInit(base); +} +#endif +/*! + * @brief Initializes a FGPIO pin used by the board. + * + * To initialize the FGPIO driver, define a pin configuration, as either input or output, in the user file. + * Then, call the FGPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration: + * @code + * Define a digital input pin configuration, + * rgpio_pin_config_t config = + * { + * kRGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * rgpio_pin_config_t config = + * { + * kRGPIO_DigitalOutput, + * 0, + * } + * @endcode + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO port pin number + * @param config FGPIO pin configuration pointer + */ +void FGPIO_PinInit(FGPIO_Type *base, uint32_t pin, const rgpio_pin_config_t *config); + +/*! + * @brief Gets the FGPIO instance according to the RGPIO base + * + * @param base FGPIO peripheral base pointer(PTA, PTB, PTC, etc.) + * @retval FGPIO instance + */ +uint32_t FGPIO_GetInstance(FGPIO_Type *base); +/** @} */ + +/*! @name FGPIO Output Operations */ +/** @{ */ + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1 or 0. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO pin number + * @param output FGPIOpin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +static inline void FGPIO_PinWrite(FGPIO_Type *base, uint32_t pin, uint8_t output) +{ + if (output == 0U) + { + base->PCOR = 1UL << pin; + } + else + { + base->PSOR = 1UL << pin; + } +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1 or 0. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PinWrite. + */ +static inline void FGPIO_WritePinOutput(FGPIO_Type *base, uint32_t pin, uint8_t output) +{ + FGPIO_PinWrite(base, pin, output); +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortSet(FGPIO_Type *base, uint32_t mask) +{ + base->PSOR = mask; +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortSet. + */ +static inline void FGPIO_SetPinsOutput(FGPIO_Type *base, uint32_t mask) +{ + FGPIO_PortSet(base, mask); +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 0. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortClear(FGPIO_Type *base, uint32_t mask) +{ + base->PCOR = mask; +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 0. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortClear. + */ +static inline void FGPIO_ClearPinsOutput(FGPIO_Type *base, uint32_t mask) +{ + FGPIO_PortClear(base, mask); +} + +/*! + * @brief Reverses the current output logic of the multiple FGPIO pins. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortToggle(FGPIO_Type *base, uint32_t mask) +{ + base->PTOR = mask; +} + +/*! + * @brief Reverses the current output logic of the multiple FGPIO pins. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortToggle. + */ +static inline void FGPIO_TogglePinsOutput(FGPIO_Type *base, uint32_t mask) +{ + FGPIO_PortToggle(base, mask); +} +/** @} */ + +/*! @name FGPIO Input Operations */ +/** @{ */ + +/*! + * @brief Reads the current input value of the FGPIO port. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO pin number + * @retval FGPIO port input value + * - 0: corresponding pin input low-logic level. + * - 1: corresponding pin input high-logic level. + */ +static inline uint32_t FGPIO_PinRead(FGPIO_Type *base, uint32_t pin) +{ + return (((base->PDIR) >> pin) & 0x01U); +} + +/*! + * @brief Reads the current input value of the FGPIO port. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PinRead + */ +static inline uint32_t FGPIO_ReadPinInput(FGPIO_Type *base, uint32_t pin) +{ + return FGPIO_PinRead(base, pin); +} +/** @} */ + +#if defined(FSL_FEATURE_SOC_PORT_COUNT) && FSL_FEATURE_SOC_PORT_COUNT +/*! @name FGPIO Interrupt */ +/** @{ */ + +/*! + * @brief Reads the FGPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level-sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @retval The current FGPIO port interrupt status flags, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t FGPIO_PortGetInterruptFlags(FGPIO_Type *base); + +/*! + * @brief Reads the FGPIO port interrupt status flag. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortGetInterruptFlags. + */ +static inline uint32_t FGPIO_GetPinsInterruptFlags(FGPIO_Type *base) +{ + return FGPIO_PortGetInterruptFlags(base); +} + +/*! + * @brief Clears the multiple FGPIO pin interrupt status flag. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +void FGPIO_PortClearInterruptFlags(FGPIO_Type *base, uint32_t mask); + +/*! + * @brief Clears the multiple FGPIO pin interrupt status flag. + * @deprecated Do not use this function. It has been superceded by @ref FGPIO_PortClearInterruptFlags. + */ +static inline void FGPIO_ClearPinsInterruptFlags(FGPIO_Type *base, uint32_t mask) +{ + FGPIO_PortClearInterruptFlags(base, mask); +} +#endif +#if defined(FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_RGPIO_HAS_ATTRIBUTE_CHECKER +/*! + * @brief The FGPIO module supports a device-specific number of data ports, organized as 32-bit + * words. Each 32-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the RGPIO programming model. The attribute controls for the 4 data + * bytes in the GACR follow a standard little endian + * data convention. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +void FGPIO_CheckAttributeBytes(FGPIO_Type *base, rgpio_checker_attribute_t attribute); +#endif + +/** @} */ + +#endif /* FSL_FEATURE_SOC_FGPIO_COUNT */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ + +#endif /* _FSL_RGPIO_H_*/ diff --git a/platform/drivers/seco/fsl_seco.h b/platform/drivers/seco/fsl_seco.h new file mode 100755 index 0000000..6b971f6 --- /dev/null +++ b/platform/drivers/seco/fsl_seco.h @@ -0,0 +1,927 @@ +/* + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_SECO_H +#define DRV_SECO_H + +/*! + * @addtogroup seco_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" +#include "svc/seco/api.h" + +/* Defines */ + +/*! + * @name Defines for seco_lifecycle_t + */ +/** @{ */ +#define SECO_LIFECYCLE_DEFAULT BIT(0) /*!< Default fab mode (early_fuses_pgrm not blown) */ +#define SECO_LIFECYCLE_FAB BIT(1) /*!< Fab mode */ +#define SECO_LIFECYCLE_NO_SECRETS BIT(2) /*!< No secrets */ +#define SECO_LIFECYCLE_SECRETS BIT(3) /*!< With Secrets */ +#define SECO_LIFECYCLE_SC_FW_CLSD BIT(4) /*!< SCU FW Closed */ +#define SECO_LIFECYCLE_SECO_FW_CLSD BIT(5) /*!< SECO FW Closed */ +#define SECO_LIFECYCLE_CLOSED BIT(6) /*!< Closed */ +#define SECO_LIFECYCLE_CLOSED_FW BIT(7) /*!< Closed with FW */ +#define SECO_LIFECYCLE_PART_RTN BIT(8, /*!< Partial field return */ +#define SECO_LIFECYCLE_RTN BIT(9) /*!< Field return */ +#define SECO_LIFECYCLE_NO_RTN BIT(10) /*!< No Return */ +/** @} */ + +/*! + * @name Defines for seco_snvs_id_t + */ +/** @{ */ +#define AHAB_SNVS_ID_INIT 0x00U /*!< Init SNVS */ +#define AHAB_SNVS_ID_POWER_OFF 0x01U /*!< Power off the system */ +#define AHAB_SNVS_ID_SRTC 0x02U /*!< R/W the SRTC */ +#define AHAB_SNVS_ID_SRTC_CALB 0x03U /*!< R/W the SRTC calibration */ +#define AHAB_SNVS_ID_SRTC_ALRM 0x04U /*!< R/W the SRTC alarm */ +#define AHAB_SNVS_ID_RTC 0x05U /*!< R/W the RTC */ +#define AHAB_SNVS_ID_RTC_CALB 0x06U /*!< R/W the RTC calibration */ +#define AHAB_SNVS_ID_RTC_ALRM 0x07U /*!< R/W the RTC alarm */ +#define AHAB_SNVS_ID_BTN_CONFIG 0x08U /*!< R/W the button configuration */ +#define AHAB_SNVS_ID_BTN_MASK 0x09U /*!< R/W the button mask */ +#define AHAB_SNVS_ID_BTN 0x0AU /*!< R/W the button state */ +#define AHAB_SNVS_ID_BTN_CLEAR 0x0BU /*!< Clear the button IRQ */ +#define AHAB_SNVS_ID_SSM_STATE 0x0CU /*!< Read the SSM state */ +#define AHAB_SNVS_ID_BTN_TIME 0x0DU /*!< R/W the button time parameters */ +#define AHAB_SNVS_ID_WAKE_UP_IT 0x0EU /*!< Clear the wake IRQ */ +/** @} */ + +/*! + * @name Defines for SNVS access + */ +/** @{ */ +#define SECO_SNVS_READ 0U /*!< SNVS read operation */ +#define SECO_SNVS_WRITE 1U /*!< SNVS write operation */ +/** @} */ + +/*! + * @name Macros for version parsing + */ +/** @{ */ +#define SECO_PROD_VER(X) (((X) >> 16) & 0x7FFFUL) /*!< Extract SECO production ver */ +#define SECO_MAJOR_VER(X) (((X) >> 4) & 0xFFFUL) /*!< Extract SECO major ver */ +#define SECO_MINOR_VER(X) ((X) & 0xFUL) /*!< Extract SECO minor ver */ +/** @} */ + +/*! + * @name Defines for V2X state + */ +/** @{ */ +#define V2X_STATE_AUTH_RX 0x01U /*!< Authentication request received */ +#define V2X_STATE_PROV_NORMAL 0x02U /*!< Provisioned successfully in normal mode */ +#define V2X_STATE_PROV_DEBUG 0x04U /*!< Provisioned successfully in debug mode */ +#define V2X_STATE_AUTH_IP 0x08U /*!< Authentication on going */ +#define V2X_STATE_AUTH_SUCCESS 0x10U /*!< Authentication success */ +#define V2X_STATE_AUTH_FAIL 0x20U /*!< Authentication failure */ +#define V2X_STATE_CRYPTO_DIS 0x40U /*!< Crypto accelerators disabled */ +#define V2X_STATE_HOLD_EN 0x80U /*!< V2X provisioning on hold */ +/** @} */ + +/*! + * @name Defines for V2X power mode and state + */ +/** @{ */ +#define V2X_POWER_STATE_UNKNOWN 0U /*!< Unknown power state */ +#define V2X_POWER_STATE_ON 1U /*!< Power on state */ +#define V2X_POWER_STATE_LP 2U /*!< Low power state */ +#define V2X_POWER_STATE_STBY 3U /*!< Standby state */ +#define V2X_POWER_STATE_OFF 4U /*!< Power off state */ +/** @} */ + +/*! + * @name Defines for V2X power flags + */ +/** @{ */ +#define V2X_POWER_NONE 0x00U /*!< No flags */ +#define V2X_POWER_FORCE 0x01U /*!< Force power state change */ +/** @} */ + +/*! + * @name Defines for V2X recovery flags + */ +/** @{ */ +#define V2X_RECOVER_NONE 0x00U /*!< No flags */ +#define V2X_RECOVER_AUTH 0x01U /*!< Send FW recovery */ +/** @} */ + +#ifdef NO_DEVICE_ACCESS + /*! + * This variable is used to access fake SECO. + */ + extern uint32_t temp_seco[]; + #define HAS_TEMP_SECO +#endif + +/* Types */ + +/*! + * This type is used to return the lifecycle. + */ +typedef uint16_t seco_lifecycle_t; + +/*! + * This type is used to indicate the ID of anSNVS register to access. + */ +typedef uint8_t seco_snvs_id_t; + +/* Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * This function initializes the SECO driver. + * + * @param[in] phase Init phase + * + * Called when SCFW boots. + */ +void SECO_Init(boot_phase_t phase); + +/*! + * This function configures the CAAM MP. + * + * @param[in] master Index of job ring / out + * @param[in] lock Lock state of config + * @param[in] sa Secure state + * @param[in] did XRDC2 Domain ID + * @param[in] sid SMMU Stream ID + * + * Called by the Resource Manager to configure CAAM job ring access and + * output parameters. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_CAAM_Config(uint16_t master, sc_bool_t lock, sc_rm_spa_t sa, + sc_rm_did_t did, sc_rm_sid_t sid); + +/*! + * This function clears the CAAM MP cache. It is called by the Power + * Manager when CAAM power state is lost. + */ +void SECO_ClearCache(void); + +/*! + * This function configures MU ownership. + * + * @param[in] mu Index of MU + * @param[in] sa Secure state + * @param[in] did XRDC2 Domain ID + * + * Called by the Resource Manager to configure MU access. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_MU_Config(uint8_t mu, sc_rm_spa_t sa, sc_rm_did_t did); + +/*! + * This function partitions the monotonic counter. + * + * @param[in] she number of SHE bits + * + * SECO uses an OTP monotonic counter to protect the SHE and HSM key-stores + * from roll-back attack. This function is used to define the number of + * monotonic counter bits allocated to SHE use. Two monotonic counter bits + * are used to store this information while the remaining bits are allocated + * to the HSM user. This function must be called before any SHE or HSM key stores + * are created in the system, otherwise the default configuration is applied. + * + * If the partition has been already configured, any attempt to re-configure + * the SHE partition to a different value will result in a failure response. + * + * @return Returns the current number of SHE bits. + * + * See the SECO API Reference Guide for more info. + */ +uint16_t SECO_SetMonoCounterPartition(uint16_t she); + +/*! + * This function configures the SECO in FIPS mode. + * + * @param[in] mode FIPS mode + * + * This function permanently configures the SECO in FIPS approved mode. When in + * FIPS approved mode the following services will be disabled and receive a + * failure response: + * + * - Encrypted boot is not supported + * - Attestation is not supported + * - Manufacturing protection is not supported + * - DTCP load + * - SHE services are not supported + * - Assign JR is not supported (all JRs owned by SECO) + * + * @return Returns the failure reason. + * + * See the SECO API Reference Guide for more info. + */ +uint32_t SECO_SetFipsMode(uint8_t mode); + +/*! + * This function will securely zeroize all plaintext secret and private + * cryptographic keys and CSPs within the module. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * This function is effective when the part is configured in FIPS approved + * mode only, no effects otherwise. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_FipsKeyZero(sc_faddr_t addr); + +/** @} */ + +/*! + * @name Power Mangement Functions + * @{ + */ + +/*! + * This function notifies SECO that a subsystem power state has changed. + * + * @param[in] ss Subsystem + * @param[in] inst Subsystem instance + * @param[in] up Power state + * + * Called by the Power Manager when subsystem power state changes. + */ +void SECO_Power(sc_sub_t ss, uint32_t inst, sc_bool_t up); + +/*! + * This function notifies SECO that CAAM is powering down. + * + * Called by the Power Manager before powering down the CAAM. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_CAAM_PowerDown(void); + +/*! + * This function notifies SECO the system is entering low power mode. + * + * Called by the Power Manager before entering LPM. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_EnterLPM(void); + +/*! + * This function notifies SECO the system is has exited low power mode. + * + * Called by the Power Manager before after exiting LPM. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_ExitLPM(void); + +/** @} */ + +/*! + * @name Image Functions + * @{ + */ + +/*! + * This function loads a SECO image. + * + * @param[in] addr_src address of image source + * @param[in] addr_dst address of image destination + * @param[in] len lenth of image to load + * @param[in] fw SC_TRUE = firmware load + * + * This is used to load images via the SECO. Examples include SECO + * Firmware and IVT/CSF data used for authentication. These are usually + * loaded into SECO TCM. \a addr_src is in secure memory. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_Image_Load(sc_faddr_t addr_src, sc_faddr_t addr_dst, uint32_t len, + sc_bool_t fw); + +/*! + * This function is used to authenticate a SECO image or command. + * + * @param[in] cmd authenticate command + * @param[in] addr address of/or metadata + * @param[in] mask1 metadata + * @param[in] mask2 metadata + * + * This is used to authenticate a SECO image or issue a security + * command. \a addr often points to an container. It is also + * just data (or even unused) for some commands. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_Authenticate(sc_seco_auth_cmd_t cmd, sc_faddr_t addr, + uint32_t mask1, uint32_t mask2); + +/** @} */ + +/*! + * @name Lifecycle Functions + * @{ + */ + +/*! + * This function is used get the lifecycle from the ADM. + * + * @return Returns the lifecycle. + */ +seco_lifecycle_t SECO_Get_Lifecycle(void); + +/*! + * This function updates the lifecycle of the device. + * + * @param[in] change desired lifecycle transistion + * + * This function is used for going from Open to NXP Closed to OEM Closed. + * Note \a change is NOT the new desired lifecycle. It is a lifecycle + * transition as documented in the SECO API Reference Guide. + * + * If any SECO request fails or only succeeds because the part is in an + * "OEM open" lifecycle, then a request to transition from "NXP closed" + * to "OEM closed" will also fail. For example, booting a signed container + * when the OEM SRK is not fused will succeed, but as it is an abnormal + * situation, a subsequent request to transition the lifecycle will return + * an error via seco_err. + */ +void SECO_ForwardLifecycle(uint32_t change); + +/*! + * This function updates the lifecycle to one of the return lifecycles. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * To switch back to NXP states (Full Field Return), message must be signed + * by NXP SRK. For OEM States (Partial Field Return), must be signed by OEM + * SRK. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_ReturnLifecycle(sc_faddr_t addr); + +/*! + * This function is used to commit into the fuses any new SRK revocation + * and FW version information that have been found in the primary and + * secondary containers. + * + * @param[in,out] info pointer to information type to be committed + * + * The return \a info will contain what was actually committed. + */ +void SECO_Commit(uint32_t *info); + +/** @} */ + +/*! + * @name Attestation Functions + * @{ + */ + +/*! + * This function is used to set the attestation mode. + * + * @param[in] mode mode + * + * This is used to set the SECO attestation mode. This can be prover + * or verfier. See the SECO API Reference Guide for more on the + * suported modes, mode values, and mode behavior. + */ +void SECO_AttestMode(uint32_t mode); + +/*! + * This function is used to request atestation. + * + * @param[in] nonce unique value + * + * This is used to ask SECO to perform an attestation. The result depends + * on the attestation mode. After this call, the signature can be + * requested or a verify can be requested. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_Attest(uint64_t nonce); + +/*! + * This function is used to retrieve the attestation public key. + * Mode must be verifier. + * + * @param[in] addr address to write response + * + * Result will be written to \a addr. The \a addr parmater must point + * to an address SECO can access. It must be 64-bit aligned. There + * should be 96 bytes of space. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_GetAttestPublicKey(sc_faddr_t addr); + +/*! + * This function is used to retrieve attestation signature and parameters. + * Mode must be provider. + * + * @param[in] addr address to write response + * + * Result will be written to \a addr. The \a addr parmater must point + * to an address SECO can access. It must be 64-bit aligned. There + * should be 120 bytes of space. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_GetAttestSign(sc_faddr_t addr); + +/*! + * This function is used to verify attestation. Mode must be verifier. + * + * @param[in] addr address of signature + * + * The \a addr parmater must point to an address SECO can access. It must be + * 64-bit aligned. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_AttestVerify(sc_faddr_t addr); + +/** @} */ + +/*! + * @name Key Functions + * @{ + */ + +/*! + * This function is used to generate a SECO key blob. + * + * @param[in] id key identifier + * @param[in] load_addr load address + * @param[in] export_addr export address + * @param[in] max_size max export size + * + * This function is used to encapsulate sensitive keys in a specific structure + * called a blob, which provides both confidentiality and integrity protection. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_GenKeyBlob(uint32_t id, sc_faddr_t load_addr, + sc_faddr_t export_addr, uint16_t max_size); + +/*! + * This function is used to load a SECO key. + * + * @param[in] id key identifier + * @param[in] addr key address + * + * This function is used to install private cryptographic keys encapsulated + * in a blob previously generated by SECO. The controller can be either the + * IEE or the VPU. The blob header carries the controller type and the key + * size, as provided by the user when generating the key blob. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_LoadKey(uint32_t id, sc_faddr_t addr); + +/** @} */ + +/*! + * @name Manufacturing Protection Functions + * @{ + */ + +/*! + * This function is used to get the manufacturing protection public key. + * + * @param[in] dst_addr destination address + * @param[in] dst_size destination size + * + * This function is supported only in OEM-closed lifecycle. It generates + * the mfg public key and stores it in a specific location in the secure + * memory. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_GetMPKey(sc_faddr_t dst_addr, uint16_t dst_size); + +/*! + * This function is used to update the manufacturing protection message + * register. + * + * @param[in] addr data address + * @param[in] size size + * @param[in] lock lock_reg + * + * This function is supported only in OEM-closed lifecycle. It updates the + * content of the MPMR (Manufacturing Protection Message register of 256 + * bits). This register will be appended to the input-data message when + * generating the signature. Please refer to the CAAM block guide for details. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_UpdateMPMR(sc_faddr_t addr, uint8_t size, uint8_t lock); + +/*! + * This function is used to get the manufacturing protection signature. + * + * @param[in] msg_addr message address + * @param[in] msg_size message size + * @param[in] dst_addr destination address + * @param[in] dst_size destination size + * + * This function is used to generate an ECDSA signature for an input-data + * message and to store it in a specific location in the secure memory. It + * is only supported in OEM-closed lifecycle. In order to get the ECDSA + * signature, the RNG must be initialized. In case it has not been started + * an error will be returned. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_GetMPSign(sc_faddr_t msg_addr, uint16_t msg_size, + sc_faddr_t dst_addr, uint16_t dst_size); + +/** @} */ + +#ifdef HAS_V2X + +/*! + * @name V2X Functions + * @{ + */ + +/*! + * This function is used to forward a message received from V2X. + * + * @param[in] buf pointer to message buffer + * + * @return Returns number of words in response. + */ +uint8_t SECO_V2X_Forward(uint32_t *buf); + +/*! + * This function sends a ping to V2X through SECO. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_Ping(void); + +/*! + * This function is used to set a control variable indicating whether or not the + * configuration of the V2X must be done as soon as possible or should be delayed + * and left under the control of the SCU. + * + * @param[in] hold_value 0=no delay, 1=delay + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_Hold(uint32_t hold_value); + +/*! + * This function is used to provision the V2X either in "normal" mode or in "debug" + * mode. Provisioning for debug request will be accepted only in NXP open LC. In NXP + * closed LC, the SECO_EnableDebug() function must be used instead. + * + * @param[in] provision_mode 0=normal, 1=debug + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_Provision(uint32_t provision_mode); + +/*! + * This function returns the v2x_state (provisioned, successfully authenticated, etc.). + * It should be sent after the v2x_authenticate_request in order to get the result + * of the v2x authentication once finished. + * + * @param[out] req_status V2X authentication request status + * @param[out] power_state V2X power state + * + * @return Returns the V2X state. + * + * - Bit 0: v2x authentication request received + * - Bit 1: v2x provisioned successfully in normal mode + * - Bit 2: v2x provisioned successfully in debug mode + * - Bit 3: v2x authentication on going + * - Bit 4: v2x authentication success + * - Bit 5: v2x authentication failure + * - Bit 6: v2x crypto disabled + * - Bit 7: v2x hold enabled + * + * See the SECO API Reference Guide for more info. + */ +uint8_t SECO_V2X_GetState(uint32_t *req_status, uint8_t *power_state); + +/*! + * This function sets the V2X power state on SECO. If the request is successful, + * the V2X power state will be updated on SECO. Otherwise, the requested power state + * is not allowed and error will be reported via seco_err. + * + * @param[in] power_mode requested power mode + * @param[in] flags flags to pass to SECO + * @param[out] addr pointer to return FW address + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_Power(uint8_t power_mode, uint8_t flags, sc_saddr_t *addr); + + /*! + * This function will recover the V2X firmware after a power off. If the flag is + * V2X_RECOVER_AUTH, SECO will send a V2X authenticate request to V2X using the + * V2X container header from the last V2X authenticate request. + * + * @param[in] flags flags to pass to SECO + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_FW_Recovery(uint8_t flags); + + /*! + * This function will notify SECO that the V2X images used for the last V2X + * authentication have been/will be move to a new location given in parameter. + * If the request is successful SECO will use the new location of the images + * for V2X recovery. + * + * @param[in] addr new V2X FW address + * + * See the SECO API Reference Guide for more info. + */ +void SECO_V2X_Remap_FW(sc_saddr_t addr); + +/** @} */ + +#endif + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * This function is used to return the SECO FW build info. + * + * @param[out] version pointer to return build number + * @param[out] commit pointer to return commit ID (git SHA-1) + * @param[out] dirty pointer to return dirty flag + * + * See the SECO API Reference Guide for more info. + */ +void SECO_Version(uint32_t *version, uint32_t *commit, sc_bool_t *dirty); + +/*! + * This function is used to return SECO chip info. + * + * @param[out] lc pointer to return lifecycle + * @param[out] monotonic pointer to return monotonic counter + * @param[out] uid_l pointer to return UID (lower 32 bits) + * @param[out] uid_h pointer to return UID (upper 32 bits) + * + * See the SECO API Reference Guide for more info. + */ +void SECO_ChipInfo(uint16_t *lc, uint16_t *monotonic, + uint32_t *uid_l, uint32_t *uid_h); + +/*! + * This function notifies SECO that a JTAG connection has been made. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_AttachDebug(void); + +/*! + * This function securely enables debug. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_EnableDebug(sc_faddr_t addr); + +/*! + * This function is used to return an event from the SECO error log. + * + * @param[out] idx index of event to return + * + * @return Returns the event. + * + * Read of \a idx 0 captures events from SECO. Loop starting + * with 0 until an error is returned to dump all events. + * + * See the SECO API Reference Guide for more info. + */ +uint32_t SECO_GetEvent(uint8_t idx); + +/*! + * This function dumps low-level SECO debug info to the SCU debug + * UART. + */ +void SECO_DumpDebug(void); + +/*! + * This function return the internal SECO error number returned by + * the last SECO function call. It is valid if seco_err != SC_R_NONE. + * + * See the SECO API Reference Guide for a description of these + * internal error codes. + * + * @return Returns the error number. + */ +uint32_t SECO_ErrNumber(void); + +/** @} */ + +/*! + * @name Miscellaneous Functions + * @{ + */ + +/*! + * This function sends a ping to SECO. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_Ping(void); + +/*! + * This function sends a a message to SECO to service the + * 24H watchdog. SCFW sends this periodically. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_KickWdog(void); + +/*! + * This function writes a given fuse word index. + * + * @param[in] word fuse word index + * @param[in] val fuse write value + * + * The command is passed as is to SECO. SECO uses part of the + * \a word parameter to indicate if the fuse should be locked + * after programming. See the "Write common fuse" section of + * the SECO API Reference Guide for more info. + */ +void SECO_WriteFuse(uint32_t word, uint32_t val); + +/*! + * This function securely writes a group of fuse words. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_SecureWriteFuse(sc_faddr_t addr); + +/*! + * This function applies a patch. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_ScuPatch(sc_faddr_t addr); + +/*! + * This function starts the random number generator. + * + * @return Returns the state of RNG. + * + * The RNG is started automatically after all CPUs are booted. This + * function can be used to start earlier and to check the status. + * + * See the SECO API Reference Guide for more info. + */ +sc_seco_rng_stat_t SECO_StartRNG(void); + +/*! + * This function is used to send a generic signed message to the + * SECO SHE/HSM components. + * + * @param[in] addr address of message block + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_SABSignedMesg(sc_faddr_t addr); + +/** @} */ + +/*! + * @name SNVS Functions + * @{ + */ + +/*! + * This function write an SNVS parameter. + * + * @param[in] id ID of parameter to write + * @param[in] val value to write + * + * This function is used by the SNVS driver. Users should + * call that driver instead of this function. + * + * See the SECO API Reference Guide for more info. + */ +void SECO_WriteSNVS(seco_snvs_id_t id, uint32_t val); + +/*! + * This function reads an SNVS parameter. + * + * @param[in] id ID of parameter to read + * + * This function is used by the SNVS driver. Users should + * call that driver instead of this function. + * + * @return Returns the value read. + * + * See the SECO API Reference Guide for more info. + */ +uint32_t SECO_ReadSNVS(seco_snvs_id_t id); + +/*! + * This function is used to manage the SNVS. It allows reading and + * writing of various SNVS registers. + * + * @param[in] id ID of parameter to read + * @param[in] access Access type (read or write) + * @param[in,out] val pointer to value to read or write + * @param[in] size number of words to read or write + * + * For info on what the SNVS registers do, refer to the SNVS section + * of the SRM. + * + * Note many aspects of the SNVS are used by SECO and not available for + * use (e.g. LPGPR0) and this function will not allow access to those + * registers/fields. See the SECO API Reference Guide for more info. + */ +void SECO_ManageSNVS(uint8_t id, uint8_t access, uint32_t *val, uint8_t size); + +/*! + * This function is used to manage the SNVS DGO. It allows reading and + * writing of various privileged SNVS DGO registers. + * + * @param[in] id ID of parameter to read + * @param[in] access Access type (read or write) + * @param[in,out] val pointer to value to read or write + * + * For info on what the SNVS registers do, refer to the SNVS section + * of the SRM. + */ +void SECO_ManageSNVS_DGO(uint8_t id, uint8_t access, uint32_t *val); + +/** @} */ + +/* Externs */ + +/*! SECO error return */ +extern sc_err_t seco_err; + +#endif /* DRV_SECO_H */ + +/** @} */ + diff --git a/platform/drivers/seco/v2/Makefile b/platform/drivers/seco/v2/Makefile new file mode 100755 index 0000000..9159b55 --- /dev/null +++ b/platform/drivers/seco/v2/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/seco/v2/fsl_seco.o + +DIRS += $(OUT)/drivers/seco/v2 + diff --git a/platform/drivers/snvs/fsl_snvs.h b/platform/drivers/snvs/fsl_snvs.h new file mode 100755 index 0000000..b3eef1f --- /dev/null +++ b/platform/drivers/snvs/fsl_snvs.h @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_SNVS_H +#define DRV_SNVS_H + +/*! + * @addtogroup snvs_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +/*! + * @name Defines for snvs_btn_config_t + * + * Used to configure which feature of the button (BTN) input signal + * constitutes "active". + * + * BTN_CONFIG field in the SNVS_HP regsiter. See the SNVS section + * of the SRM. + */ +/** @{ */ +#define SNVS_DRV_BTN_CONFIG_ACTIVELOW 0U /*!< Button signal is active low */ +#define SNVS_DRV_BTN_CONFIG_ACTIVEHIGH 1U /*!< Button signal is active high */ +#define SNVS_DRV_BTN_CONFIG_RISINGEDGE 2U /*!< Button signal is active on the rising edge */ +#define SNVS_DRV_BTN_CONFIG_FALLINGEDGE 3U /*!< Button signal is active on the falling edge */ +#define SNVS_DRV_BTN_CONFIG_ANYEDGE 4U /*!< Button signal is active on any edge */ +/** @} */ + +/*! + * @name Defines for snvs_btn_on_time_t + * + * Used to configure the period of time after BTN is asserted before + * SoC power is turned on. + * + * ON_TIME field in the SNVS_LP regsiter. See the SNVS section + * of the SRM. + */ +/** @{ */ +#define SNVS_DRV_BTN_ON_50MS 0U /*!< 500 msec off->on transition time */ +#define SNVS_DRV_BTN_ON_100MS 1U /*!< 50 msec off->on transition time */ +#define SNVS_DRV_BTN_ON_500MS 2U /*!< 100 msec off->on transition time */ +#define SNVS_DRV_BTN_ON_0MS 3U /*!< 0 msec off->on transition time */ +/** @} */ + +/*! + * @name Defines for snvs_btn_debounce_t + * + * Use to configure the amount of debounce time for the BTN input signal. + * + * DEBOUNCE field in the SNVS_LP regsiter. See the SNVS section + * of the SRM. + */ +/** @{ */ +#define SNVS_DRV_BTN_DEBOUNCE_50MS 0U /*!< 50 msec debounce */ +#define SNVS_DRV_BTN_DEBOUNCE_100MS 1U /*!< 100 msec debounce */ +#define SNVS_DRV_BTN_DEBOUNCE_500MS 2U /*!< 500 msec debounce */ +#define SNVS_DRV_BTN_DEBOUNCE_0MS 3U /*!< 0 msec debounce */ +/** @} */ + +/*! + * @name Defines for snvs_btn_press_time_t + * + * Used to configure the button press time out values for the PMIC logic. + * + * BTN_PRESS_TIME field in the SNVS_LP regsiter. See the SNVS section + * of the SRM. + */ +/** @{ */ +#define SNVS_DRV_BTN_PRESS_5S 0U /*!< 5 secs */ +#define SNVS_DRV_BTN_PRESS_10S 1U /*!< 10 secs */ +#define SNVS_DRV_BTN_PRESS_15S 2U /*!< 15 secs */ +#define SNVS_DRV_BTN_PRESS_OFF 3U /*!< Long press disabled */ +/** @} */ + +/* Types */ + +/*! + * This type is used configure the button active state. + */ +typedef uint8_t snvs_btn_config_t; + +/*! + * This type is used configure the button on time. + */ +typedef uint8_t snvs_btn_on_time_t; + +/*! + * This type is used configure the button debounce time. + */ +typedef uint8_t snvs_btn_debounce_t; + +/*! + * This type is used configure the button press time. + */ +typedef uint8_t snvs_btn_press_time_t; + +/* SNVS Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * @brief Initialize SNVS driver. + * + * This function initializes the SNVS driver. + * + * @param phase init phase + */ +void SNVS_Init(boot_phase_t phase); + +/** @} */ + +/*! + * @name SRTC Functions + * @{ + */ + +/*! + * @brief Power off system. + * + * This function asserts the signal to the PMIC to force a power off. + */ +void SNVS_PowerOff(void); + +/*! + * @brief Set the secure RTC. + * + * This function sets the secure RTC. + * + * @param seconds time to set + */ +void SNVS_SetSecureRtc(uint32_t seconds); + +/*! + * @brief Get the secure RTC. + * + * This function returns the secure RTC time. + * + * @param seconds pointer to return seconds + */ +void SNVS_GetSecureRtc(uint32_t *seconds); + +/*! + * @brief Set the secure RTC calibration value. + * + * This function sets the secure RTC calibration value. + * See the SNVS section of the SRM for more info. + * + * @param count counts to add/subtract per 32768 ticks + */ +void SNVS_SetSecureRtcCalb(int8_t count); + +/*! + * @brief Get the secure RTC calibration value. + * + * This function returns the secure RTC calibration value. + * See the SNVS section of the SRM for more info. + * + * @param count pointer to return count + */ +void SNVS_GetSecureRtcCalb(int8_t *count); + +/*! + * @brief Set secure RTC alarm. + * + * This function sets the secure RTC alarm and enables it. + * + * @param seconds alarm to set + * + * If seconds=UINT32_MAX then disable alarm. + */ +void SNVS_SetSecureRtcAlarm(uint32_t seconds); + +/*! + * @brief Get secure RTC alarm. + * + * This function returns the secure RTC alarm. + * + * @param seconds pointer to return alarm + */ +void SNVS_GetSecureRtcAlarm(uint32_t *seconds); + +/*! + * @brief Set the RTC. + * + * This function sets the RTC. + * + * @param seconds time to set + */ +void SNVS_SetRtc(uint32_t seconds); + +/*! + * @brief Get the RTC. + * + * This function returns the RTC time. + * + * @param seconds pointer to return seconds + */ +void SNVS_GetRtc(uint32_t *seconds); + +/*! + * @brief Set the RTC calibration value. + * + * This function sets the RTC calibration value. + * See the SNVS section of the SRM for more info. + * + * @param count counts to add/subtract per 32768 ticks + */ +void SNVS_SetRtcCalb(int8_t count); + +/*! + * @brief Set RTC alarm. + * + * This function sets the RTC alarm and enables it. + * + * @param seconds alarm to set + * + * If seconds=UINT32_MAX then disable alarm. + */ +void SNVS_SetRtcAlarm(uint32_t seconds); + +/*! + * @brief Get RTC alarm. + * + * This function returns the RTC alarm. + * + * @param seconds pointer to return alarm + */ +void SNVS_GetRtcAlarm(uint32_t *seconds); + +/*! + * @brief Configure the ON/OFF button. + * + * This function configures the button detection and IRQ. + * See the SNVS section of the SRM for more info. + * + * @param config button configuration (see BTN_CONFIG in SRM) + * @param enable button IRQ enable (see BTN_MASK in SRM) + * + * For info on the arguments, see the SNVS section of the SRM. + */ +void SNVS_ConfigButton(snvs_btn_config_t config, sc_bool_t enable); + +/*! + * @brief Configure the ON/OFF button timing parameters. + * + * This function configures the button timing parameters. + * See the SNVS section of the SRM for more info. + * + * @param on button turn on time (see ON_TIME in SRM) + * @param debounce button debounce time (see DEBOUNCE in SRM) + * @param press button turn off time (see BTN_PRESS_TIME in SRM) + * + * For info on the arguments, see the SNVS section of the SRM. + */ +void SNVS_ButtonTime(snvs_btn_on_time_t on, snvs_btn_debounce_t debounce, + snvs_btn_press_time_t press); + +/*! + * @brief Get button status. + * + * This function returns the status of the button. + * See the SNVS section of the SRM for more info. BTN in HPSR. + * + * @return Returns the button status. + */ +sc_bool_t SNVS_GetButtonStatus(void); + +/*! + * @brief Clear button IRQ. + * + * This function clears a pending button IRQ. + */ +void SNVS_ClearButtonIRQ(void); + +/*! + * @brief Enter low power mode. + * + * This function prepares the SNVS for low power mode. It copies various data + * from the HP section to the LP section. + */ +void SNVS_EnterLPM(void); + +/*! + * @brief Exit low power mode. + * + * This function restores SNVS data from the LP section to the HP section. + */ +void SNVS_ExitLPM(void); + +/*! + * @brief Get the SNVS System Security Monitor State (SSM). + * + * This function returns the System Security Monitor State (SSM). + * See the SNVS section of the SRM for more info. SSM_ST in HPSR. + * + * @return Returns the state of the monitor. + */ +uint32_t SNVS_GetState(void); + +/*! + * @brief Enable SNVS Security Violation Interrupt. + * + * This function is used to re-enable the security violation interrupt. The + * interrupt is automatically masked when the interrupt occurs. + */ +void SNVS_SecurityViolation_Enable(void); + +/*! + * @brief SNVS security violation IRQ handler. + * + * This function is called when the security violation IRQ is asserted. It + * automatically masks the security violation interrupt which must then be + * re-enabled using SNVS_SecurityViolation_Enable(). + */ +void SNVS_SecurityViolation_IRQHandler(void); + +/*! + * @brief SNVS power off IRQ handler. + * + * This function is called when the power off IRQ is asserted. + */ +void SNVS_PowerOff_IRQHandler(void); + +/*! + * @brief Read a GP register. + * + * This function is called to read one of the four LPGPR[0-3]. Note that + * SECO and SCFW may use some of these so only a limited number may be available + * for cusotmer use. See the [Porting Guide](@ref PORT_SNVS). + * + * @param idx index of register to read (0-3) + * + * @return Returns the stored value. + */ +uint32_t SNVS_ReadGP(uint8_t idx); + +/*! + * @brief Write a GP register. + * + * @param idx index of register to write (0-3) + * @param val value to write + * + * This function is called write to one of the four LPGPR[0-3]. Note that + * SECO and SCFW may use some of these so only a limited number may be available + * for cusotmer use. See the [Porting Guide](@ref PORT_SNVS). + */ +void SNVS_WriteGP(uint8_t idx, uint32_t val); + +/*! + * @brief Manage security violation and tamper. + * + * @param id index of register(s) to access + * @param access read or write + * @param data0 value 0 to read or write + * @param data1 value 1 to read or write + * @param data2 value 2 to read or write + * @param data3 value 3 to read or write + * @param data4 value 4 to read or write + * @param size number of value to access + * + * Set dataX to NULL if not used. + * + * This function is called to read/write security violation and + * tamper registers. See the SECO API Reference Guide for more info. + */ +void SNVS_SecVio(uint8_t id, uint8_t access, uint32_t *data0, + uint32_t *data1, uint32_t *data2, uint32_t *data3, uint32_t *data4, + uint8_t size); + +/*! + * @brief Manage security violation and tamper of DGO. + * + * @param id index of register to access + * @param access read or write + * @param data value to read or write + * + * This function is called to read/write security violation and + * tamper DGO registers. See the SECO API Reference Guide for more info. + */ +void SNVS_SecVioDgo(uint8_t id, uint8_t access, uint32_t *data); + +#ifdef SIMU +/*! + * @brief Simulation function to increment time. + * + * @param secs seconds to increment + */ +void SNVS_IncTime(uint32_t secs); +#endif + +/* Externs */ + +/*! SNVS error return */ +extern sc_err_t snvs_err; + +/** @} */ + +#endif /* DRV_SNVS_H */ + +/** @} */ + diff --git a/platform/drivers/snvs/v2/Makefile b/platform/drivers/snvs/v2/Makefile new file mode 100755 index 0000000..3735cae --- /dev/null +++ b/platform/drivers/snvs/v2/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/snvs/v2/fsl_snvs.o + +DIRS += $(OUT)/drivers/snvs/v2 + diff --git a/platform/drivers/stc/Makefile b/platform/drivers/stc/Makefile new file mode 100755 index 0000000..c20428a --- /dev/null +++ b/platform/drivers/stc/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/stc/fsl_stc.o + +DIRS += $(OUT)/drivers/stc + diff --git a/platform/drivers/stc/fsl_stc.h b/platform/drivers/stc/fsl_stc.h new file mode 100755 index 0000000..a9b0f3d --- /dev/null +++ b/platform/drivers/stc/fsl_stc.h @@ -0,0 +1,121 @@ +/* + * Copyright 2017-2019 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef FSL_STC_H +#define FSL_STC_H + +#include "fsl_common.h" + +/*! + * @addtogroup stc_driver + * @{ + */ + +/*! @file*/ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/** @{ */ +/*! @brief STC driver version 2.2.1. */ +#define FSL_STC_DRIVER_VERSION (MAKE_VERSION(2, 2, 1)) +/** @} */ + +/*! @brief STC interleave mode. */ +typedef enum +{ + kSTC_Interleave4K = 0x0U, /*!< 4K interleave */ + kSTC_Interleave8K = 0x1U, /*!< 8K interleave */ + kSTC_Interleave16K = 0x2U, /*!< 16K interleave */ + kSTC_InterleaveNone = 0x3U, /*!< No interleave */ +} stc_interleave_mode_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +/*! + * @brief Set STC interleave. + */ +void STC_RIL_SetInterleave(STC_Type *base, stc_interleave_mode_t interleave); + +/*! + * @brief Set STC RCAT. + */ +void STC_RCAT_SetCategorization(STC_Type *base, uint8_t cat, uint32_t mask, + uint32_t compare); + +/*! + * @brief Set STC RCAT. + */ +void STC_RCAT_SetStartStopTDM(STC_Type *base, uint8_t cat, uint8_t tdm, + uint32_t start, uint32_t stop); + +/*! + * @brief Set STC RCAT. + */ +uint32_t STC_RCAT_GetHPR(const STC_Type *base, uint8_t cat); + +/*! + * @brief Set STC RCAT. + */ +void STC_RCAT_SetHPR(STC_Type *base, uint8_t cat, uint8_t hpr_qos_offset); + +/*! + * @brief Set STC panic QOS. + */ +void STC_QOS_Panic(STC_Type *base, uint8_t cat, uint8_t qos); + +/*! + * @brief Set STC UD disable. + */ +void STC_UD_DisableAll(STC_Type *base); + +/*! + * @brief Set STC UD enable threshold 1. + */ +void STC_UD_EnableThreshold1(STC_Type *base, uint8_t cat, uint8_t threshold, uint8_t qos); + +/*! + * @brief Set STC UD enable threshold 2. + */ +void STC_UD_EnableThreshold2(STC_Type *base, uint8_t cat, uint8_t threshold, uint8_t qos); + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_STC_H */ diff --git a/platform/drivers/sysctr/Makefile b/platform/drivers/sysctr/Makefile new file mode 100755 index 0000000..d3e4d0a --- /dev/null +++ b/platform/drivers/sysctr/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/sysctr/fsl_sysctr.o + +DIRS += $(OUT)/drivers/sysctr + diff --git a/platform/drivers/sysctr/fsl_sysctr.h b/platform/drivers/sysctr/fsl_sysctr.h new file mode 100755 index 0000000..ab661f1 --- /dev/null +++ b/platform/drivers/sysctr/fsl_sysctr.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_SYSCTR_H +#define DRV_SYSCTR_H + +/*! + * @addtogroup sysctr_driver + * @{ + */ + +/*! @file */ + +/* Includes */ +#include "fsl_device_registers.h" + +/* Defines */ +#define SYSCTR_CNTCV_MARGIN 50U + +/* SYSCTR counts at a rate of 8 MHz (125 nsec period). Conversions + to/from usec can be calculated using a shift: + + 1 tick = 1/8 usec --> ticks >> 3 = usec + 1 usec = 8 ticks --> usec << 3 = ticks +*/ +#define SYSCTR_TICKS_TO_USEC(ticks) ((ticks) >> 3U) +#define SYSCTR_USEC_TO_TICKS(usec) ((usec) << 3U) +#define SYSCTR_TICKS_TO_USEC64(ticks) (U64(ticks) >> 3ULL) +#define SYSCTR_USEC_TO_TICKS64(usec) (U64(usec) << 3ULL) + +/* Types */ + +/* Externs */ + +/* Functions */ + +/*! + * @name System Counter Functions + * @{ + */ + +/*! + * This function initializes and enables the system counter. + */ +void SYSCTR_Init(void); + +/*! + * This function returns the system counter value as a 64-bit clock + * cycle count. + * + * @return Returns the system counter value. + */ +uint64_t SYSCTR_GetCounter64(void); + +/*! + * This function returns the system counter value as a 32-bit clock + * cycle count. + * + * @return Returns the system counter value. + */ +uint32_t SYSCTR_GetCounter32(void); + +/*! + * This function returns the system counter time in uS. The return + * value is 64 bits. + * + * @return Returns the system counter value in uS. + */ +uint64_t SYSCTR_GetUsec64(void); + +/*! + * This function returns the system counter time in uS. The return + * value is 32 bits. + * + * @return Returns the system counter value in uS. + */ +uint32_t SYSCTR_GetUsec32(void); + +/*! + * This function delays the indicated number of uS. + * + * @param[in] usec number of microseconds to delay + */ +void SYSCTR_TimeDelay(uint32_t usec); + +/*! + * This function configures the frequency mode of the system + * counter. The system counter supports high-frequency (8 MHz) + * and low-frequency (32768 Hz) modes with a variable + * increment to maintain an effective 8 MHz counting rate. + * + * @param[in] bLowFreq flag to indicate low-frequency mode (SC_TRUE = low-frequency operation) + * @param[in] bWaitAck flag to wait for mode change (SC_TRUE = wait for mode change) + */ +void SYSCTR_FreqMode(sc_bool_t bLowFreq, sc_bool_t bWaitAck); + +/*! + * This function waits for a pending frequency mode change + * of the system counter. + * + * @param[in] bLowFreq flag to indicate low-frequency mode (SC_TRUE = low-frequency operation) + */ +void SYSCTR_FreqModeWaitAck(sc_bool_t bLowFreq); + +/*! + * This function configures the system counter compare frame0 + * to generate an IRQ (wake) event after the specified number of + * microseconds. + * + * @param[in] usec number of microseconds until wake event + */ +void SYSCTR_WakeEnable(uint32_t usec); + +/*! + * This function configures the system counter compare frame1 + * to generate an IRQ event after the specified number of + * system counter ticks. + * + * @param[in] usec number of system counter ticks until the event + */ +void SYSCTR_Compare1Enable(uint64_t ticks); + +/*! + * This function clears and disables the system counter compare frame1 + * IRQ event. + */ +void SYSCTR_Compare1Disable(void); + +/** @} */ + +#endif /* DRV_SYSCTR_H */ + +/** @} */ + diff --git a/platform/drivers/systick/Makefile b/platform/drivers/systick/Makefile new file mode 100755 index 0000000..225496d --- /dev/null +++ b/platform/drivers/systick/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/systick/fsl_systick.o + +DIRS += $(OUT)/drivers/systick + diff --git a/platform/drivers/systick/fsl_systick.h b/platform/drivers/systick/fsl_systick.h new file mode 100755 index 0000000..15db5a6 --- /dev/null +++ b/platform/drivers/systick/fsl_systick.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2019 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_SYSTICK_H +#define DRV_SYSTICK_H + +/*! + * @addtogroup systick_driver + * @{ + */ + +/*! @file */ + +/* Includes */ +#include "fsl_device_registers.h" +#include "fsl_clock.h" + +/* Defines */ +#define SYSTICK_TICKS_PER_USEC (SC_MCU_STARTUP_FREQ_MHZ) +#define SYSTICK_MAX_TICKS (SysTick_VAL_CURRENT_Msk) +#define SYSTICK_MAX_DELAY_USEC (50U*1000U) // 50 msec + +#if ((SYSTICK_MAX_DELAY_USEC*SYSTICK_TICKS_PER_USEC) > SYSTICK_MAX_TICKS) +#error "SYSTICK_MAX_DELAY_USEC exceeds SYSTICK_MAX_TICKS" +#endif + + +/* Types */ + + +/* Externs */ + + +/* Functions */ + + +/*! + * @name System Timer (SysTick) Functions + * @{ + */ + +void SYSTICK_Init(void); +void SYSTICK_CycleDelay(uint32_t cycles); +void SYSTICK_TimeDelay(uint32_t usec); +void SYSTICK_TimeDelayVar(uint32_t usec, uint32_t ticksPerUsec); +uint32_t SYSTICK_GetCounter32(void); +uint32_t SYSTICK_TickDiff32(uint32_t cntStart, uint32_t cntEnd); +uint32_t SYSTICK_NsecDiff(uint32_t cntStart, uint32_t cntEnd, uint32_t tickPsec); + + +/** @} */ + + +#endif /* DRV_SYSTICK_H */ + +/** @} */ + diff --git a/platform/drivers/v2x/Makefile b/platform/drivers/v2x/Makefile new file mode 100755 index 0000000..68a0737 --- /dev/null +++ b/platform/drivers/v2x/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/v2x/fsl_v2x.o + +DIRS += $(OUT)/drivers/v2x + diff --git a/platform/drivers/v2x/fsl_v2x.h b/platform/drivers/v2x/fsl_v2x.h new file mode 100755 index 0000000..0de8e33 --- /dev/null +++ b/platform/drivers/v2x/fsl_v2x.h @@ -0,0 +1,137 @@ +/* + * Copyright 2019-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_V2X_H +#define DRV_V2X_H + +/*! + * @addtogroup v2x_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +/*! + * @name Macros for version parsing + */ +/** @{ */ +#define V2X_PROD_VER(X) (((X) >> 16) & 0x7FFFUL) +#define V2X_MAJOR_VER(X) (((X) >> 4) & 0xFFFUL) +#define V2X_MINOR_VER(X) ((X) & 0xFUL) +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * This function initializes the V2X driver. + * + * Called when DB is powered up. + */ +void V2X_Init(void); + +/*! + * This function deinitializes the V2X driver. + * + * Called before DB is powered down. + */ +void V2X_Deinit(void); + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * This function is used to return the V2X FW build info. + * + * @param[out] version pointer to return build number + * @param[out] commit pointer to return commit ID (git SHA-1) + * @param[out] dirty pointer to return dirty flag + * + * See the SECO API Reference Guide for more info. + */ +void V2X_Version(uint32_t *version, uint32_t *commit, sc_bool_t *dirty); + +/*! + * This function dumps low-level V2X debug info to the SCU debug + * UART. + * + * @param[in] mask bit(0): logs from V2X primary core / bit(1): logs from secondary core + */ +void V2X_DumpDebug(uint32_t log_bitmap); +#define LOG_BITMAP_V2XP 0x1 +#define LOG_BITMAP_V2XS 0x2 + +/** @} */ + +/*! + * @name Miscellaneous Functions + * @{ + */ + +/*! + * This function sends a ping to V2X. + * + * See the V2X API Reference Guide for more info. + */ +void V2X_Ping(void); + +/*! + * @brief V2X MU IRQ handler. + * + * This function is called when the V2X SCU/DEBUG MU asserts an interrupt. + */ +void V2X_MU_IRQHandler(void); + +/** @} */ + +/* Externs */ + +/*! V2X error return */ +extern sc_err_t v2x_err; + +#endif /* DRV_V2X_H */ + +/** @} */ + diff --git a/platform/drivers/wdog32/Makefile b/platform/drivers/wdog32/Makefile new file mode 100755 index 0000000..59e6249 --- /dev/null +++ b/platform/drivers/wdog32/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/wdog32/fsl_wdog32.o + +DIRS += $(OUT)/drivers/wdog32 + diff --git a/platform/drivers/wdog32/fsl_wdog32.h b/platform/drivers/wdog32/fsl_wdog32.h new file mode 100755 index 0000000..1e385a7 --- /dev/null +++ b/platform/drivers/wdog32/fsl_wdog32.h @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_WDOG32_H_ +#define _FSL_WDOG32_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup wdog32 + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ +/*! @name Unlock sequence */ +/** @{ */ +#define WDOG_FIRST_WORD_OF_UNLOCK (WDOG_UPDATE_KEY & 0xFFFFU) /*!< First word of unlock sequence */ +#define WDOG_SECOND_WORD_OF_UNLOCK ((WDOG_UPDATE_KEY >> 16U) & 0xFFFFU) /*!< Second word of unlock sequence */ +/** @} */ + +/*! @name Refresh sequence */ +/** @{ */ +#define WDOG_FIRST_WORD_OF_REFRESH (WDOG_REFRESH_KEY & 0xFFFFU) /*!< First word of refresh sequence */ +#define WDOG_SECOND_WORD_OF_REFRESH ((WDOG_REFRESH_KEY >> 16U) & 0xFFFFU) /*!< Second word of refresh sequence */ +/** @} */ +/*! @name Driver version */ +/** @{ */ +/*! @brief WDOG32 driver version. */ +#define FSL_WDOG32_DRIVER_VERSION (MAKE_VERSION(2, 0, 3)) +/** @} */ + +/*! @brief Describes WDOG32 clock source. */ +typedef enum _wdog32_clock_source +{ + kWDOG32_ClockSource0 = 0U, /*!< Clock source 0 */ + kWDOG32_ClockSource1 = 1U, /*!< Clock source 1 */ + kWDOG32_ClockSource2 = 2U, /*!< Clock source 2 */ + kWDOG32_ClockSource3 = 3U, /*!< Clock source 3 */ +} wdog32_clock_source_t; + +/*! @brief Describes the selection of the clock prescaler. */ +typedef enum _wdog32_clock_prescaler +{ + kWDOG32_ClockPrescalerDivide1 = 0x0U, /*!< Divided by 1 */ + kWDOG32_ClockPrescalerDivide256 = 0x1U, /*!< Divided by 256 */ +} wdog32_clock_prescaler_t; + +/*! @brief Defines WDOG32 work mode. */ +typedef struct _wdog32_work_mode +{ + bool enableWait; /*!< Enables or disables WDOG32 in wait mode */ + bool enableStop; /*!< Enables or disables WDOG32 in stop mode */ + bool enableDebug; /*!< Enables or disables WDOG32 in debug mode */ +} wdog32_work_mode_t; + +/*! @brief Describes WDOG32 test mode. */ +typedef enum _wdog32_test_mode +{ + kWDOG32_TestModeDisabled = 0U, /*!< Test Mode disabled */ + kWDOG32_UserModeEnabled = 1U, /*!< User Mode enabled */ + kWDOG32_LowByteTest = 2U, /*!< Test Mode enabled, only low byte is used */ + kWDOG32_HighByteTest = 3U, /*!< Test Mode enabled, only high byte is used */ +} wdog32_test_mode_t; + +/*! @brief Describes WDOG32 configuration structure. */ +typedef struct _wdog32_config +{ + bool enableWdog32; /*!< Enables or disables WDOG32 */ + wdog32_clock_source_t clockSource; /*!< Clock source select */ + wdog32_clock_prescaler_t prescaler; /*!< Clock prescaler value */ + wdog32_work_mode_t workMode; /*!< Configures WDOG32 work mode in debug stop and wait mode */ + wdog32_test_mode_t testMode; /*!< Configures WDOG32 test mode */ + bool enableUpdate; /*!< Update write-once register enable */ + bool enableInterrupt; /*!< Enables or disables WDOG32 interrupt */ + bool enableWindowMode; /*!< Enables or disables WDOG32 window mode */ + uint16_t windowValue; /*!< Window value */ + uint16_t timeoutValue; /*!< Timeout value */ +} wdog32_config_t; + +/*! + * @brief WDOG32 interrupt configuration structure. + * + * This structure contains the settings for all of the WDOG32 interrupt configurations. + */ +enum _wdog32_interrupt_enable_t +{ + kWDOG32_InterruptEnable = WDOG_CS_INT_MASK, /*!< Interrupt is generated before forcing a reset */ +}; + +/*! + * @brief WDOG32 status flags. + * + * This structure contains the WDOG32 status flags for use in the WDOG32 functions. + */ +enum _wdog32_status_flags_t +{ + kWDOG32_RunningFlag = WDOG_CS_EN_MASK, /*!< Running flag, set when WDOG32 is enabled */ + kWDOG32_InterruptFlag = WDOG_CS_FLG_MASK, /*!< Interrupt flag, set when interrupt occurs */ +}; + +/******************************************************************************* + * API + *******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name WDOG32 Initialization and De-initialization + * @{ + */ + +/*! + * @brief Initializes the WDOG32 configuration structure. + * + * This function initializes the WDOG32 configuration structure to default values. The default + * values are: + * @code + * wdog32Config->enableWdog32 = true; + * wdog32Config->clockSource = kWDOG32_ClockSource1; + * wdog32Config->prescaler = kWDOG32_ClockPrescalerDivide1; + * wdog32Config->workMode.enableWait = true; + * wdog32Config->workMode.enableStop = false; + * wdog32Config->workMode.enableDebug = false; + * wdog32Config->testMode = kWDOG32_TestModeDisabled; + * wdog32Config->enableUpdate = true; + * wdog32Config->enableInterrupt = false; + * wdog32Config->enableWindowMode = false; + * wdog32Config->windowValue = 0U; + * wdog32Config->timeoutValue = 0xFFFFU; + * @endcode + * + * @param config Pointer to the WDOG32 configuration structure. + * @see wdog32_config_t + */ +void WDOG32_GetDefaultConfig(wdog32_config_t *config); + +/*! + * @brief Initializes the WDOG32 module. + * + * This function initializes the WDOG32. + * To reconfigure the WDOG32 without forcing a reset first, enableUpdate must be set to true + * in the configuration. + * + * Example: + * @code + * wdog32_config_t config; + * WDOG32_GetDefaultConfig(&config); + * config.timeoutValue = 0x7ffU; + * config.enableUpdate = true; + * WDOG32_Init(wdog_base,&config); + * @endcode + * + * @param base WDOG32 peripheral base address. + * @param config The configuration of the WDOG32. + */ +#if defined(DOXYGEN_OUTPUT) && DOXYGEN_OUTPUT +void WDOG32_Init(WDOG_Type *base, const wdog32_config_t *config); +#else +AT_QUICKACCESS_SECTION_CODE(void WDOG32_Init(WDOG_Type *base, const wdog32_config_t *config)); +#endif + +/*! + * @brief De-initializes the WDOG32 module. + * + * This function shuts down the WDOG32. + * Ensure that the WDOG_CS.UPDATE is 1, which means that the register update is enabled. + * + * @param base WDOG32 peripheral base address. + */ +void WDOG32_Deinit(WDOG_Type *base); + +/** @} */ + +/*! + * @name WDOG32 functional Operation + * @{ + */ + +/*! + * @brief Enables the WDOG32 module. + * + * This function writes a value into the WDOG_CS register to enable the WDOG32. + * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address. + */ +static inline void WDOG32_Enable(WDOG_Type *base) +{ + base->CS |= WDOG_CS_EN_MASK; +} + +/*! + * @brief Disables the WDOG32 module. + * + * This function writes a value into the WDOG_CS register to disable the WDOG32. + * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address + */ +static inline void WDOG32_Disable(WDOG_Type *base) +{ + base->CS &= ~WDOG_CS_EN_MASK; +} + +/*! + * @brief Enables the WDOG32 interrupt. + * + * This function writes a value into the WDOG_CS register to enable the WDOG32 interrupt. + * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address. + * @param mask The interrupts to enable. + * The parameter can be a combination of the following source if defined: + * @arg kWDOG32_InterruptEnable + */ +static inline void WDOG32_EnableInterrupts(WDOG_Type *base, uint32_t mask) +{ + base->CS |= mask; +} + +/*! + * @brief Disables the WDOG32 interrupt. + * + * This function writes a value into the WDOG_CS register to disable the WDOG32 interrupt. + * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address. + * @param mask The interrupts to disabled. + * The parameter can be a combination of the following source if defined: + * @arg kWDOG32_InterruptEnable + */ +static inline void WDOG32_DisableInterrupts(WDOG_Type *base, uint32_t mask) +{ + base->CS &= ~mask; +} + +/*! + * @brief Gets the WDOG32 all status flags. + * + * This function gets all status flags. + * + * Example to get the running flag: + * @code + * uint32_t status; + * status = WDOG32_GetStatusFlags(wdog_base) & kWDOG32_RunningFlag; + * @endcode + * @param base WDOG32 peripheral base address + * @return State of the status flag: asserted (true) or not-asserted (false). @see _wdog32_status_flags_t + * - true: related status flag has been set. + * - false: related status flag is not set. + */ +static inline uint32_t WDOG32_GetStatusFlags(WDOG_Type *base) +{ + return (base->CS & (WDOG_CS_EN_MASK | WDOG_CS_FLG_MASK)); +} + +/*! + * @brief Clears the WDOG32 flag. + * + * This function clears the WDOG32 status flag. + * + * Example to clear an interrupt flag: + * @code + * WDOG32_ClearStatusFlags(wdog_base,kWDOG32_InterruptFlag); + * @endcode + * @param base WDOG32 peripheral base address. + * @param mask The status flags to clear. + * The parameter can be any combination of the following values: + * @arg kWDOG32_InterruptFlag + */ + +#if defined(DOXYGEN_OUTPUT) && DOXYGEN_OUTPUT +void WDOG32_ClearStatusFlags(WDOG_Type *base, uint32_t mask); +#else +AT_QUICKACCESS_SECTION_CODE(void WDOG32_ClearStatusFlags(WDOG_Type *base, uint32_t mask)); +#endif + +/*! + * @brief Sets the WDOG32 timeout value. + * + * This function writes a timeout value into the WDOG_TOVAL register. + * The WDOG_TOVAL register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address + * @param timeoutCount WDOG32 timeout value, count of WDOG32 clock ticks. + */ +static inline void WDOG32_SetTimeoutValue(WDOG_Type *base, uint16_t timeoutCount) +{ + base->TOVAL = timeoutCount; +} + +/*! + * @brief Sets the WDOG32 window value. + * + * This function writes a window value into the WDOG_WIN register. + * The WDOG_WIN register is a write-once register. Ensure that the WCT window is still open and + * this register has not been written in this WCT while the function is called. + * + * @param base WDOG32 peripheral base address. + * @param windowValue WDOG32 window value. + */ +static inline void WDOG32_SetWindowValue(WDOG_Type *base, uint16_t windowValue) +{ + base->WIN = windowValue; +} + +/*! + * @brief Unlocks the WDOG32 register written. + * + * This function unlocks the WDOG32 register written. + * + * Before starting the unlock sequence and following the configuration, disable the global interrupts. + * Otherwise, an interrupt could effectively invalidate the unlock sequence and the WCT may expire. + * After the configuration finishes, re-enable the global interrupts. + * + * @param base WDOG32 peripheral base address + */ +static inline void WDOG32_Unlock(WDOG_Type *base) +{ + if (0U != ((base->CS) & WDOG_CS_CMD32EN_MASK)) + { + base->CNT = WDOG_UPDATE_KEY; + } + else + { + base->CNT = WDOG_FIRST_WORD_OF_UNLOCK; + base->CNT = WDOG_SECOND_WORD_OF_UNLOCK; + } +#ifdef WDOG_CS_ULK_MASK + /* Waited until for registers to be unlocked. */ + while (0U == ((base->CS) & WDOG_CS_ULK_MASK)) + { + ; + } +#endif /* WDOG_CS_ULK_MASK */ +} + +/*! + * @brief Refreshes the WDOG32 timer. + * + * This function feeds the WDOG32. + * This function should be called before the Watchdog timer is in timeout. Otherwise, a reset is asserted. + * + * @param base WDOG32 peripheral base address + */ +static inline void WDOG32_Refresh(WDOG_Type *base) +{ + uint32_t primaskValue = 0U; + + /* Disable the global interrupt to protect refresh sequence */ + primaskValue = DisableGlobalIRQ(); + if (0U != ((base->CS) & WDOG_CS_CMD32EN_MASK)) + { + base->CNT = WDOG_REFRESH_KEY; + } + else + { + base->CNT = WDOG_FIRST_WORD_OF_REFRESH; + base->CNT = WDOG_SECOND_WORD_OF_REFRESH; + } + EnableGlobalIRQ(primaskValue); +} + +/*! + * @brief Gets the WDOG32 counter value. + * + * This function gets the WDOG32 counter value. + * + * @param base WDOG32 peripheral base address. + * @return Current WDOG32 counter value. + */ +static inline uint16_t WDOG32_GetCounterValue(WDOG_Type *base) +{ + return (uint16_t)base->CNT; +} + +/** @} */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @}*/ + +#endif /* _FSL_WDOG32_H_ */ diff --git a/platform/drivers/xrdc2/Makefile b/platform/drivers/xrdc2/Makefile new file mode 100755 index 0000000..a89e9d5 --- /dev/null +++ b/platform/drivers/xrdc2/Makefile @@ -0,0 +1,5 @@ + +OBJS += $(OUT)/drivers/xrdc2/fsl_xrdc2.o + +DIRS += $(OUT)/drivers/xrdc2 + diff --git a/platform/drivers/xrdc2/fsl_xrdc2.h b/platform/drivers/xrdc2/fsl_xrdc2.h new file mode 100755 index 0000000..dfc878e --- /dev/null +++ b/platform/drivers/xrdc2/fsl_xrdc2.h @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2017-2020 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_XRDC2_H +#define DRV_XRDC2_H + +/*! + * @addtogroup xrdc2_driver + * @{ + */ + +/*! @file */ + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +#ifndef DEBUG + #define XRDC_PAC_CHECK(X, Y) NOP +#else + #define XRDC_PAC_CHECK(X, Y) XRDC_PacCheck((X), (Y)) +#endif + +#define XRDC_BASE_ADDR(X) ((XRDC2_Type*) (((sc_saddr_t) DSC_BASE_ADDR(X)) \ + + 0x10000U)) + +#define XRDC_MAX_DOMAINS 16U + +#define XRDC_MAX_PAC 8U +#define XRDC_MAX_PAC_SLOTS 256U +#define XRDC_MAX_MSC 128U +#define XRDC_MAX_MDAC 32U +#define XRDC_MAX_MDAC_SLOTS 32U +#define XRDC_MAX_MRC 32U +#define XRDC_MAX_MRC_SLOTS 32U + +#define XRDC_IDX_W 16U +#define XRDC_DID_W 4U +#define XRDC_SID_W 16U +#define XRDC_MATCH_W 16U +#define XRDC_DET_W 1U +#define XRDC_RMSG_W 4U +#define XRDC_NUM_W 8U + +/* Types */ + +typedef uint8_t xrdc_info_t; +typedef uint16_t xrdc_idx_t; +typedef uint8_t xrdc_did_t; +typedef uint16_t xrdc_match_t; +typedef uint8_t xrdc_det_t; +typedef uint8_t xrdc_rmsg_t; +typedef uint8_t xrdc_perm_t; + +/*! + * This type is used to store a XRDC SID value. + */ +typedef union +{ + uint16_t U; + struct + { + uint16_t SID : 6; + uint16_t CID : 4; + uint16_t RESERVED0 : 6; + } B; +} xrdc_sid_t; + +/*! + * This type is used to store info about a PAC. + */ +typedef struct +{ + uint32_t slot_en[XRDC_MAX_PAC_SLOTS/32]; //!< Slot enables + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain + sc_bool_t present : SC_BOOL_W; //!< Present +} xrdc_pac_info_t; + +/* XRDC Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +void XRDC_Init(sc_dsc_t dsc); +sc_bool_t XRDC_Config(sc_dsc_t dsc, sc_bool_t mst_enable, + sc_bool_t chk_enable); +void XRDC_GetConfig(sc_dsc_t dsc, sc_bool_t *mst_enable, + sc_bool_t *chk_enable); +void XRDC_Status(sc_dsc_t dsc, xrdc_did_t *did, xrdc_info_t *hrl, + xrdc_info_t *gclo); + +/** @} */ + +/*! + * @name MSC Functions + * @{ + */ + +void XRDC_GetMsc(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t *valid, + sc_bool_t *lock, xrdc_perm_t *perms); +void XRDC_SetMsc(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t valid, sc_bool_t lock, + const xrdc_perm_t *perms); +void XRDC_SetMultiMsc(sc_dsc_t dsc, xrdc_idx_t start, xrdc_idx_t num, + sc_bool_t valid, sc_bool_t lock, const xrdc_perm_t *perms); + +/** @} */ + +/*! + * @name MDAC Functions + * @{ + */ + +void XRDC_GetMda(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t *valid, sc_bool_t *lock, + sc_rm_spa_t *sa, sc_rm_spa_t *pa, xrdc_did_t *did, xrdc_sid_t *sid, + xrdc_match_t *match, xrdc_match_t *mask, sc_bool_t has_match, + const uint32_t *cache); +void XRDC_SetMda(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t valid, sc_bool_t lock, + sc_rm_spa_t sa, sc_rm_spa_t pa, xrdc_did_t did, xrdc_sid_t sid, + xrdc_match_t match, xrdc_match_t mask, sc_bool_t has_match, + uint32_t *cache); + +/** @} */ + +/*! + * @name PAC Functions + * @{ + */ + +void XRDC_GetPdac(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t *valid, + sc_bool_t *lock, xrdc_perm_t *perms); +void XRDC_SetPdac(sc_dsc_t dsc, xrdc_idx_t idx, sc_bool_t valid, + sc_bool_t lock, const xrdc_perm_t *perms, sc_bool_t no_update); +void XRDC_SetMultiPdac(sc_dsc_t dsc, xrdc_idx_t start, xrdc_idx_t num, + sc_bool_t valid, sc_bool_t lock, const xrdc_perm_t *perms, + sc_bool_t no_update); + +/** @} */ + +/*! + * @name MRC Functions + * @{ + */ + +void XRDC_GetMrc(sc_dsc_t dsc, xrdc_idx_t idx, sc_faddr_t *start, + sc_faddr_t *end, sc_bool_t *valid, sc_bool_t *lock, xrdc_perm_t *perms, + xrdc_det_t *det, xrdc_rmsg_t *rmsg, const uint32_t *cache); +void XRDC_SetMrc(sc_dsc_t dsc, xrdc_idx_t idx, sc_faddr_t start, + sc_faddr_t end, sc_bool_t valid, sc_bool_t lock, const xrdc_perm_t *perms, + xrdc_det_t det, xrdc_rmsg_t rmsg, uint32_t *cache); +void XRDC_InvalidateMrc(sc_dsc_t dsc, xrdc_idx_t idx, + xrdc_idx_t regions, uint32_t *cache); +sc_bool_t XRDC_FindMrc(sc_dsc_t dsc, xrdc_idx_t *idx, sc_faddr_t start, + sc_faddr_t end, xrdc_idx_t regions, uint32_t *cache); +sc_bool_t XRDC_UnusedMrc(sc_dsc_t dsc, xrdc_idx_t *idx, + xrdc_idx_t regions, uint32_t *cache); + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +#ifdef DEBUG +void XRDC_PacCheck(xrdc_idx_t num, const xrdc_pac_info_t *info); +#endif + +/** @} */ + +#endif /* DRV_XRDC2_H */ + +/** @} */ + diff --git a/platform/main/Makefile b/platform/main/Makefile new file mode 100755 index 0000000..99e841d --- /dev/null +++ b/platform/main/Makefile @@ -0,0 +1,30 @@ + +objs_main := main.o main_common.o boot.o + +ifeq ($(HW), SIMU) + objs_main += main_simu.o +endif + +ifndef NO_IPC + objs_main += rpc.o ipc_srv.o + + ifeq ($(HW), REAL) + objs_main += ipc.o + else + objs_main += ipc_simu.o + endif +endif + +ifeq ($(M),1) + objs_main += monitor.o +endif + +ifeq ($(EM),1) + objs_main += monitor.o +endif + +OBJS += \ + $(foreach object,$(objs_main),$(OUT)/main/$(object)) + +DIRS += $(OUT)/main + diff --git a/platform/main/board.h b/platform/main/board.h new file mode 100755 index 0000000..a1b9d82 --- /dev/null +++ b/platform/main/board.h @@ -0,0 +1,743 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the board API. + * + * @addtogroup BRD_SVC BRD: Board Interface + * + * Module for the Board interface. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_BOARD_API_H +#define SC_BOARD_API_H + +/* Defines */ + +#define BOARD_PARM_RTN_NOT_USED 0U /*!< Feature not used */ +#define BOARD_PARM_RTN_USED 1U /*!< Feature used */ + +#define BOARD_PARM_RTN_EXTERNAL 2U /*!< Return value for BOARD_PARM_PCIE_PLL */ +#define BOARD_PARM_RTN_INTERNAL 3U /*!< Return value for BOARD_PARM_PCIE_PLL */ +#define BOARD_PARM_RTN_INTERNAL_DPLL 4U /*!< Return value for BOARD_PARM_PCIE_PLL (DXL only) */ + +#define BOARD_PARM_RTN_DPLL_SS_0_5 5U /*!< 0.5% spread of PCIE DPLL frequency. */ +#define BOARD_PARM_RTN_DPLL_SS_1 10U /*!< 1% spread of PCIE DPLL frequency. */ +#define BOARD_PARM_RTN_DPLL_SS_1_5 15U /*!< 1.5% spread of PCIE DPLL frequency. */ +#define BOARD_PARM_RTN_DPLL_SS_2 20U /*!< 2% spread of PCIE DPLL frequency. */ + +#define BOARD_PARM_RTN_VDD_MEMC_NOM 0U /*!< MEMC Nominal */ +#define BOARD_PARM_RTN_VDD_MEMC_OD 1U /*!< MEMC Overdrive */ + +#define BOARD_PARM_KS1_RETENTION_DISABLE 0U /*!< Disable retention during KS1 */ +#define BOARD_PARM_KS1_RETENTION_ENABLE 1U /*!< Enable retention during KS1 */ + +#define BOARD_PARM_KS1_ONOFF_WAKE_DISABLE 0U /*!< Disable ONOFF wakeup during KS1 */ +#define BOARD_PARM_KS1_ONOFF_WAKE_ENABLE 1U /*!< Enable ONOFF wakeup during KS1 */ + +#define BOARD_PARM_KS1_WDOG_WAKE_ENABLE 0U /*!< Enable SC WDOG service during KS1 (required for ON_OFF wakeup on some devices) */ +#define BOARD_PARM_KS1_WDOG_WAKE_DISABLE 1U /*!< Disable SC WDOG service during KS1 (SC WDOG disabled during KS1) */ + +/*--------------------------------------------------------------------------*/ +/* Board PLL spread spectrum fspread in part per thousand */ +/* Supported values - 0.4% (4), 1.0% (10), 1.4% (14), 2.0% (20) */ +/*--------------------------------------------------------------------------*/ +#define BOARD_PARM_SSC_N_0P4 4U /*!< Return 0.4% fspread for PLL spread spectrum */ +#define BOARD_PARM_SSC_N_1P0 10U /*!< Return 1.0% fspread for PLL spread spectrum */ +#define BOARD_PARM_SSC_N_1P4 14U /*!< Return 1.4% fspread for PLL spread spectrum */ +#define BOARD_PARM_SSC_N_2P0 20U /*!< Return 2.0% fspread for PLL spread spectrum */ + +/* Types */ + +/*! + * Board config parameter types. + */ +typedef enum +{ + BOARD_PARM_PCIE_PLL = 0, /*!< PCIe PLL internal or external */ + BOARD_PARM_KS1_RESUME_USEC = 1, /*!< Supply ramp delay in usec for KS1 exit */ + BOARD_PARM_KS1_RETENTION = 2, /*!< Controls if retention is applied during KS1 */ + BOARD_PARM_KS1_ONOFF_WAKE = 3, /*!< Controls if ONOFF button can wake from KS1 */ + BOARD_PARM_REBOOT_TIME = 4, /*!< Partition reboot timeout in mS */ + BOARD_PARM_DC0_PLL0_SSC = 5, /*!< DC0 PLL0 spread spectrum config */ + BOARD_PARM_DC0_PLL1_SSC = 6, /*!< DC0 PLL1 spread spectrum config */ + BOARD_PARM_DC1_PLL0_SSC = 7, /*!< DC1 PLL0 spread spectrum config */ + BOARD_PARM_DC1_PLL1_SSC = 8, /*!< DC1 PLL1 spread spectrum config */ + BOARD_PARM_ISI_PIX_FREQ = 9, /*!< ISI pixel clock frequency override */ + BOARD_PARM_VDD_MEMC = 10, /*!< VDD_MEMC voltage, valid only for DXL */ + BOARD_PARM_KS1_WDOG_WAKE = 11, /*!< Controls if SC WDOG configuration during KS1 */ + BOARD_PARM_PCIE_DPLL_SS = 12 /*!< Spread Spectrum SPREAD value for PCIE DPLL (DXL ONLY) */ +} board_parm_t; + +/*! + * Board fault types. + */ +typedef enum +{ + BOARD_BFAULT_COMMON = 0, /*!< Common fault handler */ + BOARD_BFAULT_CPU = 1, /*!< Cortex-M ECC or lockup error */ + BOARD_BFAULT_EXIT = 2, /*!< SCFW exit */ + BOARD_BFAULT_DDR_RET = 3, /*!< DDR retention request without configuration */ + BOARD_BFAULT_REBOOT = 4, /*!< Undetermined partition reboot failure */ + BOARD_BFAULT_BAD_CONTAINER = 5, /*!< Bad boot container, invalid partitions/images */ + BOARD_BFAULT_BRD_FAIL = 6, /*!< Board failure - RM or PMIC, etc. */ + BOARD_BFAULT_TEST_FAIL = 7, /*!< Unit test failure, exit */ + BOARD_BFAULT_DDR_INIT_FAIL = 8 /*!< board_init_ddr() returned an error */ +} sc_bfault_t; + +/*! + * Board reboot timeout actions. + */ +typedef enum +{ + BOARD_REBOOT_TO_NONE = 0, /*!< Reboot timeout does nothing */ + BOARD_REBOOT_TO_FORCE = 1, /*!< Reboot timeout forces reboot continue */ + BOARD_REBOOT_TO_FAULT = 2 /*!< Reboot timeout causes board fault */ +} board_reboot_to_t; + +/*! + * Board config parameter returns. + */ +typedef uint32_t board_parm_rtn_t; + +/*! + * Board reset event types for CPUs. + */ +typedef enum +{ + BOARD_CPU_RESET_SELF = 0, /*!< Self requested reset */ + BOARD_CPU_RESET_WDOG = 1, /*!< Watchdog reset */ + BOARD_CPU_RESET_LOCKUP = 2, /*!< Lockup reset */ + BOARD_CPU_RESET_MEM_ERR = 3 /*!< Memory error reset */ +} board_cpu_rst_ev_t; + +/*! + * DDR actions (power state transitions, etc.) + */ +typedef enum +{ + BOARD_DDR_COLD_INIT = 0, /*!< Init DDR from POR */ + BOARD_DDR_PERIODIC = 1, /*!< Run periodic training */ + BOARD_DDR_SR_DRC_ON_ENTER = 2, /*!< Enter self-refresh (leave DRC on) */ + BOARD_DDR_SR_DRC_ON_EXIT = 3, /*!< Exit self-refresh (DRC was on) */ + BOARD_DDR_SR_DRC_OFF_ENTER = 4, /*!< Enter self-refresh (turn off DRC) */ + BOARD_DDR_SR_DRC_OFF_EXIT = 5, /*!< Exit self-refresh (DRC was off) */ + BOARD_DDR_PERIODIC_HALT = 6, /*!< Halt periodic training */ + BOARD_DDR_PERIODIC_RESTART = 7, /*!< Restart periodic training */ + BOARD_DDR_DERATE_PERIODIC = 8, /*!< Run periodic derate */ + BOARD_DDR0_VREF = 9, /*!< Run VREF training for DRC 0 */ + BOARD_DDR1_VREF = 10 /*!< Run VREF training for DRC 1 */ +} board_ddr_action_t; + +/* Macros */ + +/*! + * @name Macros for DCD processing + */ +/** @{ */ +#define DATA4(A, V) *((volatile uint32_t*)(A)) = U32(V) +#define SET_BIT4(A, V) *((volatile uint32_t*)(A)) |= U32(V) +#define CLR_BIT4(A, V) *((volatile uint32_t*)(A)) &= ~(U32(V)) +#define CHECK_BITS_SET4(A, M) while((*((volatile uint32_t*)(A)) \ + & U32(M)) != ((uint32_t)(M))){} +#define CHECK_BITS_CLR4(A, M) while((*((volatile uint32_t*)(A)) \ + & U32(M)) != U32(0U)){} +#define CHECK_ANY_BIT_SET4(A, M) while((*((volatile uint32_t*)(A)) \ + & U32(M)) == U32(0U)){} +#define CHECK_ANY_BIT_CLR4(A, M) while((*((volatile uint32_t*)(A)) \ + & U32(M)) == U32(M)){} +/** @} */ + +/*! + * Macro for debug of board calls + */ +#define BRD_ERR(X) /* Call function */ \ + err = (X); \ + /* Check error returned */ \ + if (err != SC_ERR_NONE) \ + { \ + /* Print line number */ \ + board_print(3, "error @ line %d: %d\n", \ + __LINE__, err); \ + /* Call board function to handle */ \ + board_fault(SC_FALSE, \ + BOARD_BFAULT_BRD_FAIL, SC_PT); \ + } + +#if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + /*! + * Macro for naming partitions + */ + #define PARTITION_NAME(PT, NAME) \ + rm_part_names[PT] = NAME +#else + /*! + * Macro for naming partitions + */ + #define PARTITION_NAME(PT, NAME) \ + NOP +#endif + +/* Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * This function initalizes the board. + * + * @param[in] phase boot phase + * + * There are seven phases to board initialization. The first phase is system + * init (\a phase = BOOT_PHASE_SYS_INIT). This happens before any HW access is + * possible. The second phase is the API phase (\a phase = BOOT_PHASE_API_INIT) + * and initializes all of the board interface data structures. The third phase + * (\a phase = BOOT_PHASE_HW_INIT) is the HW phase and this initializes + * the board hardware. The fourth phase (\a phase = BOOT_PHASE_EARLY_INIT) + * is just before starting early CPU. The fifth phase (\a phase = + * BOOT_PHASE_LATE_INIT) is just before starting the remaining CPUs. + * The sixth phase (\a phase = BOOT_PHASE_FINAL_INIT) is the final boot + * phase and is used to wrap up any needed init. A test phase (\a phase = + * BOOT_PHASE_TEST_INIT) is called only when an SCFW image is built with + * unit tests and is called just before any tests are run. + */ +void board_init(boot_phase_t phase); + +/*! + * This function returns the debug UART info. + * + * @param[in] inst UART instance + * @param[in] baud UART baud rate + * + * @return Pointer to the debug UART type. + */ +LPUART_Type *board_get_debug_uart(uint8_t *inst, uint32_t *baud); + +/*! + * This function initalizes the debug UART. + * + * @param[in] early_phase flag indicating phase + */ +void board_config_debug_uart(sc_bool_t early_phase); + +/*! + * This function powers off the debug UART. + * + * Only called when rebooting a partition. Only needs to power + * down the UART if it isn't the dedicated SCU UART. + * board_get_debug_uart() will be called again after the reboot + * completes. + */ +void board_disable_debug_uart(void); + +/*! + * This function configures SCU resources. + * + * @param[in] pt_sc SCU partition + * + * By default, the SCFW keeps most of the resources found in the SCU + * subsystem. It also keeps the SCU/PMIC pads required for the main + * code to function. Any additional resources or pads required for + * the board code to run should be kept here. This is done by marking + * them as not movable. + */ +void board_config_sc(sc_rm_pt_t pt_sc); + +/*! + * This function returns board configuration info. + * + * @param[in] parm parameter to return + * + * This function is used to return board configuration info. Parameters + * define if various how various SoC connections are made at the + * board-level. For example, the external PCIe clock input. + * + * Note this can be called at any time in the boot process. If a return + * value is based on run-time detection (for example reading a GPIO) + * great care must be take to insure the return value is correct and + * that infrastructure is powered to allow this. + * + * See example code (board.c) for parameter/returns options. + * + * @return Returns the paramter value. + */ +board_parm_rtn_t board_parameter(board_parm_t parm); + +/*! + * This function returns resource availability info. + * + * @param[in] rsrc resource to check + * + * This function is used to return board configuration info. It reports + * if resources are functional on this board. For example, which DDR + * controllers are used. + * + * See example code (board.c) for more details. + * + * @return Returns SC_TRUE if available. + */ +sc_bool_t board_rsrc_avail(sc_rsrc_t rsrc); + +/*! + * This function initalizes DDR. + * + * @param[in] early phase of init + * @param[in] ddr_initialized True if ROM initialized the DDR + * + * This function may be called twice. The early parameter is SC_TRUE when + * called prior to MCU start and SC_FALSE when called after. This + * allows the implementation to decide when DDR init needs to be + * done. + * + * Note the first call will not occur unless SC_BD_FLAGS_EARLY_CPU_START + * is set in bd_flags of the boot container. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t board_init_ddr(sc_bool_t early, sc_bool_t ddr_initialized); + +/*! + * This function cinfigures the DDR. + * + * @param[in] rom_caller is ROM the caller? + * @param[in] action perform this action on DDR + * + * @return Returns SC_ERR_NONE if successful. + * + * This function may be called from the ROM (\a rom_caller = SC_TRUE). In + * this case, the SCFW startup has not yet run and it is not valid to call + * most SCFW function calls. ANA_WRITE() and SYSCTR_TimeDelay() + * are the only two functions that have are safe to call. + */ +sc_err_t board_ddr_config(bool rom_caller, board_ddr_action_t action); + +/*! + * This function allows the board file to do SCFW configuration. + * + * @param[in] early phase of init + * @param[in] pt_boot boot partition + * + * This function may be called twice. The early parameter is SC_TRUE when + * called prior to MCU start and SC_FALSE when called after. This allows + * the implementation to decide when to do configuration processing. + * + * Note the first call will not occur unless SC_BD_FLAGS_EARLY_CPU_START + * is set in bd_flags of the boot container. + * + * Typical actions here include creating a resource partition for an MCU, + * powering up a board component, or configuring a shared clock. + */ +void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot); + +/*! + * This function returns SC_TRUE for early CPUs. + * + * @param[in] cpu CPU + * + * This function should return SC_TRUE if the CPU in question may + * be started early. This early start is before power on of later + * CPU subsystems. It would normally return SC_TRUE for MCU cores that + * need to run early. Only SC_R_MCU_0_PID0 and SC_R_MCU_1_PID0 can + * return SC_TRUE. + * + * Note CPUs will only get started early if SC_BD_FLAGS_EARLY_CPU_START + * is set in bd_flags of the boot container. + * + * @return Returns SC_TRUE if CPU should start early. + */ +sc_bool_t board_early_cpu(sc_rsrc_t cpu); + +/*! + * Function to override QoS configuration. + * + * @param[in] ss subsystem with QoS controls + */ +void board_qos_config(sc_sub_t ss); + +/** @} */ + +/*! + * @name Power Functions + * @{ + */ + +/*! + * This function transitions the power state for an external board- + * level supply which goes to the i.MX8. + * + * @param[in] ss subsystem using supply + * @param[in] pd power domain + * @param[in] from_mode power mode transitioning from + * @param[in] to_mode power mode transitioning to + * + * This function is used to transition a board power supply that is + * used by the SoC. It allows mapping of subsystem power domains + * to board supplies. + * + * Note that the base code will enable/disable isolators after + * changing the state of internal power domains. External supplies + * sometimes supply a domain connected via an isolator to a domain + * passed here. In this case, this function needs to also control the + * connected domain's supply. For example, when LVDS SS PD (PD1) is + * powered toggled, the external supply for the LVDS PHY must be + * toggled here. MIPI and CSI SS PD are similar. + */ +void board_set_power_mode(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); + +/*! + * This function sets the voltage for a PMIC controlled SS. + * + * @param[in] ss subsystem + * @param[in] new_volt voltage value to be set + * @param[in] old_volt current voltage + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t board_set_voltage(sc_sub_t ss, uint32_t new_volt, uint32_t old_volt); + +/*! + * This function is used to set power supplies of the board when + * entering and exiting low power mode. + * + * @param[in] mode power mode to apply + * + * Note this function is not called by sc_pm_set_sys_power_mode(). + * It is called when the system dynamically transitions power modes + * during run-time execution. It is normally used to manage the + * supply for the memories (MEMC). + */ +void board_lpm(sc_pm_power_mode_t mode); + +/*! + * This function transitions the power state for an external board- + * level supply which goes to a board component. + * + * @param[in] idx board-relative resource index + * @param[in] rsrc_idx unified resource index + * @param[in] from_mode power mode transitioning from + * @param[in] to_mode power mode transitioning to + * + * This function is used to transition a board power supply that is + * used by a board component. It allows mapping of board resources + * (e.g. SC_R_BOARD_R0) to board supplies. + * + * \a idx should be used to identify the resource. It is 0-n and is + * associated with the board reosurces PMIC_0 through BOARD_R7. + * + * \a rsrc_idx is only useful for debug output of a resource name. + */ +void board_trans_resource_power(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, + sc_pm_power_mode_t from_mode,sc_pm_power_mode_t to_mode); + +/*! + * This function resets a board resource. + * + * @param[in] idx board-relative resource index + * @param[in] rsrc_idx unified resource index + * @param[in] pt partition + * + * This function is used to reset resource. If pt equals SC_PT_ALL + * then reset all resources belonging to that partition. Otherwise, + * reset rsrc_idx only. + * + * It is only called when a partition is rebooted or when the + * sc_pm_resource_reset() function is called. Is is usually empty + * unless a resource can't be powered off but can be soft reset. + * + * \a idx should be used to identify the resource. It is 0-n and is + * associated with the board reosurces PMIC_0 through BOARD_R7. + * + * \a rsrc_idx is only useful for debug output of a resource name. + */ +void board_rsrc_reset(sc_rm_idx_t idx, sc_rm_idx_t rsrc_idx, sc_rm_pt_t pt); + +/** @} */ + +/*! + * @name Misc Functions + * @{ + */ + +/*! + * This function is used to set the board power. + * + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid mode + * + * This function is only called by sc_pm_set_sys_power_mode(). + * It is normally used ask the PMIC to power off the board + * completly. + */ +sc_err_t board_power(sc_pm_power_mode_t mode); + +/*! + * This function is used to reset the system. + * + * @param[in] type reset type + * @param[in] reason cause of reset + * @param[in] pt partition causing reset + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid type + * + * If this function returns, then the reset did not occur due to an + * invalid parameter. + */ +sc_err_t board_reset(sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_rm_pt_t pt); + +/*! + * This function is called when a CPU encounters a reset + * event. + * + * @param[in] resource CPU resource + * @param[in] reset_event CPU reset event + * @param[in] pt partition of CPU + */ +void board_cpu_reset(sc_rsrc_t resource, board_cpu_rst_ev_t reset_event, + sc_rm_pt_t pt); + +/*! + * This function is called when a partition reboot is requested. It allows + * the port to override the parameters or take other action such as logging + * or reboot the board. + * + * @param[in] pt partition being rebooted + * @param[in,out] type pointer to modify reset type + * @param[in,out] reason pointer to modify reset reason + * @param[in,out] mode pointer to modify power cycle mode + * @param[out] mask pointer to return mask of wait partitions + * + * Code can modify or log the parameters. Can also take another action like + * reset the board. After return from this function, the partition will be + * rebooted. + * + * Type is cold, warm, board. Reason is SW, WDOG, etc. Reboot is accomplished + * by reducing power and reapplying. Mode indicates the power level to reduce + * to (usually off). + * + * If \a mask is non-0 mask, then the reboot will be delayed until all + * partitions indicated in the mask (pt 1 = bit 1, etc.) have called + * sc_pm_reboot_continue() to continue the boot. + */ +void board_reboot_part(sc_rm_pt_t pt, sc_pm_reset_type_t *type, + sc_pm_reset_reason_t *reason, sc_pm_power_mode_t *mode, + uint32_t *mask); + +/*! + * This function is called when a partition reboot is has powered off the + * partition but has not yet powered it back on. It allows the boot parameters + * to be changed. Could also bracket a change done in board_reboot_part(). + * + * @param[in] pt partition being rebooted + * @param[in,out] boot_cpu pointer to modify the boot CPU + * @param[in,out] boot_mu pointer to modify the boot MU + * @param[in,out] boot_dev pointer to modify the boot device + * @param[in,out] boot_addr pointer to modify the boot address + * + */ +void board_reboot_part_cont(sc_rm_pt_t pt, sc_rsrc_t *boot_cpu, + sc_rsrc_t *boot_mu, sc_rsrc_t *boot_dev, sc_faddr_t *boot_addr); + +/*! + * This function is called when a partition reboot times out. + * + * @param[in] pt partition being rebooted + * + * @return Returns the desired action. + */ +board_reboot_to_t board_reboot_timeout(sc_rm_pt_t pt); + +/*! + * This function is called when a SS (other than SCU) reports a + * panic temp alarm. + * + * @param[in] dsc dsc reporting alarm + * + * Note this function would normally request a board reset. + * + * See the Porting Guide for more information. + */ +void board_panic(sc_dsc_t dsc); + +/*! + * This function is called when a fault is detected or the SCFW + * returns from main(). + * + * @param[in] restarted SC_TRUE if called on restart + * @param[in] reason reason for the fault + * @param[in] pt partition causing fault + * + * Note this function would normally request a board reset. For + * debug builds it is common to disable the watchdog and loop. + * + * The \a restarted paramter is SC_TRUE if this error is pending from + * the last restart. + */ +void board_fault(sc_bool_t restarted, sc_bfault_t reason, + sc_rm_pt_t pt); + +/*! + * This function is called when a security violation is reported by + * the SECO or SNVS. + * + * Note this function would normally request a board reset. For + * debug builds it is common to do nothing. + */ +void board_security_violation(void); + +/*! + * This function is used to return the current status of the ON/OFF + * button. + * + * @return Returns the status + */ +sc_bool_t board_get_button_status(void); + +/*! + * This function sets a miscellaneous control value. + * + * @param[in] resource resource + * @param[in] idx board resource index + * @param[in] rsrc_idx unified resource index + * @param[in] ctrl control to write + * @param[in] val value to write + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Note this function can be used to set voltages for both SoC + * resources and board resources (e.g. SC_R_BOARD_R0). + */ +sc_err_t board_set_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t val); + +/*! + * This function gets a miscellaneous control value. + * + * @param[in] resource resource + * @param[in] idx board resource index + * @param[in] rsrc_idx unified resource index + * @param[in] ctrl control to read + * @param[out] val pointer to return value + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t board_get_control(sc_rsrc_t resource, sc_rm_idx_t idx, + sc_rm_idx_t rsrc_idx, uint32_t ctrl, uint32_t *val); + +/*! + * This function is called periodically to tick the board. + * + * @param[in] msec number of mS to increment + * + * Can be used to implement customer watchdogs, monitor some + * hardware, etc. + */ +void board_tick(uint16_t msec); + +/*! + * This function is called when sc_misc_board_ioctl() is called. + * + * @param[in] caller_pt handle of caller partition + * @param[in] mu receiving MU via RPC/IPC + * @param[in,out] parm1 pointer to pass parameter 1 + * @param[in,out] parm2 pointer to pass parameter 2 + * @param[in,out] parm3 pointer to pass parameter 3 + * + * Can be used to implement customer watchdogs, monitor some + * hardware, etc. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t board_ioctl(sc_rm_pt_t caller_pt, sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3); + +/*! + * Interrupt handler for the PMIC. + */ +void PMIC_IRQHandler(void); + +/*! + * Interrupt handler for the SNVS button. + */ +void SNVS_Button_IRQHandler(void); + +/** @} */ + +/* Externs */ + +/*! + * External variable for accessing the number of board resources. + */ +extern const sc_rm_idx_t board_num_rsrc; + +/*! + * External variable for accessing the board resource map. + */ +extern const sc_rsrc_map_t board_rsrc_map[BRD_NUM_RSRC_BRD]; + +/*! + * External variable for specing DDR periodic training. + */ +extern const uint32_t board_ddr_period_ms; + +/*! + * External variable for DDR periodic derate. + */ +extern const uint32_t board_ddr_derate_period_ms; + +#endif /* SC_BOARD_API_H */ + +/** \example board.c + * This is an example implementation for the i.MX8QM MEK board. + */ + +/** @} */ + diff --git a/platform/main/boot.h b/platform/main/boot.h new file mode 100755 index 0000000..d3deaaa --- /dev/null +++ b/platform/main/boot.h @@ -0,0 +1,295 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for interaction with the ROM. + */ +/*==========================================================================*/ + +#ifndef SC_BOOT_H +#define SC_BOOT_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +#define SC_BOOT_DATA_BARKER 0xC0FFEE16U +#define SC_BOOT_DATA_VER 0x01U + +#define SC_IMG_TYPE_EXEC 0x03U /* Executable image type */ +#define SC_IMG_TYPE_DATA 0x04U /* Data image type */ +#define SC_IMG_TYPE_DDR_INIT 0x05U /* DDR init image type */ +#define SC_IMG_TYPE_SECO 0x06U /* SECO image type */ +#define SC_IMG_TYPE_PROVSN 0x07U /* Provisioning image type */ +#define SC_IMG_TYPE_DEK 0x08U /* DEK image type */ +#define SC_IMG_TYPE_V2X_PRI_FW 0x0BU /* Primary V2X FW */ +#define SC_IMG_TYPE_V2X_SND_FW 0x0CU /* Secondary V2X FW */ +#define SC_IMG_TYPE_V2X_PATCH 0x0DU /* V2X patch */ +#define SC_IMG_TYPE_V2X_DUMMY 0x0EU /* A dummy image entity in SCU CTNR, provides loading space */ +#define SC_IMG_TYPE_DEBUG 0x10U /* Signed debug enable message */ +#define SC_IMG_TYPE_SECFUSE 0x11U /* Signed secure fuse message */ +#define SC_IMG_TYPE_RETURN 0x12U /* Signed field return message */ +#define SC_IMG_TYPE_PATCH 0x13U /* Signed patch message */ +#define SC_IMG_TYPE_FIPSZERO 0x14U /* FIPS zero message */ +#define SC_IMG_TYPE_ALL 0xFFU /* All images */ + +#define SC_BD_FLAGS_NOT_SECURE 16U +#define SC_BD_FLAGS_NOT_ISOLATED 17U +#define SC_BD_FLAGS_RESTRICTED 18U +#define SC_BD_FLAGS_GRANT 19U +#define SC_BD_FLAGS_NOT_COHERENT 20U +#define SC_BD_FLAGS_ALT_CONFIG 21U +#define SC_BD_FLAGS_EARLY_CPU_START 22U +#define SC_BD_FLAGS_DDRTEST 23U +#define SC_BD_FLAGS_NO_AP 24U +#define SC_BD_FLAGS_ALT_CONFIG2 25U + +/* Types */ + +/*! + * This type is used to indicate boot type. + */ +typedef enum +{ + SC_BT_TYPE_PRIMARY = 1, + SC_BT_TYPE_SECONDARY = 2, + SC_BT_TYPE_RECOVERY = 3, + SC_BT_TYPE_SERIAL = 0xFF +} sc_bt_type_t; + +/*! + * This type is used to indicate boot device. + */ +typedef enum +{ + SC_BT_DEV_TYPE_SD = 1, + SC_BT_DEV_TYPE_MMC = 2, + SC_BT_DEV_TYPE_NAND = 3, + SC_BT_DEV_TYPE_FLEXSPINOR = 4, + SC_BT_DEV_TYPE_SATA_DISK = 7, + SC_BT_DEV_TYPE_USB = 14 +} sc_bt_dev_type_t; + +/*! + * This type is used to store a CPU start request. + */ +typedef struct +{ + sc_faddr_t addr; //!< 64-bit address to boot from + uint16_t cpu; //!< CPU to start + uint16_t mu; //!< MU associated with this CPU + uint8_t part; //!< Partition to start + uint8_t resv[3]; //!< Reserved +} sc_boot_list_t; + +/*! + * This type is used pass data from the ROM to the SCFW. + */ +typedef struct +{ + uint32_t barker; //!< Barker code + uint16_t ver; //!< Version + uint16_t size; //!< Size + uint8_t num; //!< Number images in list + uint8_t resv0[3]; //!< Reserved + uint32_t bd_flags; //!< Boot data flags + sc_boot_list_t img[SC_BOOT_MAX_LIST]; //!< image list + uint32_t resv1[4]; //!< was SCD address +} sc_boot_data_t; + +/*! + * This type is used store handoff header info. + */ +typedef struct +{ + uint16_t barker; //!< Barker code + uint16_t len; //!< Size +} sc_handoff_header_t; + +/*! + * This type is used pass boot device info from the ROM to the SCFW. + */ +typedef struct +{ + sc_bt_type_t bt_type; //!< Boot type + uint8_t instance; //!< Instance number + sc_bt_dev_type_t dev_type; //!< Device type + uint8_t resv2; +} sc_bt_dev_info_t; + +/*! + * This type is used pass extended data from the ROM to the SCFW. + */ +typedef struct +{ + sc_handoff_header_t header; //!< Barker/size info + uint32_t bringup_flags; //!< SS bring up flags + union + { + sc_bt_dev_info_t bt_dev_info; //!< Boot device + uint32_t u; //!< Force 32 bits + }; + uint32_t core_freq; + uint32_t axi_freq; + uint32_t ddr_freq; + uint32_t rom_tick_freq; + uint8_t ver; + uint8_t rsv1[3]; + uint32_t bringup_flags2; //!< SS bring up expansion + uint32_t rsv2; +} sc_boot_data2_t; + +/*! + * This type is used pass passover data from the ROM to the AP. + */ +typedef struct +{ + uint16_t tag; //!< Tag + uint8_t len; //!< Fixed value of 0x20 + uint8_t ver; //!< Version + uint32_t boot_mode; //!< Boot mode + uint32_t card_addr_mode; //!< SD card address mode + uint32_t bad_blks_of_img_set0; //!< NAND bad block count skipped 1 + uint32_t ap_mu_id; //!< AP MU ID + uint32_t bad_blks_of_img_set1; //!< NAND bad block count skipped 1 + uint8_t boot_stage; //!< Boot stage + uint8_t img_set_sel; //!< Image set booted from + uint8_t rsv[2]; //!< Reserved + uint32_t img_set_end; //!< Offset of Image End +} sc_passover_t; + +#ifdef SC_ROM_FUNC_ADDR + /*! + * This type is used make calls to the ROM. + */ + typedef struct + { + uint16_t ver; + uint16_t tag; + uint32_t (*dsc_ai_read)(uint8_t dsc_id, uint8_t src_sel, + uint16_t address); + int32_t (*dsc_ai_write)(uint8_t dsc_id, uint8_t src_sel, + uint16_t address, uint32_t data); + } sc_rom_functions_t; +#endif + +/* Functions */ + +sc_err_t boot_init(sc_bool_t allow); + +/*! + * This function returns flags passed to the SCFW from the ROM. These + * come from the boot container (bd_flags). + * + * @param[out] flag pointer to return raw flag value + * @param[out] not_secure pointer to return secure flag + * @param[out] not_isolated pointer to return isolated flag + * @param[out] restricted pointer to return restricted flag + * @param[out] grant pointer to return grant flag + * @param[out] not_coherent pointer to return coherent flag + * @param[out] alt_config pointer to return alt_config flag + * @param[out] early pointer to return early flag + * @param[out] ddrtest pointer to return ddrtest flag + * @param[out] no_ap pointer to return no_ap flag + * @param[out] alt_config2 pointer to return alt_config 2 flag + * + * For all pointers, NULL will result in no return of that value. + * + * See the [Boot Flags](@ref BOOT_FLAGS) section for definition + * of these flags. + * + * Many of the flags (some inverted) are used to create the + * boot partition by calling sc_rm_partition_alloc(). + */ +void boot_get_data(uint32_t *flag, sc_bool_t *not_secure, + sc_bool_t *not_isolated, sc_bool_t *restricted, sc_bool_t *grant, + sc_bool_t *not_coherent, sc_bool_t *alt_config, sc_bool_t *early, + sc_bool_t *ddrtest, sc_bool_t *no_ap, sc_bool_t *alt_config2); + +sc_err_t boot_get_img_1(uint8_t type, sc_rsrc_t *cpu, sc_faddr_t *addr, + sc_rsrc_t *mu, sc_rm_pt_t *pt, sc_bool_t force_ap); +sc_err_t boot_get_img_n(uint8_t type, sc_rsrc_t *cpu, sc_faddr_t *addr, + sc_rsrc_t *mu, sc_rm_pt_t *pt, sc_bool_t force_ap); +sc_err_t boot_get_bring_up(sc_sub_t ss, sc_bool_t *flag); +sc_err_t boot_get_boot_dev(sc_bt_dev_type_t *dev_type, uint8_t *inst, + sc_bt_type_t *bt_type); +sc_err_t boot_get_container_idx(uint8_t *idx); +uint8_t boot_get_img_num(void); +sc_err_t boot_get_img_start_addr(uint16_t img, sc_faddr_t *addr); + +/*! + * This function checks to see if a partition will be booting. + * + * @param[in] pt partition + * + * @return Returns SC_TRUE if the partition will boot. + */ +sc_bool_t boot_is_booting(sc_rm_pt_t pt); + +/*! + * This function returns the boot device resource associate with + * the specified partition. + * + * @param[in] pt partition + * @param[in] check_pt Boolean to verify if boot device needs + * to be associated with the partition. + * + * @return Returns the boot device. + */ +sc_rsrc_t boot_get_dev(sc_rm_pt_t pt, sc_bool_t check_pt); + +void boot_check_rom_data(void); + +#ifdef FLEXSPI_V2X_ADDR +/*! + * Return info from parsed FlexSPI container headers. + * + * @param[out] v2x_fw_addr pointer to return the V2X FW address + * @param[out] v2x_fw_size pointer to return the V2X FW size + * @param[out] dummy_addr pointer to return the dummy address + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t boot_get_flexspi_v2x_info(sc_saddr_t *v2x_fw_addr, + uint32_t *v2x_fw_size, sc_saddr_t *dummy_addr); +#endif + +#endif /* SC_BOOT_H */ + diff --git a/platform/main/build_info.h b/platform/main/build_info.h new file mode 100644 index 0000000..8303d05 --- /dev/null +++ b/platform/main/build_info.h @@ -0,0 +1,11 @@ +#ifndef BUILD_INFO_H +#define BUILD_INFO_H + +#define SCFW_BRANCH imx_scfw_2020q4 +#define SCFW_BUILD 5126UL +#define SCFW_COMMIT 0x0d54291fUL +#define SCFW_DATE "Dec 17 2020" +#define SCFW_DATE2 Dec_17_2020 +#define SCFW_TIME "03:04:44" + +#endif diff --git a/platform/main/debug.h b/platform/main/debug.h new file mode 100755 index 0000000..fc62ce3 --- /dev/null +++ b/platform/main/debug.h @@ -0,0 +1,359 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the system controller debug functionality. + */ +/*==========================================================================*/ + +#ifndef DEBUG_H +#define DEBUG_H + +/* Includes */ + +/* Debug Switches */ + +/*! This define sets the gobal debug level: +* - 0=Nothing +* - 1=+Banners +* - 2=+Data Dumps +* - 3=+Function entry/exit +* - 4=+Internal inline data +* - 5=All +*/ +#define DEBUG_LEVEL 2 + +#define DEBUG_BOOT +//#define DEBUG_DRV +//#define DEBUG_SS +//#define DEBUG_IRQ +//#define DEBUG_MISC +//#define DEBUG_PAD +//#define DEBUG_PM +//#define DEBUG_RM +//#define DEBUG_TIMER +#define DEBUG_BOARD +#define DEBUG_TEST +//#define DEBUG_DDRC +#define DEBUG_PMIC +//#define DEBUG_SOC +//#define DEBUG_SECO +//#define DEBUG_V2X + +#define DEBUG_RM_DUMP 4 +#define DEBUG_SS_DUMP(args...) ss_print(2, args) +#define DEBUG_SS_DSC_PM(args...) ss_print(2, args) +#define DEBUG_DRV_DSC(args...) drv_print(2, args) +#define DEBUG_DRV_DSC_DUMP(args...) drv_print(4, args) +#define DEBUG_DRV_XRDC2(args...) drv_print(5, args) +#define DEBUG_AI_DUMP(args...) debug_print(2, args) + +#ifndef HAS_TEST + #if 0 + #define DEBUG_RPC + #endif +#endif + +/* SIMU Debug */ + +#ifndef RD + #ifdef SIMU + #undef DEBUG_LEVEL + #define DEBUG_LEVEL 3 + #define DEBUG_BOOT + #define DEBUG_DRV + #define DEBUG_SS + #define DEBUG_IRQ + #define DEBUG_MISC + #define DEBUG_PAD + #define DEBUG_PM + #define DEBUG_RM + #define DEBUG_TIMER + #define DEBUG_BOARD + #define DEBUG_TEST + #undef DEBUG_RM_DUMP + #define DEBUG_RM_DUMP 3 + #undef DEBUG_SS_DUMP + #define DEBUG_SS_DUMP(args...) ss_print(3, args) + #undef DEBUG_SS_DSC_PM + #define DEBUG_SS_DSC_PM(args...) ss_print(2, args) + #undef DEBUG_DRV_DSC + #define DEBUG_DRV_DSC(args...) drv_print(2, args) + #undef DEBUG_DRV_DSC_DUMP + #define DEBUG_DRV_DSC_DUMP(args...) drv_print(3, args) + #undef DEBUG_DRV_XRDC2 + #define DEBUG_DRV_XRDC2(args...) drv_print(5, args) + #undef DEBUG_AI_DUMP + #define DEBUG_AI_DUMP(args...) debug_print(2, args) + #endif +#endif + +#ifdef MONITOR + #define DEBUG_DRV + #define DEBUG_SS + #undef DEBUG_SS_DUMP + #define DEBUG_SS_DUMP(args...) ss_print(0, args) + #undef DEBUG_DRV_DSC_DUMP + #define DEBUG_DRV_DSC_DUMP(args...) drv_print(0, args) + #undef DEBUG_LEVEL + #define DEBUG_LEVEL 1 +#endif + +#ifdef DL + #undef DEBUG_LEVEL + #define DEBUG_LEVEL DL +#endif + +#ifdef TL + #define TL1 TL + #define TL2 TL + #define TL3 3 +#else + #define TL1 1 + #define TL2 2 + #define TL3 3 +#endif + +/* Defines */ + +#ifdef DEBUG + #define debug0_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug0_print(args...) \ + NOP +#endif + +#if 1 <= DEBUG_LEVEL + #define debug1_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug1_print(args...) \ + NOP +#endif + +#if 2 <= DEBUG_LEVEL + #define debug2_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug2_print(args...) \ + NOP +#endif + +#if 3 <= DEBUG_LEVEL + #define debug3_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug3_print(args...) \ + NOP +#endif + +#if 4 <= DEBUG_LEVEL + #define debug4_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug4_print(args...) \ + NOP +#endif + +#if 5 <= DEBUG_LEVEL + #define debug5_print(...) \ + board_printf(__VA_ARGS__); +#else + #define debug5_print(args...) \ + NOP +#endif + +#ifdef DEBUG + #define debug_print(dl, args...) \ + debug##dl##_print(args) +#else + #define debug_print(args...) \ + NOP +#endif + +#ifdef DEBUG_BOOT + #define boot_print(dl, args...) \ + debug_print(dl, args) +#else + #define boot_print(args...) \ + NOP +#endif + +#ifdef DEBUG_DRV + #define drv_print(dl, args...) \ + debug_print(dl, args) +#else + #define drv_print(args...) \ + NOP +#endif + +#ifdef DEBUG_SOC + #define soc_print(dl, args...) \ + debug_print(dl, args) +#else + #define soc_print(args...) \ + NOP +#endif + +#ifdef DEBUG_SS + #define ss_print(dl, args...) \ + debug_print(dl, args) +#else + #define ss_print(args...) \ + NOP +#endif + +#ifdef DEBUG_IRQ + #define irq_print(dl, args...) \ + debug_print(dl, args) +#else + #define irq_print(args...) \ + NOP +#endif + +#ifdef DEBUG_MISC + #define misc_print(dl, args...) \ + debug_print(dl, args) +#else + #define misc_print(args...) \ + NOP +#endif + +#ifdef DEBUG_PAD + #define pad_print(dl, args...) \ + debug_print(dl, args) +#else + #define pad_print(args...) \ + NOP +#endif + +#ifdef DEBUG_PM + #define pm_print(dl, args...) \ + debug_print(dl, args) +#else + #define pm_print(args...) \ + NOP +#endif + +#ifdef DEBUG_RM + #define rm_print(dl, args...) \ + debug_print(dl, args) +#else + #define rm_print(args...) \ + NOP +#endif + +#ifdef DEBUG_TIMER + #define timer_print(dl, args...) \ + debug_print(dl, args) +#else + #define timer_print(args...) \ + NOP +#endif + +#ifdef DEBUG_BOARD + #define board_print(dl, args...) \ + debug_print(dl, args) +#else + #define board_print(args...) \ + NOP +#endif + +#ifdef DEBUG_TEST + #define test_print(dl, args...) \ + debug_print(dl, args) +#else + #define test_print(args...) \ + NOP +#endif + +#ifdef DEBUG_RPC + #define rpc_print(dl, args...) \ + debug_print(dl, args) +#else + #define rpc_print(args...) \ + NOP +#endif + +#ifdef DEBUG_DDRC + #define ddrc_print(dl, args...)\ + debug_print(dl, args) +#else + #define ddrc_print(args...) \ + NOP +#endif + +#ifdef DEBUG_PMIC + #define pmic_print(dl, args...)\ + debug_print(dl, args) +#else + #define pmic_print(...) \ + NOP +#endif + +#ifdef DEBUG_SECO + #define seco_print(dl, args...) \ + debug_print(dl, args) +#else + #define seco_print(args...) \ + NOP +#endif + +#ifdef DEBUG_V2X + #define v2x_print(dl, args...) \ + debug_print(dl, args) +#else + #define v2x_print(args...) \ + NOP +#endif + +#define debug_print_pk(dl, args...) \ + if (debug_level >= (dl)) \ + { \ + debug_print(0, args); \ + } + +#define error_print(...) \ + debug_print(0, __VA_ARGS__) + +#define always_print(...) \ + debug_print(0, __VA_ARGS__) + +#endif /* DEBUG_H */ + diff --git a/platform/main/ipc.h b/platform/main/ipc.h new file mode 100755 index 0000000..5a9644f --- /dev/null +++ b/platform/main/ipc.h @@ -0,0 +1,99 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the IPC implementation. + */ +/*==========================================================================*/ + +#ifndef SC_IPC_H +#define SC_IPC_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * This function opens an IPC channel. + * + * @param[out] ipc return pointer for ipc handle + * @param[in] id id of channel to open + * + * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_IPC + * otherwise). + * + * The \a id parameter is implementation specific. Could be an MU + * address, pointer to a driver path, channel index, etc. + */ +sc_err_t sc_ipc_open(sc_ipc_t *ipc, sc_ipc_id_t id); + +/*! + * This function closes an IPC channel. + * + * @param[in] ipc id of channel to close + */ +void sc_ipc_close(sc_ipc_t ipc); + +/*! + * This function reads a message from an IPC channel. + * + * @param[in] ipc id of channel read from + * @param[out] data pointer to message buffer to read + * + * This function will block if no message is available to be read. + */ +void sc_ipc_read(sc_ipc_t ipc, void *data); + +/*! + * This function writes a message to an IPC channel. + * + * @param[in] ipc id of channel to write to + * @param[in] data pointer to message buffer to write + * + * This function will block if the outgoing buffer is full. + */ +void sc_ipc_write(sc_ipc_t ipc, const void *data); + +#endif /* SC_IPC_H */ + diff --git a/platform/main/ipc_srv.h b/platform/main/ipc_srv.h new file mode 100755 index 0000000..c698ec7 --- /dev/null +++ b/platform/main/ipc_srv.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the IPC implementation (SC side). + */ +/*==========================================================================*/ + +#ifndef SC_IPC_SRV_H +#define SC_IPC_SRV_H + +/* Includes */ + +#include "main/main.h" +#include "main/rpc.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +sc_bool_t sc_ipc_pending(MU_Type *base); +sc_err_t sc_ipc_read_async(MU_Type *base, sc_rpc_async_msg_t *asyncMsg); +sc_err_t sc_ipc_write_async(MU_Type *base, sc_rpc_async_msg_t *asyncMsg); +sc_bool_t sc_ipc_handler(MU_Type *base, sc_rpc_async_msg_t *asyncMsg, + sc_rsrc_t mu); +void sc_ipc_reset(MU_Type *loc_mu, MU_Type *rem_mu, + sc_rpc_async_msg_t *asyncMsg); + +#endif /* SC_IPC_SRV_H */ + diff --git a/platform/main/main.h b/platform/main/main.h new file mode 100755 index 0000000..6101002 --- /dev/null +++ b/platform/main/main.h @@ -0,0 +1,427 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the system controller main. Contains defines, macros, + * and types shared by main and test implementations. + */ +/*==========================================================================*/ + +#ifndef SC_MAIN_H +#define SC_MAIN_H + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/ipc.h" +#include "main/rpc.h" +#include "board/board_common.h" +#include "config/config.h" +#include "main/debug.h" +#include "ss/inf/inf.h" + +/* Defines */ + +#define SC_NA 0U +#define SC_SW 0U + +#define SC_NUM_SS_GRP (SC_SS_GRP_LAST + 1U) +#define SC_NUM_RESOURCE (SC_R_LAST) +#define SC_NUM_SUBSYS ((sc_sub_t) (((uint8_t) SC_SUBSYS_LAST) + 1U)) +#define SC_NUM_DSC ((sc_dsc_t) (((uint8_t) SC_DSC_LAST) + 1U)) + +#define SC_MSIZE_W 5U +#define SC_MSLOT_W 2U +#define SC_MSLOT_SHF 30U +#define SC_SSLOT_W 6U +#define SC_SSLOT_SHF 28U +#define SC_SSPROT_W 2U + +#define NOP {} + +#ifndef SIMU + #define ENTER_CS SystemEnterCS() + #define EXIT_CS SystemExitCS() +#else + #define ENTER_CS NOP + #define EXIT_CS NOP +#endif + +#define DONT_TOUCH_RSRC 0U +#define LEAVE_RSRC_ON 1U +#define TURN_RSRC_OFF 2U +#define SET_RSRC_STBY 3U + +#define PLL_VER13 (13U) +#define PLL_VER18 (18U) + + +/*! Macro to get minimum */ +#if !defined(MIN) + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#if !defined(MAX) + /*! Macro to get maximum */ + #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/*! Macro to get absolute value */ +#define ABS(X) ((X) < 0 ? -(X) : (X)) + +/*! Macro to create bit field */ +#define BIT(X) (U32(1U) << (U32(X) % U32(32U))) + +/*! Macro to return bit position */ +#define BIT_POS(X) (U32(X) % U32(32U)) + +/*! Macro to create bit field */ +#define BIT8(X) (U8(1U) << (U8(X) % U8(8U))) + +/*! Macro to create bit field */ +#define BIT16(X) (U16(1U) << (U16(X) % U16(16U))) + +/*! Macro to create bit field */ +#define BIT32(X) (U32(1U) << (U32(X) % U32(32U))) + +/*! Macro to create bit field */ +#define BIT64(X) (U64(1U) << (U64(X) % U64(64U))) + +/*! Macro to extract from field */ +#define MASK(X) ((U32(1U) << U32(X)) - U32(1U)) + +/*! Macro to extract from bit field */ +#define EX_BIT(X, Y) ((U32(X) >> (U32(Y) % 32U)) & U32(1U)) + +/*! Macro to extract from bool field */ +#define EX_BOOL(X, Y) (U2B32(EX_BIT((X), (Y)))) + +/*! Macro to extract from field */ +#define EX_FIELD(X, Y, Z) (((X) >> (U32(Y) % 32U)) & MASK(Z)) + +/*! Macro to create clear field */ +#define CLR_FIELD(X, Y) (MASK(Y) << (U32(X) % U32(32U))) + +/*! Macro to create field */ +#define INS_FIELD(X, Y, Z) ((U32(Z) & MASK(Y)) << (U32(X) % 32U)) + +/*! Macro to create register index */ +#define REG(X) (U32(X) / U32(32U)) + +/*! Macro to create 8-bit index from register and bit */ +#define REGBIT8(X, Y) ((U8(X) * U8(32U)) + (U8(Y) % 32U)) + +/*! Macro to create 32-bit index from register and bit */ +#define REGBIT(X, Y) ((U32(X) * U32(32U)) + (U32(Y) % 32U)) + +/*! Macro to create 64-bit index from register and bit */ +#define REGBIT64(X, Y) ((U64(X) * U64(32U)) + (U64(Y) % 32U)) + +/*! Macro to get upper 32 bits of a 64-bit value */ +#define UINT64_H(X) (U32((U64(X) >> 32U) & U64(0x0FFFFFFFFU))) + +/*! Macro to get lower 32 bits of a 64-bit value */ +#define UINT64_L(X) (U32(U64(X) & U64(0x0FFFFFFFFU))) + +/*! Macro to get upper 16 bits of a 32-bit value */ +#define UINT32_H(X) (U16((U32(X) >> 16U) & U32(0xFFFFU))) + +/*! Macro to get lower 16 bits of a 32-bit value */ +#define UINT32_L(X) (U16(U32(X) & U32(0xFFFFU))) + +/*! Macro to declare a bit array */ +#define BITARRAY_DEC(X, Y) uint32_t (X)[(((Y) - 1U) / 32U) + 1U] + +/*! Macro to set a bit in a bit array */ +#define BITARRAY_SET(X, Y) (X)[REG(Y)] |= BIT(Y) + +/*! Macro to clear a bit in a bit array */ +#define BITARRAY_CLR(X, Y) (X)[REG(Y)] &= ~BIT(Y) + +/*! Macro to get a bit in a bit array */ +#define BITARRAY_GET(X, Y) ((X)[REG(Y)] & BIT(Y)) + +#define ASRT(X) \ + if (!(X)) \ + { \ + return; \ + } + +#define ASRT_ERR(X,ERROR) \ + if (err == SC_ERR_NONE) \ + { \ + if (!(X)) \ + { \ + err = (ERROR); \ + } \ + } + +#define ASRT_C(X) \ + if (!(X)) \ + { \ + continue; \ + } + +#define FUNC_ERR(X) \ + if (err == SC_ERR_NONE) \ + { \ + err = (X); \ + } + +#ifdef SIMU +#define SIMU_ASRT(X, STR) \ + if (!(X)) \ + { \ + error_print("error: %s\n", STR);\ + board_exit(-1); \ + } +#else + #define SIMU_ASRT(X, STR) \ + NOP +#endif + +#define HALT \ + do \ + { \ + } \ + while(true) + +/*! + * @name Defines for memory sizes + */ +/** @{ */ +#define SC_4KB 0x1000UL /*!< 4KB */ +#define SC_64KB 0x10000UL /*!< 64KB */ +#define SC_128KB 0x20000UL /*!< 128KB */ +#define SC_256KB 0x40000UL /*!< 256KB */ +#define SC_1MB 0x100000UL /*!< 1MB */ +#define SC_16MB 0x1000000UL /*!< 16MB */ +#define SC_64MB 0x4000000UL /*!< 64MB */ +#define SC_256MB 0x10000000UL /*!< 256MB */ +#define SC_512MB 0x20000000UL /*!< 512MB */ +#define SC_1GB 0x40000000UL /*!< 1GB */ +#define SC_1P5GB 0x60000000UL /*!< 1.5GB */ +#define SC_2GB 0x80000000UL /*!< 2GB */ +#define SC_3GB 0xC0000000UL /*!< 3GB */ +#define SC_4GB 0x100000000ULL /*!< 4GB */ +#define SC_6GB 0x180000000ULL /*!< 6GB */ +#define SC_8GB 0x200000000ULL /*!< 8GB */ +#define SC_16GB 0x400000000ULL /*!< 16GB */ +/** @} */ + +/*! + * @name Parameter checking macros + */ +/** @{ */ +#define BOUND_PT(X) ASRT_ERR((X) < SC_RM_NUM_PARTITION, SC_ERR_PARM) +#define BOUND_RSRC(X,I) ASRT_ERR(rm_check_map_ridx((X), &(I)) != SC_FALSE, SC_ERR_PARM) +#define BOUND_RSRC_C(X,I) ASRT_C(rm_check_map_ridx((X), &(I)) != SC_FALSE) +#define BOUND_MR(X) ASRT_ERR((X) < SC_RM_NUM_MEMREG, SC_ERR_PARM) +#define BOUND_PAD(X) ASRT_ERR((X) < SC_NUM_PAD, SC_ERR_PARM) +#define BOUND_SS(X) ASRT_ERR((X) <= SC_SUBSYS_LAST, SC_ERR_PARM) +#define USED_PT(X) ASRT_ERR(rm_is_partition_used(X) != SC_FALSE, SC_ERR_PARM) +#define ANCESTOR(X) ASRT_ERR(rm_check_ancestor(caller_pt, (X)) != SC_FALSE, SC_ERR_NOACCESS) +#define ANCESTOR_C(X) ASRT_C(rm_check_ancestor(caller_pt, (X)) != SC_FALSE) +#define OWNED(X) ASRT_ERR(rm_is_resource_owned(caller_pt, (X)) != SC_FALSE, SC_ERR_NOACCESS) +#define OWNER(X,Y) ASRT_ERR(rm_is_resource_owned((X), (Y)) != SC_FALSE, SC_ERR_NOACCESS) +#define SYSTEM(X) ASRT_ERR(rm_is_sys_access(X) != SC_FALSE, SC_ERR_NOACCESS) +#define NOT_SC_PT(X) ASRT_ERR((X) != SC_PT, SC_ERR_NOACCESS) +#define MASTER(X) ASRT_ERR(rm_is_ridx_master(X) != SC_FALSE, SC_ERR_PARM) +#define MASTER_C(X) ASRT_C(rm_is_ridx_master(X) != SC_FALSE) +#define PERIPHERAL(X) ASRT_ERR(rm_is_ridx_peripheral(X) != SC_FALSE, SC_ERR_PARM) +#define PERIPHERAL_C(X) ASRT_C(rm_is_ridx_peripheral(X) != SC_FALSE) +#define ACCESS_ALLOWED(X,I) ASRT_ERR(rm_is_ridx_access_allowed((X), (I)) != SC_FALSE, SC_ERR_NOACCESS) +#define ACCESS_ALLOWED_C(X,I) ASRT_C(rm_is_ridx_access_allowed((X), (I)) != SC_FALSE) +/** @} */ + +/* Types */ + +/*! + * Boot init phase types. + */ +typedef enum +{ + BOOT_PHASE_SYS_INIT = 6, /*!< Init system (no HW access yet) */ + BOOT_PHASE_API_INIT = 0, /*!< Init API (no HW access yet) */ + BOOT_PHASE_HW_INIT = 1, /*!< Init HW (API can be used) */ + BOOT_PHASE_EARLY_INIT = 4, /*!< Pre-start early CPUs */ + BOOT_PHASE_LATE_INIT = 5, /*!< Pre-start late CPUs */ + BOOT_PHASE_FINAL_INIT = 2, /*!< All done */ + BOOT_PHASE_TEST_INIT = 3 /*!< Init HW required for unit tests */ +} boot_phase_t; + +typedef uint8_t sc_msize_t; +typedef uint8_t sc_mslot_t; +typedef uint8_t sc_sslot_t; + +typedef const char * const strings[]; + +typedef union +{ + int8_t with_sign; + uint8_t no_sign; +} cint8_t; + +typedef union +{ + int16_t with_sign; + uint16_t no_sign; +} cint16_t; + +typedef union +{ + int32_t with_sign; + uint32_t no_sign; +} cint32_t; + +typedef union +{ + int64_t with_sign; + uint64_t no_sign; +} cint64_t; + +/*! + * This type is used to declare constant subsystem information. + */ +typedef struct +{ + uint8_t present : SC_BOOL_W; //!< 1 if SS present + sc_ss_inst_t inst : SC_SS_INST_W; //!< Instance number + sc_sub_t db_ssi : SC_PGP_W; //!< DB SSI this subsystem uses + sc_sub_t parent : SC_SUBSYS_W; //!< Parent SS if this is a sub-SS + sc_rm_idx_t r_ofs : SC_RM_IDX_W; //!< Offset into parent's resources + sc_rm_idx_t r2_ofs : SC_RM_IDX_W; //!< Second offset into parent's resources + sc_dsc_t dsc : SC_DSC_W; //!< Primary DSC this subsystem uses +} sc_ss_info_t; + +/*! + * This type is used to declare constant memmap information. The + * address range is the top-level memory map as seen by the AP cores. + */ +typedef struct +{ + sc_faddr_t start; //!< Start of subsystem address range + sc_faddr_t len; //!< Length of of subsystem address range + uint8_t mem : SC_BOOL_W; //!< Contains memory + uint8_t ss_prot : SC_SSPROT_W; //!< Protection 0=DB, 1=SS, 2=none + sc_msize_t size : SC_MSIZE_W; //!< ZADDR size + sc_mslot_t slot : SC_MSLOT_W; //!< ZADDR slot + sc_sslot_t subslot : SC_SSLOT_W; //!< ZADDR subslot + sc_sub_t ss : SC_SUBSYS_W; //!< Associated subsystem +} sc_memmap_t; + +/*! + * This type is used to declare constant DB information. + */ +typedef struct +{ + sc_rsrc_t rsrc : SC_RSRC_W; //!< DB resource + sc_sub_t ss : SC_SUBSYS_W; //!< DB subsystem + sc_db_connect_t connect; //!< DB connections +} sc_db_list_t; + +/*! + * This type declares all the memory areas that can be used for boot. + */ + typedef struct +{ + sc_faddr_t start; //!< Start of memory address range + sc_faddr_t len; //!< End of memory address range + sc_rsrc_t rsrc : SC_RSRC_W; //!< Resource associated with memory. + sc_sub_t ss : SC_SUBSYS_W; //!< Subsystem associated with resource. +}sc_boot_mem_t; + +/* Functions */ + +void main_banners(void); +sc_err_t main_drv_test(void); +void main_init(void); +sc_err_t main_sc_test(void); +void main_config(sc_rm_pt_t *pt_boot, sc_bool_t *early); +sc_err_t main_ddr(sc_bool_t early); +uint32_t main_dcd(void); +void main_prep_cpu(sc_rsrc_t boot_cpu, sc_rsrc_t boot_mu); +void main_dump(void); +#if defined(DEBUG) && !defined(SIMU) + /*! + * This function configures the specified UART to be used for debug output. + * + * @param[in] base base of the UART to configure + * @param[in] rate rate of the source clock to the UART + * + * Calls board_get_debug_uart() to get the instance number and the baud + * rate. If that returns 0 then will do nothing. Does not configure the pads + * power state, or clock source. Sets SCFW_DBG_READY to 1U. + */ + void main_config_debug_uart(LPUART_Type *base, uint32_t rate); +#endif +void main_pll_debug(void); +sc_err_t main_get_mem_ss(sc_faddr_t start_addr, uint32_t *ss); +#ifdef TEST_BOOTTIME +void test_save_time(uint32_t bootTicksRom, uint32_t bootTicksBanner, + uint32_t bootTicksEarly); +#endif + +/* Externs */ + +extern sc_bool_t rom_loaded; +extern const sc_db_list_t sc_db_info[SC_NUM_DB]; +#ifdef DEBUG + extern const char * const rnames[SC_NUM_RSRC]; + extern const char * const pnames[SC_NUM_PAD]; + extern const char * const snames[SC_SUBSYS_LAST + 1U]; +#endif +extern const sc_ss_info_t sc_ss_info[SC_SUBSYS_LAST + 1U]; +extern const sc_memmap_t sc_memmap[]; +extern const ss_base_info_t * const ss_base_info[SC_SUBSYS_LAST + 1U]; +extern volatile sc_bool_t rpc_debug; +extern sc_rm_idx_t rom_boot_rsrc[SC_NUM_RSRC]; +extern const sc_boot_mem_t rom_boot_addr[]; + +#ifdef DEBUG +char term_emul_getc(void); +void term_emul_putc(char c); +#endif + +#ifdef NO_DEVICE_ACCESS + extern uint32_t temp_fuses[16 * 1024]; +#endif + +#endif /* SC_MAIN_H */ + diff --git a/platform/main/monitor.h b/platform/main/monitor.h new file mode 100755 index 0000000..9fa7429 --- /dev/null +++ b/platform/main/monitor.h @@ -0,0 +1,64 @@ +/* +** ################################################################### +** +** Copyright 2017-2018 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the SCFW debug monitor. + */ +/*==========================================================================*/ + +#ifndef SC_MONITOR_H +#define SC_MONITOR_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +#ifdef MONITOR + void monitor(void); + sc_err_t monitor_update_line_and_dispatch(char *my_string); +#endif + +/* External variables */ + +#endif /* SC_MONITOR_H */ + diff --git a/platform/main/prof.h b/platform/main/prof.h new file mode 100755 index 0000000..b8890bc --- /dev/null +++ b/platform/main/prof.h @@ -0,0 +1,188 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the profiler implementation. + */ +/*==========================================================================*/ + +#ifndef SC_PROF_H +#define SC_PROF_H + +/* Includes */ + +#ifdef SIMU + #include + typedef struct timespec sc_prof_time_t; +#else + #include "drivers/sysctr/fsl_sysctr.h" + #include "drivers/systick/fsl_systick.h" + typedef uint32_t sc_prof_time_t; +#endif + +/*--------------------------------------------------------------------------*/ +/* Time Duration Profiling Macros */ +/*--------------------------------------------------------------------------*/ + +#ifdef SIMU +#define SC_PTIM_DECLARE(context) sc_prof_time_t context ## startTime; \ + sc_prof_time_t context ## endTime; \ + const char *context ## fileName; \ + uint32_t context ## lineNum + +#define SC_PTIM_EXTERN(context) extern sc_prof_time_t context ## startTime; \ + extern sc_prof_time_t context ## endTime; \ + extern const char *context ## fileName; \ + extern uint32_t context ## lineNum +#else +#define SC_PTIM_DECLARE(context) sc_prof_time_t context ## startTime; \ + sc_prof_time_t context ## endTime; \ + sc_prof_time_t context ## HPstartTime; \ + sc_prof_time_t context ## HPendTime; \ + const char *context ## fileName; \ + uint32_t context ## lineNum + +#define SC_PTIM_EXTERN(context) extern sc_prof_time_t context ## startTime; \ + extern sc_prof_time_t context ## endTime; \ + extern sc_prof_time_t context ## HPstartTime; \ + extern sc_prof_time_t context ## HPendTime; \ + extern const char *context ## fileName; \ + extern uint32_t context ## lineNum +#endif // SIMU + + +#define SC_PTIM_SETREF(context, file, line) context ## lineNum = line; \ + context ## fileName = file + +#define SC_PTIM_CLRREF(context) SC_PTIM_SETREF(context, NULL, 0) + +#define SC_PTIM_FILEREF(context) context ## fileName == NULL ? __FILE__ : context ## fileName +#define SC_PTIM_LINEREF(context) context ## fileName == NULL ? __LINE__ : context ## lineNum + +#ifdef SIMU +#define SC_PTIM_GET_TIME(context, timeVar) clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(context ## timeVar)) +#define SC_PTIM_TIME_DIFF(context) ((uint32_t)((context ## endTime.tv_nsec - context ## startTime.tv_nsec))) +#define SC_PTIM_HP_GET_TIME(context, timeVar) SC_PTIM_GET_TIME(context, timeVar) +#define SC_PTIM_HP_TIME_DIFF(context) SC_PTIM_TIME_DIFF(context) +#else +#define SC_PTIM_GET_TIME(context, timeVar) context ## timeVar = SYSCTR_GetCounter32() +#define SC_PTIM_TIME_DIFF(context) (SYSCTR_TICKS_TO_USEC(context ## endTime - context ## startTime) * 1000) +#define SC_PTIM_HP_GET_TIME(context, timeVar) context ## HP ## timeVar = SysTick->VAL; +#define SC_PTIM_HP_TIME_DIFF(context) SYSTICK_NsecDiff(context ## HP ## startTime, context ## HP ## endTime, 3750) +#endif // SIMU + +#define SC_PTIM_BEGIN(context) SC_PTIM_GET_TIME(context, startTime) +#define SC_PTIM_END(context) SC_PTIM_GET_TIME(context, endTime) +#define SC_PTIM_REPORT(context) debug_print(1, "PROF: time = %u ns (%s:%d)\n", \ + SC_PTIM_TIME_DIFF(context), \ + SC_PTIM_FILEREF(context), \ + SC_PTIM_LINEREF(context)) + +#define SC_PTIM_REPORT_N(context, n) debug_print(1, "PROF: n = %u, time / iter = %u ns (%s:%d)\n", \ + n, \ + SC_PTIM_TIME_DIFF(context) / n, \ + SC_PTIM_FILEREF(context), \ + SC_PTIM_LINEREF(context)) + +#define SC_PTIM_REPORT_GE_THRESH(context, nsec) if (SC_PTIM_TIME_DIFF(context) >= nsec) SC_PTIM_REPORT(context) + +#define SC_PTIM_HP_BEGIN(context) SC_PTIM_HP_GET_TIME(context, startTime) +#define SC_PTIM_HP_END(context) SC_PTIM_HP_GET_TIME(context, endTime) +#define SC_PTIM_HP_REPORT(context) debug_print(1, "PROF: time = %u ns (%s:%d)\n", \ + SC_PTIM_HP_TIME_DIFF(context), \ + SC_PTIM_FILEREF(context), \ + SC_PTIM_LINEREF(context)) + +#define SC_PTIM_HP_REPORT_N(context, n) debug_print(1, "PTIM: n = %u, time / iter = %u ns (%s:%d)\n", \ + n, \ + SC_PTIM_HP_TIME_DIFF(context) / n, \ + SC_PTIM_FILEREF(context), \ + SC_PTIM_LINEREF(context)) + +#define SC_PTIM_HP_REPORT_GE_THRESH(context, nsec) if (SC_PTIM_HP_TIME_DIFF(context) >= nsec) SC_PTIM_HP_REPORT(context) + +/*--------------------------------------------------------------------------*/ +/* Access Count Profiling Macros */ +/*--------------------------------------------------------------------------*/ + +#define SC_PCNT_DECLARE() uint32_t dscCountR; \ + uint32_t dscCountW; \ + uint32_t csrCountR; \ + uint32_t csrCountW; \ + uint32_t xrdcCountR; \ + uint32_t xrdcCountW; + +#define SC_PCNT_EXTERN() extern uint32_t dscCountR; \ + extern uint32_t dscCountW; \ + extern uint32_t csrCountR; \ + extern uint32_t csrCountW; \ + extern uint32_t xrdcCountR; \ + extern uint32_t xrdcCountW; + +#ifdef HAS_TEST_PCNT +#define SC_PCNT_BEGIN() dscCountR = 0; \ + dscCountW = 0; \ + csrCountR = 0; \ + csrCountW = 0; \ + xrdcCountR = 0; \ + xrdcCountW = 0; +#else +#define SC_PCNT_BEGIN() ; +#endif + +#define SC_PCNT_DSC_R(X) dscCountR += (X) +#define SC_PCNT_DSC_W(X) dscCountW += (X) +#define SC_PCNT_DSC_RW(X) dscCountR += (X); \ + dscCountW += (X); +#define SC_PCNT_CSR_R(X) csrCountR += (X) +#define SC_PCNT_CSR_W(X) csrCountW += (X) +#define SC_PCNT_CSR_RW(X) csrCountR += (X); \ + csrCountW += (X); +#define SC_PCNT_XRDC_R(X) xrdcCountR += (X) +#define SC_PCNT_XRDC_W(X) xrdcCountW += (X) + +#ifdef HAS_TEST_PCNT +#define SC_PCNT_REPORT(X) debug_print(1, "%s PCNT(R/W): dsc=%u/%u, csr=%u/%u, xrdc=%u/%u\n", \ + X, dscCountR, dscCountW, csrCountR, csrCountW, xrdcCountR, \ + xrdcCountW) +#else +#define SC_PCNT_REPORT(X) ; +#endif + +#endif /* SC_PROF_H */ + diff --git a/platform/main/rpc.h b/platform/main/rpc.h new file mode 100755 index 0000000..b20f513 --- /dev/null +++ b/platform/main/rpc.h @@ -0,0 +1,212 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the RPC implementation. + */ +/*==========================================================================*/ + +#ifndef SC_RPC_H +#define SC_RPC_H + +/* Includes */ + +#include "main/types.h" +#include "main/ipc.h" + +/* Defines */ + +/*! + * @name SCFW API version + */ +/** @{ */ +#define SCFW_API_VERSION_MAJOR 1U +#define SCFW_API_VERSION_MINOR 26U +/** @} */ + +/*! RPC version */ +#define SC_RPC_VERSION 1U + +/*! + * @name Defines for service types + */ +/** @{ */ +#define SC_RPC_SVC_UNKNOWN 0U +#define SC_RPC_SVC_RETURN 1U +#define SC_RPC_SVC_PM 2U +#define SC_RPC_SVC_RM 3U +#define SC_RPC_SVC_TIMER 5U +#define SC_RPC_SVC_PAD 6U +#define SC_RPC_SVC_MISC 7U +#define SC_RPC_SVC_IRQ 8U +#define SC_RPC_SVC_SECO 9U +#define SC_RPC_SVC_ABORT 10U +/** @} */ + +/* Internal Defines */ + +#define SC_RPC_MAX_MSG 8U + +#define RPC_VER(MESG) ((MESG)->version) +#define RPC_SIZE(MESG) ((MESG)->size) +#define RPC_SVC(MESG) ((MESG)->svc) +#define RPC_FUNC(MESG) ((MESG)->func) +#define RPC_R8(MESG) ((MESG)->func) +#define RPC_I64(MESG, IDX) ((I64(RPC_U32((MESG), (IDX))) << 32ULL) \ + | I64(RPC_U32((MESG), (IDX) + 4U))) +#define RPC_I32(MESG, IDX) ((MESG)->DATA.i32[(IDX) / 4U]) +#define RPC_I16(MESG, IDX) ((MESG)->DATA.i16[(IDX) / 2U]) +#define RPC_I8(MESG, IDX) ((MESG)->DATA.i8[(IDX)]) +#define RPC_U64(MESG, IDX) ((U64(RPC_U32((MESG), (IDX))) << 32ULL) \ + | U64(RPC_U32((MESG), (IDX) + 4U))) +#define RPC_U32(MESG, IDX) ((MESG)->DATA.u32[(IDX) / 4U]) +#define RPC_U16(MESG, IDX) ((MESG)->DATA.u16[(IDX) / 2U]) +#define RPC_U8(MESG, IDX) ((MESG)->DATA.u8[(IDX)]) + +#define SC_RPC_ASYNC_STATE_RD_START 0U +#define SC_RPC_ASYNC_STATE_RD_ACTIVE 1U +#define SC_RPC_ASYNC_STATE_RD_DONE 2U +#define SC_RPC_ASYNC_STATE_WR_START 3U +#define SC_RPC_ASYNC_STATE_WR_ACTIVE 4U +#define SC_RPC_ASYNC_STATE_WR_DONE 5U + +/* SC -> Client general-purpose MU IRQs */ +#define SC_RPC_MU_GIR_SVC 0x1U +#define SC_RPC_MU_GIR_WAKE 0x2U +#define SC_RPC_MU_GIR_BOOT 0x4U +#define SC_RPC_MU_GIR_DBG 0x8U + +/* Client -> SC general-purpose MU IRQs */ +#define SC_RPC_MU_GIR_RST 0x1U + +#define I8(X) ((int8_t) (X)) +#define I16(X) ((int16_t) (X)) +#define I32(X) ((int32_t) (X)) +#define I64(X) ((int64_t) (X)) +#define U8(X) ((uint8_t) (X)) +#define U16(X) ((uint16_t) (X)) +#define U32(X) ((uint32_t) (X)) +#define U64(X) ((uint64_t) (X)) + +#define PTR_I8(X) ((int8_t *) (X)) +#define PTR_I16(X) ((int16_t *) (X)) +#define PTR_I32(X) ((int32_t *) (X)) +#define PTR_I64(X) ((int64_t *) (X)) +#define PTR_U8(X) ((uint8_t *) (X)) +#define PTR_U16(X) ((uint16_t *) (X)) +#define PTR_U32(X) ((uint32_t *) (X)) +#define PTR_U64(X) ((uint64_t *) (X)) + +#define U2B(X) (((X) != 0U) ? SC_TRUE : SC_FALSE) +#define U2B32(X) (((X) != 0UL) ? SC_TRUE : SC_FALSE) +#define B2U8(X) (((X) != SC_FALSE) ? U8(0x01U) : U8(0x00U)) +#define B2U16(X) (((X) != SC_FALSE) ? U16(0x01U) : U16(0x00U)) +#define B2U32(X) (((X) != SC_FALSE) ? U32(0x01U) : U32(0x00U)) + +/* Types */ + +typedef struct +{ + uint8_t version; + uint8_t size; + uint8_t svc; + uint8_t func; + union + { + int32_t i32[(SC_RPC_MAX_MSG - 1U)]; + int16_t i16[(SC_RPC_MAX_MSG - 1U) * 2U]; + int8_t i8[(SC_RPC_MAX_MSG - 1U) * 4U]; + uint32_t u32[(SC_RPC_MAX_MSG - 1U)]; + uint16_t u16[(SC_RPC_MAX_MSG - 1U) * 2U]; + uint8_t u8[(SC_RPC_MAX_MSG - 1U) * 4U]; + } DATA; +} sc_rpc_msg_t; + +typedef uint8_t sc_rpc_async_state_t; + +typedef struct +{ + sc_rpc_async_state_t state; + uint8_t wordIdx; + sc_rpc_msg_t msg; + uint32_t timeStamp; +} sc_rpc_async_msg_t; + +/* Functions */ + +/*! + * This is an internal function to send an RPC message over an IPC + * channel. It is called by client-side SCFW API function shims. + * + * @param[in] ipc IPC handle + * @param[in,out] msg handle to a message + * @param[in] no_resp response flag + * + * If \a no_resp is SC_FALSE then this function waits for a response + * and returns the result in \a msg. + */ +void sc_call_rpc(sc_ipc_t ipc, sc_rpc_msg_t *msg, sc_bool_t no_resp); + +/*! + * This is an internal function to dispath an RPC call that has + * arrived via IPC over an MU. It is called by server-side SCFW. + * + * @param[in] mu MU message arrived on + * @param[in,out] msg handle to a message + * + * The function result is returned in \a msg. + */ +void sc_rpc_dispatch(sc_rsrc_t mu, sc_rpc_msg_t *msg); + +/*! + * This function translates an RPC message and forwards on to the + * normal RPC API. It is used only by hypervisors. + * + * @param[in] ipc IPC handle + * @param[in,out] msg handle to a message + * + * This function decodes a message, calls macros to translate the + * resources, pads, addresses, partitions, memory regions, etc. and + * then forwards on to the hypervisors SCFW API.Return results are + * translated back abd placed back into the message to be returned + * to the original API. + */ +void sc_rpc_xlate(sc_ipc_t ipc, sc_rpc_msg_t *msg); + +#endif /* SC_RPC_H */ + diff --git a/platform/main/scfw.h b/platform/main/scfw.h new file mode 100755 index 0000000..76cdf9c --- /dev/null +++ b/platform/main/scfw.h @@ -0,0 +1,73 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing includes to system headers and porting types. + */ +/*==========================================================================*/ + +#ifndef SC_SCFW_H +#define SC_SCFW_H + +/* Includes */ + +#include +#include +#include +#include +#include +#if defined(DEBUG) || defined(GCOV) + #include +#endif + +/* Types */ + +/*! + * This type is used to declare a handle for an IPC communication + * channel. Its meaning is specific to the IPC implementation. + */ +typedef uint32_t sc_ipc_t; + +/*! + * This type is used to declare an ID for an IPC communication + * channel. Its meaning is specific to the IPC implementation. + */ +typedef uint32_t sc_ipc_id_t; + +#endif /* SC_SCFW_H */ + diff --git a/platform/main/sched.h b/platform/main/sched.h new file mode 100755 index 0000000..5c79426 --- /dev/null +++ b/platform/main/sched.h @@ -0,0 +1,89 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the SCHED implementation. + */ +/*==========================================================================*/ + +#ifndef SC_SCHED_H +#define SC_SCHED_H + +/* Includes */ + +#include "fsl_device_registers.h" + +/* Defines */ + +#define SC_SCHED_NUM_PRIO_LEV BIT(__NVIC_PRIO_BITS) +#define SC_SCHED_PRIO_WRAP_TO_DEFAULT SC_SCHED_PRIO_NOPREEMPT_LOW + +// Priority grouping (PRIGROUP) configured as follows: +// 1-bit group priority field +// 3-bit subgroup priority field +// +// Note: actual bits of priority fields are MSB of fields as defined +// by __NVIC_PRIO_BITS +// +#define SC_SCHED_PRIGROUP (6U) + +/* Types */ +typedef enum +{ + SC_SCHED_PRIO_PREEMPT_CRITICAL = 0, // Highest premptive + SC_SCHED_PRIO_PREEMPT_VERY_HIGH = 1, + SC_SCHED_PRIO_PREEMPT_HIGH = 2, + SC_SCHED_PRIO_PREEMPT_ABOVE_NORMAL = 3, + SC_SCHED_PRIO_PREEMPT_NORMAL = 4, + SC_SCHED_PRIO_PREEMPT_BELOW_NORMAL = 5, + SC_SCHED_PRIO_PREEMPT_LOW = 6, + SC_SCHED_PRIO_PREEMPT_VERY_LOW = 7, // Lowest premptive + + SC_SCHED_PRIO_NOPREEMPT_CRITICAL = 8, // Highest non-premptive + SC_SCHED_PRIO_NOPREEMPT_VERY_HIGH = 9, + SC_SCHED_PRIO_NOPREEMPT_HIGH = 10, + SC_SCHED_PRIO_NOPREEMPT_ABOVE_NORMAL = 11, + SC_SCHED_PRIO_NOPREEMPT_NORMAL = 12, + SC_SCHED_PRIO_NOPREEMPT_BELOW_NORMAL = 13, + SC_SCHED_PRIO_NOPREEMPT_LOW = 14, + SC_SCHED_PRIO_NOPREEMPT_VERY_LOW = 15, // Lowest non-premptive + +} sc_sched_prio_t; + +#endif /* SC_SCHED_H */ + diff --git a/platform/main/simu.h b/platform/main/simu.h new file mode 100755 index 0000000..a10470b --- /dev/null +++ b/platform/main/simu.h @@ -0,0 +1,72 @@ +/* +** ################################################################### +** +** Copyright 2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the SIMU functions. + */ +/*==========================================================================*/ + +#ifndef SC_SIMU_H +#define SC_SIMU_H + +/* Includes */ + +#include "main/types.h" +#include "main/boot.h" +#include "main/board.h" +#include "main/simu.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +void main_simu_init(int argc, char * const argv[]); +void main_simu_load_fuses(void); +sc_bool_t main_simu_fuses_loaded(void); +const sc_boot_data_t *main_simu_rom_load_bd( + const sc_boot_data_t *boot_data); +const sc_boot_data2_t * main_simu_rom_load_bd2( + const sc_boot_data2_t *boot_data2); +const sc_passover_t * main_simu_rom_load_po( + const sc_passover_t *passover_data); +void main_simu_load_board(void); +board_parm_rtn_t main_board_parameter(board_parm_t parm); + +#endif /* SC_SIMU_H */ + diff --git a/platform/main/soc.h b/platform/main/soc.h new file mode 100755 index 0000000..1e4e779 --- /dev/null +++ b/platform/main/soc.h @@ -0,0 +1,1265 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the SoC API. This abstracts SoC-specific + * functionality such as init, info, analog, power, HPM, and DDR. + * + * @addtogroup SOC SOC: SoC Interface + * + * Module for the SoC Interface. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SOC_API_H +#define SC_SOC_API_H + +/* Includes */ + +#include "main/board.h" + +/*! Macro to configure an STC category */ +#define STC_RCAT_SETCAT(SS, CAT, CATMASK, CMP) \ + STC_RCAT_SetCategorization(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], \ + CAT, CATMASK, CMP) + +/*! Macro to set an STC TDM */ +#define STC_RCAT_SETSTARTSTOPTDM(SS, CAT, TDM, START, STOP) \ + STC_RCAT_SetStartStopTDM(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], \ + CAT, TDM, START, STOP) + +/*! Macro to get an STC HPR */ +#define STC_RCAT_GETHPR(SS, CAT) \ + STC_RCAT_GetHPR(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], CAT) + +/*! Macro to set an STC HPR */ +#define STC_RCAT_SETHPR(SS, CAT, HPR) \ + STC_RCAT_SetHPR(base_ptrs[sc_ss_info[ \ + SC_SUBSYS_##SS].db_ssi], CAT, HPR) + +/*! Macro to set an STC QoS panic */ +#define STC_QOS_PANIC(SS, CAT, QOS) \ + STC_QOS_Panic(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], \ + CAT, QOS) + +/*! Macro to set an STC threshold */ +#define STC_UD_THRESHOLD1(SS, CAT, TH, QOS) \ + STC_UD_EnableThreshold1(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], \ + CAT, TH, QOS) + +/*! Macro to set an STC threshold 2 */ +#define STC_UD_THRESHOLD2(SS, CAT, TH, QOS) \ + STC_UD_EnableThreshold2(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi], \ + CAT, TH, QOS) + +/*! Macro to disable an STC underrun detect */ +#define STC_UD_DIS(SS) \ + STC_UD_DisableAll(base_ptrs[ \ + sc_ss_info[SC_SUBSYS_##SS].db_ssi]) + +/* Indicator for system interface resources to manage power + * mode directly (i.e. no save/restore). + */ +#define SOC_SYS_IF_NO_SAVE (SC_PM_PW_MODE_ON + 1U) + +/*! Reset reason SNVS persistant storage register */ +#define SOC_RR 1U + +/*! Macro to check if reset reason is valid */ +#define SOC_RR_CHECK(X) ((((X) >> 24U) & 0xFFUL) == 0xCCUL) + +/*! Macro to set the reset reason */ +#define SOC_RR_INFO(R, P) ((0xCCUL << 24U) | (U32(R) << 8U) | U32(P)) + +/*! Macro to extract the reset reason */ +#define SOC_RR_REASON(X) (((X) >> 8U) & 0xFFUL) + +/*! Macro to extract the resetting partition */ +#define SOC_RR_PT(X) (((X) >> 0U) & 0xFFUL) + +/*! + * @name Defines for patch ID + */ +/** @{ */ +#define SC_PATCH_ID_NONE 0x00U /* Non patch - end marker */ +#define SC_PATCH_ID_SCU 0x55U /* SCU ROM patch */ +#define SC_PATCH_ID_SECO 0x45U /* SECO ROM patch */ +#define SC_PATCH_ID_V2X 0x57U /* V2X primary ROM patch */ +#define SC_PATCH_ID_V2X2 0x59U /* V2X secondary ROM patch */ +#define SC_PATCH_ID_C2XS 0x5AU /* V2X ROM patch SHA value */ +#define SC_PATCH_ID_CTRL 0x5BU /* Patch control */ +#define SC_PATCH_ID_ALL 0xFFU /* All patch IDs */ +/** @} */ + +typedef struct +{ + const uint16_t offset; + const uint16_t len; +} soc_patch_area_list_t; + +typedef struct +{ + uint32_t freq; + uint32_t volt; + uint8_t bias; +} soc_freq_volt_tbl_t; + +typedef struct +{ + uint32_t shader_clk; + uint32_t core_clk; + uint32_t ahb_clk; + uint32_t axi_ssi_clk; +} soc_gpu_clks_opp_t; + +/*! + * Stores CPU power state info + */ +typedef struct +{ + sc_rm_idx_t rm_idx; + sc_pm_power_mode_t req_mode; + sc_bool_t lpm_active; + sc_bool_t rst_req; + sc_bool_t early_wake; + uint8_t wake_idx; + sc_pm_wake_src_t wake_src; + sc_faddr_t resume_addr; +} soc_cpu_state_t; + +/*! + * Stores cluster power state info + */ +typedef struct +{ + sc_rm_idx_t rm_idx; + uint8_t num_cpu; + soc_cpu_state_t *cpu_state; + sc_pm_power_mode_t req_mode; +} soc_cluster_state_t; + +/*! + * Stores multi-cluster power state info + */ +typedef struct +{ + sc_rm_idx_t rm_idx; + soc_cluster_state_t *cluster_state; + sc_pm_power_mode_t req_mode; +} soc_multicluster_state_t; + +/*! + * Stores MCU sleep state info + */ +typedef struct +{ + sc_rm_idx_t wic_rm_idx; + sc_rm_idx_t sc_mu_rm_idx; + sc_bool_t dsm_req; + sc_bool_t dsm_active; + sc_bool_t rst_req; + uint8_t stopm; + uint8_t pstopo; + sc_faddr_t resume_addr; +} soc_mcu_state_t; + +/*! + * Stores auxiliary core power state info + */ +typedef struct +{ + sc_bool_t active; + sc_bool_t fw_loading; + sc_saddr_t fw_addr; + sc_pm_sys_if_t fw_sys_if; +} soc_aux_state_t; + +/*! + * Stores system interface node resource info + */ +typedef struct +{ + sc_rm_idx_t num_rm_idx; /*!< Number of resources in the node */ + const sc_rsrc_t *rsrc; /*!< Resource array for node */ + sc_rm_idx_t *rm_idx; /*!< Resource index array for node */ + sc_pm_power_mode_t *saved_pm; /*!< Saved power mode array for node */ +} soc_sys_if_node_t; + +/*! + * Stores system interface power mode reqest info + */ +typedef struct +{ + sc_pm_power_mode_t hpm; /*!< High-power mode for system interface */ + sc_pm_power_mode_t lpm; /*!< Low-power mode for system interface */ +} soc_sys_if_req_t; + +/*! + * Stores HMP node power mode info + */ +typedef struct +{ + sc_rm_idx_t rm_idx; + soc_sys_if_req_t *sys_if_req; /*!< System interface mode request array */ +} soc_hmp_node_t; + +/*! + * Stores HMP FSPI retention info + */ +typedef struct +{ + sc_pm_power_mode_t pm; /*!< FSPI power mode to restore */ + uint32_t clk_rate; /*!< FSPI clock rate to restore */ +} soc_fspi_ret_info_t; + +/*! + * Stores HMP system power mode info + */ +typedef struct +{ + uint8_t num_hmp; /*!< Number of HMP nodes */ + soc_hmp_node_t *hmp_node; /*!< HMP node array */ + uint8_t num_sys_if; /*!< Number of system interace nodes */ + soc_sys_if_node_t *sys_if_node; /*!< System interface node array */ + sc_bool_t sys_if_mgmt; /*!< System interface managment flag */ + sc_rm_idx_t ap_gic_rm_idx; /*!< AP GIC resource index */ + sc_rm_idx_t ap_irqstr_rm_idx; /*!< AP IRQSTR resource index */ + uint8_t ap_resume_cluster_idx; /*!< AP resume cluster index */ + uint8_t ap_resume_cpu_idx; /*!< AP resume cpu index */ + sc_pm_power_mode_t ocmem_mode; /*!< On-chip memory mode for SoC */ + soc_fspi_ret_info_t fspi_ret_info; /*!< FSPI retention info */ + sc_pm_power_mode_t ddr_mode; /*!< DDR mode for SoC */ + sc_bool_t ddr_active; /*!< DDR active (initialized) boolean */ + sc_bool_t lpm_active; /*!< LPM active boolean */ +} soc_hmp_t; + +/* + * Stores DDR retention region info + */ +typedef struct +{ + const uint32_t addr; /*!< Address of DDR region to be retained */ + const uint32_t size; /*!< Size of DDR region to be retained */ + uint32_t * const buf; /*!< Pointer to SCFW buffer for DDR retention */ +} soc_ddr_ret_region_t; + +/*! + * Stores DDR retention info + */ +typedef struct +{ + const uint32_t num_drc; /*!< Number of DRCs to retain */ + ddrc * const drc_inst; /*!< Buffer for DRC register retention */ + ddr_phy * const drc_phy_inst; /*!< Buffer for DRC PHY register retention */ + const uint32_t num_region; /*!< Number of DDR retention regions */ + const soc_ddr_ret_region_t * const region; /*!< Retention region array */ + uint32_t drc0_clk_rate; /*!< Clock rate to restore after retention */ +#if HAS_SS_DRC_1 + uint32_t drc1_clk_rate; /*!< Clock rate to restore after retention */ +#endif +} soc_ddr_ret_info_t; + + +#ifdef SWI_DQS2DQ_IRQn +/*! + * Stores DQS2DQ synchronization info + */ +typedef struct +{ + const sc_rsrc_t isi_rsrc; /*!< ISI channel used for sync */ + ISI_Type * const isi_regs; /*!< ISI peripheral registers */ + uint32_t timeout_usec; /*!< Sync search timeout */ +} soc_dqs2dq_sync_info_t; +#endif + +/*! + * Stores MSI ring usecount + */ +typedef struct +{ + const sc_rsrc_t rsrc; + uint16_t count; + uint16_t ss_count; +} soc_msi_ring_usecount_t; + +#ifndef NO_DEVICE_ACCESS +// Define to enable self-hosted debug +#if 0 +#define SOC_SELFHOSTED_DEBUG +#endif +#endif + +#ifdef SOC_SELFHOSTED_DEBUG +#define LAR_OFFSET (0xFB0U) +#define LAR_KEY (0xC5ACCE55U) + +#define DBGDTRRX_OFFSET (0x080U) +#define EDITR_OFFSET (0x084U) +#define EDSCR_OFFSET (0x088U) +#define DBGDTRTX_OFFSET (0x08CU) +#define EDPRSR_OFFSET (0x314U) + +#define CTICONTROL_OFFSET (0x000U) +#define CTIAPPPULSE_OFFSET (0x01CU) +#define CTIOUTEN0_OFFSET (0x0A0U) + +#define MSR_OP_CODE(op0, op1, CRn, CRm, op2, Rt) \ + (0xD5000000U | (op0 << 19U) | (op1 << 16U) | \ + (CRn << 12U) | (CRm << 8U) | (op2 << 5U) | (Rt << 0U)) + +#define MRS_OP_CODE(op0, op1, CRn, CRm, op2, Rt) \ + (0xD5200000U | (op0 << 19U) | (op1 << 16U) | \ + (CRn << 12U) | (CRm << 8U) | (op2 << 5U) | (Rt << 0U)) + +#define SYS_OP_CODE(op1, CRn, CRm, op2, Rt) \ + (0xD5000000U | (0x1U << 19U) | (op1 << 16U) | \ + (CRn << 12U) | (CRm << 8U) | (op2 << 5U) | (Rt << 0U)) + +typedef struct +{ + const uint32_t dbg_base; + const uint32_t cti_base; +} soc_dbgapb_cpu_info_t; + +typedef struct +{ + const uint8_t num_way; // Number of ways + const uint16_t num_set; // Number of sets + const uint8_t way_shift; // Shift for way encoding + const uint8_t set_shift; // Shift for set encoding + const uint8_t ofs_shift; // Shift for cache offset encoding + const uint8_t data_ramid; // L1 data RAM identifier + const uint8_t tag_ramid; // L1 tag RAM identifier + const uint32_t CDBGDR0; // Data register 0 + const uint32_t CDBGDR1; // Data register 1 + const uint32_t CDBGxCT; // D-Cache tag read operation + const uint32_t CDBGxCD; // D-Cache data read operation +} soc_dbgapb_cache_info_t; + +typedef struct +{ + const uint8_t num_cpu; // Number of CPUs in cluster + const sc_rsrc_t cpu0_rsrc; // First CPU resource + soc_dbgapb_cache_info_t const *dc_info; // D-cache info + soc_dbgapb_cache_info_t const *ic_info; // I-cache info +} soc_dbgapb_cluster_info_t; + +#endif + +/* External variables */ + +/*! Global variable to hold resetting partition */ +extern sc_rm_pt_t soc_reset_pt; + +/*! Global variable to hold reset reason */ +extern sc_pm_reset_reason_t soc_reset_rsn; + +/* ! Global variable to hold the dco-pc values for table 0 */ +extern uint32_t soc_dpll_tbl_0[]; + +/* ! Global variable to hold the dco-pc values for table 1 */ +extern uint32_t soc_dpll_tbl_1[]; + +/*!Global variable to store the state of clocks during power transition */ +extern sc_bool_t soc_clk_off_trans; + +/*! Global variable to hold the SCU standalone repeater trim. */ +#ifdef OTP_SCU_REG_TRIM +extern uint32_t soc_scu_srut; +#endif + +/*! Global variable to hold the VPU standalone repeater1 trim. */ +#ifdef OTP_VPU_REG0_TRIM +extern uint32_t soc_vpu_srut1; +#endif + +/*! Global variable to hold the VPU standalone repeater2 trim. */ +#ifdef OTP_VPU_REG1_TRIM +extern uint32_t soc_vpu_srut2; +#endif + +#if HAS_SS_GPU_0 || HAS_SS_GPU_1 +/*! Global variable to hold the maximum GPU freq dictated by the fuse. */ +extern uint32_t soc_max_gpu_freq; +#endif + +#if HAS_SS_AP_0 +/*! Global variable to hold the maximum AP0 freq dictated by the fuse. */ +extern uint32_t soc_max_ap0_freq; +#endif + +#if HAS_SS_AP_1 +/*! Global variable to hold the maximum AP1 freq dictated by the fuse. */ +extern uint32_t soc_max_ap1_freq; +#endif + +#if HAS_SS_AP_2 +/*! Global variable to hold the maximum AP2 freq dictated by the fuse. */ +extern uint32_t soc_max_ap2_freq; +#endif + +#if (HAS_SS_GPU_0 || HAS_SS_GPU_1) && !defined(NO_GPU_CLKS) +/*! + * Global variable to hold the GPU clock frequency and voltage for the + * various operating points. + */ +extern soc_gpu_clks_opp_t gpu_clks[NUM_GPU_OPP]; +#endif + +extern soc_hmp_t soc_hmp; +extern soc_sys_if_req_t soc_sys_if_req[SOC_NUM_HMP_NODES][SOC_NUM_SYS_IF]; +extern soc_mcu_state_t soc_mcu_state[SOC_NUM_MCU]; +#if defined(SOC_NUM_AUX) && (SOC_NUM_AUX >= 1) +extern soc_aux_state_t soc_aux_state[SOC_NUM_AUX]; +#endif +extern soc_cluster_state_t soc_cluster_state[SOC_NUM_CLUSTER]; + +#if (SOC_NUM_CLUSTER > 1U) + extern soc_multicluster_state_t soc_multicluster_state; +#endif + +#ifdef SWI_DQS2DQ_IRQn +extern soc_dqs2dq_sync_info_t *soc_dqs2dq_sync_info; +#endif + +#if FSL_FEATURE_PCIE_DPLL_SS +extern uint32_t ss_step; +extern uint32_t ss_stop; +extern uint32_t ss_denom; +#endif + +/*! Global variable to track if boot resources should not be reset. */ +extern sc_bool_t soc_no_reset; + +/* Functions */ + +/*! + * @name Initialization Functions + * @{ + */ + +/*! + * This function initalizes the parts of the SoC. + * + * @param[in] phase flag indicating phase + * + */ +void soc_init_common(boot_phase_t phase); + +/*! + * This function initalizes the SoC specific parts of the chip. + * + * @param[in] phase flag indicating phase + * + */ +void soc_init(boot_phase_t phase); + +/*! + * This function configures SCU resources. + * + * @param[in] pt_sc SCU partition + * @param[in] pt_boot boot partition + */ +void soc_config_sc(sc_rm_pt_t pt_sc, sc_rm_pt_t pt_boot); + +/*! + * This function configures SECO resources. + */ +void soc_config_seco(void); + +/*! + * Configure QoS in the DB when it is powered up. + */ +void soc_qos_config(void); + +#ifdef AUTOCAL +/*! + * Calibrate REFGEN tree. + */ +void soc_autocal_refgen_tree(void); +#endif + +/*! + * This function returns the pointer to fuse availability array. + */ +uint32_t *soc_get_fuse_avail(void); + +/*! + * This function fills in a bit array with info about disabled + * resources. + */ +void soc_init_fused_rsrc(void); + +/*! + * This function configures a subsystem as not available. + * + * @param[in] ss subsystem not available + */ +void soc_ss_notavail(sc_sub_t ss); + +/*! + * This function initalizes the refgen trims from the fuses. + */ +void soc_init_refgen(void); + +/*! + * This function initalize regulator, repeater and osc trims + * from the fuses. + */ +void soc_analog_fuse_init(void); + +#if HAS_SS_GPU_0 || HAS_SS_GPU_1 +/*! + * This function initalizes the maximum GPU core, shader + * and AXI clock based on the fuse. + * + * @param[in] gpu_fuse GPU Frequency fuse + */ +uint32_t soc_gpu_freq_config(uint32_t gpu_fuse); +#endif + +#if defined(HAS_V2X) && HAS_SS_V2X +/*! + * This function enables/disables V2X. + * + * @param[in] enb enable/disable + */ +void soc_v2x_enable(sc_bool_t enb); +#endif + +/** @} */ + +/*! + * @name Info Functions + * @{ + */ + +/*! + * This function saves reset info into persistant storage. + * + * @param[in] reason reason for reset + * @param[in] pt partition that caused reset + * + */ +void soc_set_reset_info(sc_pm_reset_reason_t reason, sc_rm_pt_t pt); + +/*! + * Return reset reason. + */ +sc_pm_reset_reason_t soc_reset_reason(void); + +/*! + * Return partition causing reset. + */ +sc_rm_pt_t soc_reset_part(void); + +/*! + * This function returns if a resource is available. + * + * @param[in] rsrc resource to check + * + * @return Returns SC_TRUE if the resource is available. + */ +sc_bool_t soc_rsrc_avail(sc_rsrc_t rsrc); + +/*! + * This function returns the trim value for a temp sensor. + * + * @param[in] dsc DSC to check + * + * @return Returns trim value. + */ +uint32_t soc_get_temp_trim(sc_dsc_t dsc); + +/*! + * This function returns the offset value for a temp sensor. + * + * @param[in] dsc DSC to check + * + * @return Returns the offset value. + */ +int8_t soc_get_temp_ofs(sc_dsc_t dsc); + +/*! + * This function returns temp interrupt to use. + * + * @param[in] dsc DSC alarm came from + * @param[in] alarm alarm (0=panic, 1=low, 2=high) + * + * @return Returns the interrupt. + */ +uint32_t soc_get_temp_trigger(sc_dsc_t dsc, uint32_t alarm); + +/*! + * This function returns the maximum frequency limited by + * the fuses for the GPU and AP cores + * + * @param[in] dsc_id DSC to check + * + * @return Returns the maximum frequency limited by fuse + */ +uint32_t soc_get_max_freq(sc_dsc_t dsc_id); + +/*! + * This function checks if the frequency is limited by + * fuse. + * + * @param[in] enet_rsrc ethernet resource to check + * + * @return SC_TRUE is frequency is limited + */ +sc_bool_t soc_enet_get_freq_limit(sc_rsrc_t enet_rsrc); + +/*! + * Initialize the maximum frequency of certain resources based + * on fuses. + */ +void soc_get_max_freq_fuse(void); + +/*! + * This function identifies if the given pd has internal + * or external switches. + * + *@param[in] dsc DSC to affect + *@param[in] pd pd to affect + * + * @return Returns SC_TRUE if the pd is internally switched, + * SC_FALSE if externally switched. + */ +sc_bool_t soc_pd_switchable(sc_dsc_t dsc, uint32_t pd); + +/*! + * This function checks if the given power domain of the given + * dsc supports retention. + * + *@param[in] dsc DSC to affect + *@param[in] pd pd to affect + * + * @return Returns SC_TRUE if the pd supports retention + */ +sc_bool_t soc_pd_retention(sc_dsc_t dsc, uint32_t pd); + +/*! + * This function checks if the given subsystem has forward + * body-bias. + * + *@param[in] ss subsystem to affect + * + * @return Returns SC_TRUE if the pd supports forward body-bias + */ +sc_bool_t soc_ss_has_bias(sc_sub_t ss); + +/*! + * This function returns the subsystem AI type, mainly used to + * identify if an SS has temp sensor. + * + * @param[in] ss subsystem to check + * + * @return Type of Analog Interface in the SS + */ +dsc_ai_type_t soc_ss_ai_type(sc_sub_t ss); + +/*! + * Return the type of memory used in the given PD of + * the DSC. + * + *@param[in] dsc DSC to affect + *@param[in] pd pd to affect + * + * @return Type of memory (ESilicon or Normal) used in the SS + */ +uint32_t soc_mem_type(sc_dsc_t dsc, uint32_t pd); + +/*! + * This function returns the uniquely defined memory power plane + * for the given dsc id + * + * @param[in] dsc_id DSC to check + * + * @return memory plane for the dsc_id + */ +uint8_t soc_mem_pwr_plane(sc_dsc_t dsc_id); + +/*! + * This function returns the change state of a resource during reboot. + * + * @param[in] idx idx to check + * + * @return SC_TRUE if not to be reset + */ +sc_bool_t soc_reboot_no_reset(sc_rm_idx_t idx); + +/*! + * Return the DSCMIX clock slice index and type. + * + * @param[out] clk_type DSC clock slice type + * @param[out] idx DSC clock slice index + * @param[out] parent DSC clock slice parent + */ +void soc_dsc_clock_info(dsc_clk_type_t *clk_type, uint32_t *idx, + sc_pm_clk_parent_t *parent); + +/*! + * Return HW limited clock dividers. + * + * @param[in] dsc DSC to affect + * @param[in] clkinfo Pointer to clock whose info is requested + * @param[out] pll_div Pll divided output + * + * @return DSCMIX clock slice divider + */ +uint32_t soc_get_clock_div(sc_dsc_t dsc, const dsc_clk_info_t *clkinfo, uint8_t *pll_div); + +/*! + * Checks if the given clock slice is the DSCMIX slice. + * + * @param[in] clk_info pointer to the clock data structure + * + * @return SC_TRUE if the slice is a DSCMIX slice + */ +sc_bool_t soc_slice_is_dsc(const dsc_clk_info_t *clk_info); + +#ifdef USE_AVPLL_FOR_DC +/*! + * This function returns parameters required to setup the AVPLLs used by + * DC subsystem. + * + * @param[in] pll_rsrc DC PLL resource ID + * @param[out] ai_toggle AI toggle to which the replacement AVPLL + * is connected + * @param[out] ssc_enable SC_TRUE if spread spectrum should be + * enabled for the PLL + * + * @return DSC_ID of the subsystem in which the AVPLLs reside + */ +sc_dsc_t soc_get_dc_avpll_info(sc_rsrc_t pll_rsrc, uint8_t *ai_toggle, + sc_bool_t *ssc_enable); +#endif + +/*! + * This function returns spread spectrum info required to setup the AVPLL + * + * @param[in] dsc dsc to affect + * @param[in] pll_index PLL index to affect + * + * @return Spread spectrum PPM for the PLL + */ +uint8_t soc_get_avpll_ssc_n(sc_dsc_t dsc, uint8_t pll_index); + +/*! + * This function checks if the GPU frequency is HW limited based on fuses. + * + * @return SC_TRUE if the frequency is HW limited + */ +sc_bool_t soc_gpu_freq_hw_limited(void); + +/*! + * Calculate and return the ROM patch checksum. + * + * @param[out] checksum pointer to return checksum + * @param[in] len length of fuse area to sum + */ +void soc_rompatch_checksum(uint32_t *checksum, uint16_t len); + +#ifdef ROM_PATCH_HEADER +/*! + * Return info for the first ROM patch. + * + * @param[in] id ID of patches to find + * @param[out] desc pointer to return patch descriptor + * @param[out] len pointer to return patch length + * @param[out] type pointer to return patch type + * @param[out] checksum pointer to return patch checksum + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NONE patch found, + * - SC_ERR_NOTFOUND if no patch found + */ +sc_err_t soc_patch_info_1(uint8_t id, uint8_t *desc, uint8_t *len, + uint8_t *type, uint32_t *checksum); + +/*! + * Return info for the next ROM patch. + * + * @param[in] id ID of patches to find + * @param[out] desc pointer to return patch descriptor + * @param[out] len pointer to return patch length + * @param[out] type pointer to return patch type + * @param[out] checksum pointer to return patch checksum + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NONE patch found, + * - SC_ERR_NOTFOUND if no additional patch found + */ +sc_err_t soc_patch_info_n(uint8_t id, uint8_t *desc, uint8_t *len, + uint8_t *type, uint32_t *checksum); +#endif + +/** @} */ + +/*! + * @name Analog Functions + * @{ + */ + +/*! + * Enable/Disable anamix in some SS during init and low power mode. + */ +void soc_setup_anamix(sc_bool_t enable); + +/*! + * This function powers up the DSC anamix. + * + * @param[in] dsc DSC to affect + */ +void soc_dsc_powerup_anamix(sc_dsc_t dsc); + +/*! + * This function powers up the DSC phymix. + * + * @param[in] dsc DSC to affect + */ +void soc_dsc_powerup_phymix(sc_dsc_t dsc); + +/*! + * This function powers down the DSC anamix. + * + * @param[in] dsc DSC to affect + */ +void soc_dsc_powerdown_anamix(sc_dsc_t dsc); + +/*! + * This function powers down the DSC phymix. + * + * @param[in] dsc DSC to affect + */ +void soc_dsc_powerdown_phymix(sc_dsc_t dsc); + +/*! + * Setup HSIO repeaters for internal or external PCIE clock + * + * @param[in] internal_clk SC_TRUE if using internal clock + * @param[in] enable SC_TRUE if powering up SS + */ +void soc_setup_hsio_repeater(board_parm_rtn_t internal_clk, sc_bool_t enable); + +/*! + * Setup the Forward body-bias for the given subsystem + * + * @param[in] ss Subsystem to affect + * @param[in] bias_mask IP within SS to enable/disable + * @param[in] enable SC_TRUE if enabling forward body-bias + * @param[in] delay time to wait when disabling forward body-bias + */ +void soc_set_bias(sc_sub_t ss, uint8_t bias_mask, sc_bool_t enable, + uint32_t delay); + +/*! + * Return the DPLL DCO-P trim value + * + * @param[in] dsc Subsystem to affect + * @param[in] pll_index PLL index within the SS + * @param[in] rate PLL lock rate + * + * @return DCO-PC trim value (default if fuse is 0) + */ +uint32_t soc_dpll_dco_pc(sc_dsc_t dsc, uint8_t pll_index, uint32_t rate); + +/*! + * Populate the DPLL DCO-PC values based on fuses + */ +void soc_dpll_populate_tbl(void); + +/** @} */ + +/*! + * @name Power Functions + * @{ + */ + +/*! + * Set the voltage based on the frequency for SS controlled by + * PMIC rail. + * + * @param[in] ss Subsystem to affect + * @param[in] old_freq Freq associated with current voltage + * @param[in] new_freq Freq associated with new voltage + * @param[in] pmic_change SC_TRUE is pmic voltage should be changed + * + * @return SC_ERR_NONE on successful voltage change else error code + */ +sc_err_t soc_set_freq_voltage(sc_sub_t ss, uint32_t old_freq, + uint32_t *new_freq, sc_bool_t pmic_change); + +/*! + * Handle SoC and board level power transitions required to power up + * or down a power domain. + * + * @param[in] ss Subsytem to affect + * @param[in] pd Power domain within the SS transitioning + * @param[in] from_mode Current power mode of the pd + * @param[in] to_mode New power mode of the pd + */ +void soc_trans_pd(sc_sub_t ss, uint8_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); + +/*! + * Check if the Forward body bias is enabled for the cluster, this + * function is only valid for the AP clusters. + * + * @param[in] ss Subsystem to affect + * + * @return SC_TRUE if forward body-bias is enabled. + */ +sc_bool_t soc_bias_enabled(sc_sub_t ss); + + +/*! + * Check if the new PLL rate is below the max freq vd-detect in the SS + * can support. + * + * @param[in] dsc DSC of subsystem to affect + * @param[in] rate New pll rate + * + * @return SC_TRUE if new pll rate is below the max vd-detect frequency + */ +sc_bool_t soc_ss_has_vd_detect(sc_dsc_t dsc, sc_pm_clock_rate_t rate); + +/*! + * Transition internal SOC level bandgap + * + * @param[in] ss Subsystem to affect + * @param[in] rsrc_idx Resource to affect + * @param[in] from_mode Current power mode of the resource + * @param[in] to_mode New power mode of the resource. + */ +void soc_trans_bandgap(sc_sub_t ss, sc_rsrc_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); + +void soc_fabric_force_on(sc_sub_t ss, sc_bool_t enb); +void soc_post_ss_reset(sc_dsc_t dsc, DSC_Type *dsc_base); +void soc_gicr_quiesce(uint8_t cluster_idx, uint32_t cpu_idx); +void soc_pause_ddr_traffic(sc_bool_t pause); +sc_bool_t soc_cluster_link_off(sc_rsrc_t resource, sc_rm_pt_t pt); + +/** @} */ + +/*! + * @name HPM Functions + * @{ + */ + +void soc_init_hmp(boot_phase_t phase); +sc_err_t soc_set_cpu_resume(uint8_t cluster_idx, uint8_t cpu_idx, + sc_bool_t isPrimary, sc_faddr_t resume_addr); +sc_err_t soc_set_mcu_resume(uint8_t mcu_idx,sc_faddr_t resume_addr); +sc_err_t soc_set_multicluster_power_mode(sc_pm_power_mode_t mode); +sc_err_t soc_set_cluster_power_mode(uint8_t cluster_idx, + sc_pm_power_mode_t mode); +sc_err_t soc_set_cpu_power_mode(uint8_t cluster_idx, uint8_t cpu_idx, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src); +void soc_set_cpu_rst_mode(uint8_t cluster_idx, uint8_t cpu_idx, + sc_bool_t rst); +void soc_set_mcu_sleep_mode(uint8_t mcu_idx, sc_bool_t dsm, + uint8_t stopm, uint8_t pstopo); +sc_bool_t soc_get_mcu_sleep_mode_active(uint8_t mcu_idx); +void soc_set_mcu_rst_mode(uint8_t mcu_idx, sc_bool_t rst); +sc_err_t soc_req_sys_if_power_mode(uint8_t hmp_idx, sc_pm_sys_if_t sys_if, + sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm); +void soc_trans_sys_if_hpm(uint8_t hmp_idx); +void soc_trans_sys_if_lpm(void); +void soc_sync_sys_if_pm(void); +void soc_trans_cpu_power_mode(uint8_t cluster_idx, uint8_t cpu_idx); +void soc_trans_mcu_power_mode(uint8_t mcu_idx); +void soc_prewake_cpu(void); +void soc_wake_cpu(uint8_t cluster_idx, uint8_t cpu_idx); +void soc_wake_mcu(uint8_t mcu_idx); +void soc_wake_lsio_mu(void); +void soc_wake_mcu_mu(uint8_t mcu_idx); +void soc_wake_sys_if_interconnect(void); +sc_pm_power_mode_t soc_get_hmp_sys_power_mode(void); +void soc_dump_hmp_power_state(void); +sc_bool_t soc_can_hmp_enter_lpm(void); +void soc_update_hmp_sys_power_mode(void); +void soc_update_hmp_boot_mem(void); + +/** @} */ + +/*! + * @name Auxiliary Core Functions + * @{ + */ + +#if defined(SOC_NUM_AUX) && (SOC_NUM_AUX >= 1) +/*! + * Get firmware address for auxiliary core + * + * @param[in] aux_idx Auxiliary core index + * @param[out] fw_addr Firmware address + * + * @return SC_ERR_NONE if firmware address could be retrieved. + */ +sc_err_t soc_aux_get_fw_addr(uint8_t aux_idx, sc_saddr_t *fw_addr); + +/*! + * This function enables the system interfaces needed to load an auxiliary + * core firmware image. + * + * @param[in] aux_idx Auxiliary core index + * @param[in] fw_addr Address of FW image + * + * @return SC_ERR_NONE if successful. + */ +sc_err_t soc_aux_enable_fw_load(uint8_t aux_idx, sc_faddr_t fw_addr); + +/*! + * This function disables the system interfaces needed to load an auxiliary + * core firmware image. + * + * @param[in] aux_idx Auxiliary core index + * @param[in] fw_addr Address of FW image + * + * @return SC_ERR_NONE if successful. + */ +sc_err_t soc_aux_disable_fw_load(uint8_t aux_idx); + +/*! + * This function checks if auxiliary core firmware load is in progress. + * + * @param[in] aux_idx Auxiliary core index + * + * @return SC_TRUE if firmware load is in progress. + */ +sc_bool_t soc_aux_check_fw_load(uint8_t aux_idx); + +/*! + * This function retrieves the system interface associated with the + * subsystem that contains the auxiliary core firmware. + * + * @param[in] ss Subsystem containing the firmware + * @param[out] sys_if System interface containing the firmware + * + * @return SC_ERR_NONE if mapping to system interface is found. + */ +sc_err_t soc_aux_get_fw_sys_if(sc_sub_t ss, sc_pm_sys_if_t *sys_if); +#endif + +/** @} */ + +/*! + * @name DDR Functions + * @{ + */ + +/*! + * This function initalizes DDR. + * + * @param[in] early boolean for early init + * + * @return Returns the sc_err_t. + * + */ +sc_err_t soc_init_ddr(sc_bool_t early); + +/*! + * This function places the DDR in SRPD (self-refresh power down) and + * disables DDR clocks. + */ +void soc_self_refresh_power_down_clk_disable_entry(void); + +/*! + * This function enables DDR clocks and exits the DDR from SRPD (self-refresh + * power down). + */ +void soc_refresh_power_down_clk_disable_exit(void); + +/*! + * This function configures parameters for DDR low-power retention (SRPD with + * DRC powered down). + * + * @param[in] ddr_ret_info pointer to retention info struct + */ +void soc_ddr_config_retention(soc_ddr_ret_info_t *ddr_ret_info); + +/*! + * This function places the DDR into low-power retention (SRPD with + * DRC powered down). + */ +void soc_ddr_enter_retention(void); + +/*! + * This function exits the DDR from low-power retention (SRPD with + * DRC powered down). + */ +void soc_ddr_exit_retention(void); + +/*! + * This function initializes LPDDR4 DQS2DQ training. + */ +void soc_ddr_dqs2dq_init(void); + +/*! + * This function does DDR bit deskew training. + */ +void soc_ddr_bit_deskew(void); + +/*! + * This function invokes LPDDR4 DQS2DQ periodic training. + */ +void soc_ddr_dqs2dq_periodic(void); + +#ifdef SWI_DQS2DQ_IRQn +/*! + * This function configures parameters of LPDDR4 DQS2DQ periodic training. + * + * @param[in] dqs2dq_sync_info pointer to DQS2DQ info struct + */ +void soc_ddr_dqs2dq_config(soc_dqs2dq_sync_info_t *dqs2dq_sync_info); + +/*! + * This function sychronizes LPDDR4 DQS2DQ periodic training to + * DDR traffic events (i.e. ISI frame completion). + */ +void soc_ddr_dqs2dq_sync(void); +#endif + +/*! + * This function enables DDR LPCG clock gating. + */ +void soc_drc_lpcg_setup(void); + +/** @} */ + +/*! + * @name Misc Functions + * @{ + */ + +/*! + * This function ticks the temp sensor processing. + * + * @param[in] msec milliseconds that have expired + */ +void soc_temp_sensor_tick(uint16_t msec); + +void soc_setup_msi_slave_ring(sc_sub_t cur_ss, sc_sub_t parent, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); +void soc_msi_ring_workaround(sc_pm_power_mode_t from_mode, + sc_pm_power_mode_t to_mode, soc_msi_ring_usecount_t *msi_slv_ring, + uint32_t num_msi_slaves, MSI_MSTR_Type *msi_reg, sc_sub_t cur_ss); + +#ifdef ERR050601_WORKAROUND +void soc_block_ap_set(sc_rm_pt_t pt, sc_rsrc_t resource); +void soc_block_ap_memreg(sc_rm_mr_t mr, sc_rm_perm_t *perms); +#endif + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * Dumps registers of single analog module. + * + * @param[in] dsc DSC to dump + * @param[in] tog toggle to dump + * @param[in] ai AI type + */ +void soc_dsc_ai_dumpmodule(sc_dsc_t dsc, uint8_t tog, sc_ai_t ai); + +/*! + * Dumps registers of analog modules in a subsystem. + * + * @param[in] dsc DSC to dump + */ +void soc_dsc_ai_dump(sc_dsc_t dsc); + +/*! + * Allows for muxing out analog clocks and voltage levels. + * + * @param[in] dsc DSC to affect + */ +void soc_anamix_test_out(sc_dsc_t dsc); + +/** @} */ + +#ifdef SOC_SELFHOSTED_DEBUG +soc_dbgapb_cluster_info_t *soc_dbgapb_get_cluster_info(sc_rsrc_t cpu_rsrc); +soc_dbgapb_cluster_info_t *soc_dbgapb_get_indexed_cluster_info(uint8_t idx); +soc_dbgapb_cpu_info_t *soc_dbgapb_get_cpu_info(sc_rsrc_t cpu_rsrc); + +sc_bool_t soc_dbgapb_halt(void); +sc_bool_t soc_dbgapb_get_reg(sc_rsrc_t cpu_rsrc, uint8_t reg_idx, + uint32_t *reg_upper, uint32_t *reg_lower); +sc_bool_t soc_dbgapb_get_L1line(sc_rsrc_t cpu_rsrc, sc_bool_t dcache, + uint8_t way, uint16_t set,uint32_t *tag_upper,uint32_t *tag_lower, + uint32_t line[ ], uint32_t num_words); +#endif + +/*! + * Tune the RC-OSC to the requested frequency + * + * @param[in] dsc DSC in which the RC-OSC resides + * @param[in] freq_mhz frequency to tune (normally 200Mhz) + */ +void soc_rc200_tune(sc_dsc_t dsc, uint32_t freq_mhz); + +/*! + * Retune the 24MHz Osc with the new CL_TUNE value. + * @param[in] cl_tune new capacitor value + */ +void soc_XtalCL_Tune(uint32_t cl_tune); + +#endif /* SC_SOC_API_H */ + +/** @} */ + diff --git a/platform/main/types.h b/platform/main/types.h new file mode 100755 index 0000000..22b59e3 --- /dev/null +++ b/platform/main/types.h @@ -0,0 +1,1047 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing types used across multiple service APIs. + */ +/*==========================================================================*/ + +#ifndef SC_TYPES_H +#define SC_TYPES_H + +/* Includes */ + +#include "main/scfw.h" + +/* Defines */ + +/*! + * @name Defines for chip IDs + */ +/** @{ */ +#define CHIP_ID_QM 0x1U /*!< i.MX8QM */ +#define CHIP_ID_QX 0x2U /*!< i.MX8QX*/ +#define CHIP_ID_DXL 0xEU /*!< i.MX8DXL */ +/** @} */ + +/*! + * @name Defines for common frequencies + */ +/** @{ */ +#define SC_32KHZ 32768U /*!< 32KHz */ +#define SC_1MHZ 1000000U /*!< 1MHz */ +#define SC_10MHZ 10000000U /*!< 10MHz */ +#define SC_16MHZ 16000000U /*!< 16MHz */ +#define SC_20MHZ 20000000U /*!< 20MHz */ +#define SC_25MHZ 25000000U /*!< 25MHz */ +#define SC_27MHZ 27000000U /*!< 27MHz */ +#define SC_40MHZ 40000000U /*!< 40MHz */ +#define SC_45MHZ 45000000U /*!< 45MHz */ +#define SC_50MHZ 50000000U /*!< 50MHz */ +#define SC_60MHZ 60000000U /*!< 60MHz */ +#define SC_66MHZ 66666666U /*!< 66MHz */ +#define SC_74MHZ 74250000U /*!< 74.25MHz */ +#define SC_80MHZ 80000000U /*!< 80MHz */ +#define SC_83MHZ 83333333U /*!< 83MHz */ +#define SC_84MHZ 84375000U /*!< 84.37MHz */ +#define SC_100MHZ 100000000U /*!< 100MHz */ +#define SC_106MHZ 106250000U /*!< 106.25MHz */ +#define SC_114MHZ 114000000U /*!< 114MHz */ +#define SC_125MHZ 125000000U /*!< 125MHz */ +#define SC_128MHZ 128000000U /*!< 128MHz */ +#define SC_133MHZ 133333333U /*!< 133MHz */ +#define SC_135MHZ 135000000U /*!< 135MHz */ +#define SC_150MHZ 150000000U /*!< 150MHz */ +#define SC_160MHZ 160000000U /*!< 160MHz */ +#define SC_166MHZ 166666666U /*!< 166MHz */ +#define SC_175MHZ 175000000U /*!< 175MHz */ +#define SC_180MHZ 180000000U /*!< 180MHz */ +#define SC_200MHZ 200000000U /*!< 200MHz */ +#define SC_212MHZ 212500000U /*!< 212.5MHz */ +#define SC_217MHZ 216666666U /*!< 217MHz */ +#define SC_250MHZ 250000000U /*!< 250MHz */ +#define SC_266MHZ 266666666U /*!< 266MHz */ +#define SC_300MHZ 300000000U /*!< 300MHz */ +#define SC_312MHZ 312500000U /*!< 312.5MHZ */ +#define SC_320MHZ 320000000U /*!< 320MHz */ +#define SC_325MHZ 325000000U /*!< 325MHz */ +#define SC_333MHZ 333333333U /*!< 333MHz */ +#define SC_350MHZ 350000000U /*!< 350MHz */ +#define SC_368MHZ 368500000U /*!< 368.5MHZ */ +#define SC_372MHZ 372000000U /*!< 372MHz */ +#define SC_375MHZ 375000000U /*!< 375MHz */ +#define SC_400MHZ 400000000U /*!< 400MHz */ +#define SC_425MHZ 425000000U /*!< 425MHz */ +#define SC_465MHZ 465000000U /*!< 465MHz */ +#define SC_500MHZ 500000000U /*!< 500MHz */ +#define SC_594MHZ 594000000U /*!< 594MHz */ +#define SC_625MHZ 625000000U /*!< 625MHz */ +#define SC_640MHZ 640000000U /*!< 640MHz */ +#define SC_648MHZ 648000000U /*!< 648MHz */ +#define SC_650MHZ 650000000U /*!< 650MHz */ +#define SC_667MHZ 666666667U /*!< 667MHz */ +#define SC_675MHZ 675000000U /*!< 675MHz */ +#define SC_700MHZ 700000000U /*!< 700MHz */ +#define SC_720MHZ 720000000U /*!< 720MHz */ +#define SC_750MHZ 750000000U /*!< 750MHz */ +#define SC_753MHZ 753000000U /*!< 753MHz */ +#define SC_793MHZ 793000000U /*!< 793MHz */ +#define SC_800MHZ 800000000U /*!< 800MHz */ +#define SC_850MHZ 850000000U /*!< 850MHz */ +#define SC_858MHZ 858000000U /*!< 858MHz */ +#define SC_900MHZ 900000000U /*!< 900MHz */ +#define SC_953MHZ 953000000U /*!< 953MHz */ +#define SC_963MHZ 963000000U /*!< 963MHz */ +#define SC_1000MHZ 1000000000U /*!< 1GHz */ +#define SC_1060MHZ 1060000000U /*!< 1.06GHz */ +#define SC_1068MHZ 1068000000U /*!< 1.068GHz */ +#define SC_1121MHZ 1121000000U /*!< 1.121GHz */ +#define SC_1173MHZ 1173000000U /*!< 1.173GHz */ +#define SC_1188MHZ 1188000000U /*!< 1.188GHz */ +#define SC_1260MHZ 1260000000U /*!< 1.26GHz */ +#define SC_1278MHZ 1278000000U /*!< 1.278GHz */ +#define SC_1280MHZ 1280000000U /*!< 1.28GHz */ +#define SC_1300MHZ 1300000000U /*!< 1.3GHz */ +#define SC_1313MHZ 1313000000U /*!< 1.313GHz */ +#define SC_1345MHZ 1345000000U /*!< 1.345GHz */ +#define SC_1400MHZ 1400000000U /*!< 1.4GHz */ +#define SC_1500MHZ 1500000000U /*!< 1.5GHz */ +#define SC_1600MHZ 1600000000U /*!< 1.6GHz */ +#define SC_1800MHZ 1800000000U /*!< 1.8GHz */ +#define SC_1860MHZ 1860000000U /*!< 1.86GHz */ +#define SC_2000MHZ 2000000000U /*!< 2.0GHz */ +#define SC_2112MHZ 2112000000U /*!< 2.12GHz */ +/** @} */ + +/*! + * @name Defines for 24M related frequencies + */ +/** @{ */ +#define SC_8MHZ 8000000U /*!< 8MHz */ +#define SC_12MHZ 12000000U /*!< 12MHz */ +#define SC_19MHZ 19800000U /*!< 19.8MHz */ +#define SC_24MHZ 24000000U /*!< 24MHz */ +#define SC_48MHZ 48000000U /*!< 48MHz */ +#define SC_120MHZ 120000000U /*!< 120MHz */ +#define SC_132MHZ 132000000U /*!< 132MHz */ +#define SC_144MHZ 144000000U /*!< 144MHz */ +#define SC_192MHZ 192000000U /*!< 192MHz */ +#define SC_210MHZ 210000000U /*!< 210MHz */ +#define SC_211MHZ 211200000U /*!< 211.2MHz */ +#define SC_228MHZ 228000000U /*!< 233MHz */ +#define SC_240MHZ 240000000U /*!< 240MHz */ +#define SC_264MHZ 264000000U /*!< 264MHz */ +#define SC_352MHZ 352000000U /*!< 352MHz */ +#define SC_360MHZ 360000000U /*!< 360MHz */ +#define SC_384MHZ 384000000U /*!< 384MHz */ +#define SC_396MHZ 396000000U /*!< 396MHz */ +#define SC_432MHZ 432000000U /*!< 432MHz */ +#define SC_456MHZ 456000000U /*!< 466MHz */ +#define SC_480MHZ 480000000U /*!< 480MHz */ +#define SC_600MHZ 600000000U /*!< 600MHz */ +#define SC_744MHZ 744000000U /*!< 744MHz */ +#define SC_792MHZ 792000000U /*!< 792MHz */ +#define SC_840MHZ 840000000U /*!< 840MHz */ +#define SC_864MHZ 864000000U /*!< 864MHz */ +#define SC_912MHZ 912000000U /*!< 912MHz */ +#define SC_960MHZ 960000000U /*!< 960MHz */ +#define SC_1056MHZ 1056000000U /*!< 1056MHz */ +#define SC_1104MHZ 1104000000U /*!< 1104MHz */ +#define SC_1200MHZ 1200000000U /*!< 1.2GHz */ +#define SC_1464MHZ 1464000000U /*!< 1.464GHz */ +#define SC_2400MHZ 2400000000U /*!< 2.4GHz */ +#define SC_3000MHZ 3000000000U /*!< 2.4GHz */ + +/** @} */ + +/*! + * @name Defines for A/V related frequencies + */ +/** @{ */ +#define SC_62MHZ 62937500U /*!< 62.9375MHz */ +#define SC_755MHZ 755250000U /*!< 755.25MHz */ +/** @} */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_BOOL_W 1U /*!< Width of sc_bool_t */ +#define SC_ERR_W 4U /*!< Width of sc_err_t */ +#define SC_RSRC_W 10U /*!< Width of sc_rsrc_t */ +#define SC_CTRL_W 7U /*!< Width of sc_ctrl_t */ +/** @} */ + +/*! + * @name Defines for sc_bool_t + */ +/** @{ */ +#define SC_FALSE ((sc_bool_t) 0U) /*!< False */ +#define SC_TRUE ((sc_bool_t) 1U) /*!< True */ +/** @} */ + +/*! + * @name Defines for sc_err_t + */ +/** @{ */ +#define SC_ERR_NONE 0U /*!< Success */ +#define SC_ERR_VERSION 1U /*!< Incompatible API version */ +#define SC_ERR_CONFIG 2U /*!< Configuration error */ +#define SC_ERR_PARM 3U /*!< Bad parameter */ +#define SC_ERR_NOACCESS 4U /*!< Permission error (no access) */ +#define SC_ERR_LOCKED 5U /*!< Permission error (locked) */ +#define SC_ERR_UNAVAILABLE 6U /*!< Unavailable (out of resources) */ +#define SC_ERR_NOTFOUND 7U /*!< Not found */ +#define SC_ERR_NOPOWER 8U /*!< No power */ +#define SC_ERR_IPC 9U /*!< Generic IPC error */ +#define SC_ERR_BUSY 10U /*!< Resource is currently busy/active */ +#define SC_ERR_FAIL 11U /*!< General I/O failure */ +#define SC_ERR_LAST 12U +/** @} */ + +/*! + * @name Defines for sc_rsrc_t + */ +/** @{ */ +#define SC_R_AP_0 0U +#define SC_R_AP_0_0 1U +#define SC_R_AP_0_1 2U +#define SC_R_AP_0_2 3U +#define SC_R_AP_0_3 4U +#define SC_R_AP_1 5U +#define SC_R_AP_1_0 6U +#define SC_R_AP_1_1 7U +#define SC_R_AP_1_2 8U +#define SC_R_AP_1_3 9U +#define SC_R_CCI 10U +#define SC_R_DB 11U +#define SC_R_DRC_0 12U +#define SC_R_DRC_1 13U +#define SC_R_GIC_SMMU 14U +#define SC_R_IRQSTR_MCU_0 15U +#define SC_R_IRQSTR_MCU_1 16U +#define SC_R_SMMU_0 17U +#define SC_R_GIC_0 18U +#define SC_R_DC_0_BLIT0 19U +#define SC_R_DC_0_BLIT1 20U +#define SC_R_DC_0_BLIT2 21U +#define SC_R_DC_0_BLIT_OUT 22U +#define SC_R_PERF_0 23U +#define SC_R_USB_1_PHY 24U +#define SC_R_DC_0_WARP 25U +#define SC_R_V2X_MU_0 26U +#define SC_R_V2X_MU_1 27U +#define SC_R_DC_0_VIDEO0 28U +#define SC_R_DC_0_VIDEO1 29U +#define SC_R_DC_0_FRAC0 30U +#define SC_R_V2X_MU_2 31U +#define SC_R_DC_0 32U +#define SC_R_GPU_2_PID0 33U +#define SC_R_DC_0_PLL_0 34U +#define SC_R_DC_0_PLL_1 35U +#define SC_R_DC_1_BLIT0 36U +#define SC_R_DC_1_BLIT1 37U +#define SC_R_DC_1_BLIT2 38U +#define SC_R_DC_1_BLIT_OUT 39U +#define SC_R_V2X_MU_3 40U +#define SC_R_V2X_MU_4 41U +#define SC_R_DC_1_WARP 42U +#define SC_R_STM 43U +#define SC_R_SECVIO 44U +#define SC_R_DC_1_VIDEO0 45U +#define SC_R_DC_1_VIDEO1 46U +#define SC_R_DC_1_FRAC0 47U +#define SC_R_V2X 48U +#define SC_R_DC_1 49U +#define SC_R_UNUSED14 50U +#define SC_R_DC_1_PLL_0 51U +#define SC_R_DC_1_PLL_1 52U +#define SC_R_SPI_0 53U +#define SC_R_SPI_1 54U +#define SC_R_SPI_2 55U +#define SC_R_SPI_3 56U +#define SC_R_UART_0 57U +#define SC_R_UART_1 58U +#define SC_R_UART_2 59U +#define SC_R_UART_3 60U +#define SC_R_UART_4 61U +#define SC_R_EMVSIM_0 62U +#define SC_R_EMVSIM_1 63U +#define SC_R_DMA_0_CH0 64U +#define SC_R_DMA_0_CH1 65U +#define SC_R_DMA_0_CH2 66U +#define SC_R_DMA_0_CH3 67U +#define SC_R_DMA_0_CH4 68U +#define SC_R_DMA_0_CH5 69U +#define SC_R_DMA_0_CH6 70U +#define SC_R_DMA_0_CH7 71U +#define SC_R_DMA_0_CH8 72U +#define SC_R_DMA_0_CH9 73U +#define SC_R_DMA_0_CH10 74U +#define SC_R_DMA_0_CH11 75U +#define SC_R_DMA_0_CH12 76U +#define SC_R_DMA_0_CH13 77U +#define SC_R_DMA_0_CH14 78U +#define SC_R_DMA_0_CH15 79U +#define SC_R_DMA_0_CH16 80U +#define SC_R_DMA_0_CH17 81U +#define SC_R_DMA_0_CH18 82U +#define SC_R_DMA_0_CH19 83U +#define SC_R_DMA_0_CH20 84U +#define SC_R_DMA_0_CH21 85U +#define SC_R_DMA_0_CH22 86U +#define SC_R_DMA_0_CH23 87U +#define SC_R_DMA_0_CH24 88U +#define SC_R_DMA_0_CH25 89U +#define SC_R_DMA_0_CH26 90U +#define SC_R_DMA_0_CH27 91U +#define SC_R_DMA_0_CH28 92U +#define SC_R_DMA_0_CH29 93U +#define SC_R_DMA_0_CH30 94U +#define SC_R_DMA_0_CH31 95U +#define SC_R_I2C_0 96U +#define SC_R_I2C_1 97U +#define SC_R_I2C_2 98U +#define SC_R_I2C_3 99U +#define SC_R_I2C_4 100U +#define SC_R_ADC_0 101U +#define SC_R_ADC_1 102U +#define SC_R_FTM_0 103U +#define SC_R_FTM_1 104U +#define SC_R_CAN_0 105U +#define SC_R_CAN_1 106U +#define SC_R_CAN_2 107U +#define SC_R_DMA_1_CH0 108U +#define SC_R_DMA_1_CH1 109U +#define SC_R_DMA_1_CH2 110U +#define SC_R_DMA_1_CH3 111U +#define SC_R_DMA_1_CH4 112U +#define SC_R_DMA_1_CH5 113U +#define SC_R_DMA_1_CH6 114U +#define SC_R_DMA_1_CH7 115U +#define SC_R_DMA_1_CH8 116U +#define SC_R_DMA_1_CH9 117U +#define SC_R_DMA_1_CH10 118U +#define SC_R_DMA_1_CH11 119U +#define SC_R_DMA_1_CH12 120U +#define SC_R_DMA_1_CH13 121U +#define SC_R_DMA_1_CH14 122U +#define SC_R_DMA_1_CH15 123U +#define SC_R_DMA_1_CH16 124U +#define SC_R_DMA_1_CH17 125U +#define SC_R_DMA_1_CH18 126U +#define SC_R_DMA_1_CH19 127U +#define SC_R_DMA_1_CH20 128U +#define SC_R_DMA_1_CH21 129U +#define SC_R_DMA_1_CH22 130U +#define SC_R_DMA_1_CH23 131U +#define SC_R_DMA_1_CH24 132U +#define SC_R_DMA_1_CH25 133U +#define SC_R_DMA_1_CH26 134U +#define SC_R_DMA_1_CH27 135U +#define SC_R_DMA_1_CH28 136U +#define SC_R_DMA_1_CH29 137U +#define SC_R_DMA_1_CH30 138U +#define SC_R_DMA_1_CH31 139U +#define SC_R_V2X_PID0 140U +#define SC_R_V2X_PID1 141U +#define SC_R_V2X_PID2 142U +#define SC_R_V2X_PID3 143U +#define SC_R_GPU_0_PID0 144U +#define SC_R_GPU_0_PID1 145U +#define SC_R_GPU_0_PID2 146U +#define SC_R_GPU_0_PID3 147U +#define SC_R_GPU_1_PID0 148U +#define SC_R_GPU_1_PID1 149U +#define SC_R_GPU_1_PID2 150U +#define SC_R_GPU_1_PID3 151U +#define SC_R_PCIE_A 152U +#define SC_R_SERDES_0 153U +#define SC_R_MATCH_0 154U +#define SC_R_MATCH_1 155U +#define SC_R_MATCH_2 156U +#define SC_R_MATCH_3 157U +#define SC_R_MATCH_4 158U +#define SC_R_MATCH_5 159U +#define SC_R_MATCH_6 160U +#define SC_R_MATCH_7 161U +#define SC_R_MATCH_8 162U +#define SC_R_MATCH_9 163U +#define SC_R_MATCH_10 164U +#define SC_R_MATCH_11 165U +#define SC_R_MATCH_12 166U +#define SC_R_MATCH_13 167U +#define SC_R_MATCH_14 168U +#define SC_R_PCIE_B 169U +#define SC_R_SATA_0 170U +#define SC_R_SERDES_1 171U +#define SC_R_HSIO_GPIO_0 172U +#define SC_R_MATCH_15 173U +#define SC_R_MATCH_16 174U +#define SC_R_MATCH_17 175U +#define SC_R_MATCH_18 176U +#define SC_R_MATCH_19 177U +#define SC_R_MATCH_20 178U +#define SC_R_MATCH_21 179U +#define SC_R_MATCH_22 180U +#define SC_R_MATCH_23 181U +#define SC_R_MATCH_24 182U +#define SC_R_MATCH_25 183U +#define SC_R_MATCH_26 184U +#define SC_R_MATCH_27 185U +#define SC_R_MATCH_28 186U +#define SC_R_LCD_0 187U +#define SC_R_LCD_0_PWM_0 188U +#define SC_R_LCD_0_I2C_0 189U +#define SC_R_LCD_0_I2C_1 190U +#define SC_R_PWM_0 191U +#define SC_R_PWM_1 192U +#define SC_R_PWM_2 193U +#define SC_R_PWM_3 194U +#define SC_R_PWM_4 195U +#define SC_R_PWM_5 196U +#define SC_R_PWM_6 197U +#define SC_R_PWM_7 198U +#define SC_R_GPIO_0 199U +#define SC_R_GPIO_1 200U +#define SC_R_GPIO_2 201U +#define SC_R_GPIO_3 202U +#define SC_R_GPIO_4 203U +#define SC_R_GPIO_5 204U +#define SC_R_GPIO_6 205U +#define SC_R_GPIO_7 206U +#define SC_R_GPT_0 207U +#define SC_R_GPT_1 208U +#define SC_R_GPT_2 209U +#define SC_R_GPT_3 210U +#define SC_R_GPT_4 211U +#define SC_R_KPP 212U +#define SC_R_MU_0A 213U +#define SC_R_MU_1A 214U +#define SC_R_MU_2A 215U +#define SC_R_MU_3A 216U +#define SC_R_MU_4A 217U +#define SC_R_MU_5A 218U +#define SC_R_MU_6A 219U +#define SC_R_MU_7A 220U +#define SC_R_MU_8A 221U +#define SC_R_MU_9A 222U +#define SC_R_MU_10A 223U +#define SC_R_MU_11A 224U +#define SC_R_MU_12A 225U +#define SC_R_MU_13A 226U +#define SC_R_MU_5B 227U +#define SC_R_MU_6B 228U +#define SC_R_MU_7B 229U +#define SC_R_MU_8B 230U +#define SC_R_MU_9B 231U +#define SC_R_MU_10B 232U +#define SC_R_MU_11B 233U +#define SC_R_MU_12B 234U +#define SC_R_MU_13B 235U +#define SC_R_ROM_0 236U +#define SC_R_FSPI_0 237U +#define SC_R_FSPI_1 238U +#define SC_R_IEE_0 239U +#define SC_R_IEE_0_R0 240U +#define SC_R_IEE_0_R1 241U +#define SC_R_IEE_0_R2 242U +#define SC_R_IEE_0_R3 243U +#define SC_R_IEE_0_R4 244U +#define SC_R_IEE_0_R5 245U +#define SC_R_IEE_0_R6 246U +#define SC_R_IEE_0_R7 247U +#define SC_R_SDHC_0 248U +#define SC_R_SDHC_1 249U +#define SC_R_SDHC_2 250U +#define SC_R_ENET_0 251U +#define SC_R_ENET_1 252U +#define SC_R_MLB_0 253U +#define SC_R_DMA_2_CH0 254U +#define SC_R_DMA_2_CH1 255U +#define SC_R_DMA_2_CH2 256U +#define SC_R_DMA_2_CH3 257U +#define SC_R_DMA_2_CH4 258U +#define SC_R_USB_0 259U +#define SC_R_USB_1 260U +#define SC_R_USB_0_PHY 261U +#define SC_R_USB_2 262U +#define SC_R_USB_2_PHY 263U +#define SC_R_DTCP 264U +#define SC_R_NAND 265U +#define SC_R_LVDS_0 266U +#define SC_R_LVDS_0_PWM_0 267U +#define SC_R_LVDS_0_I2C_0 268U +#define SC_R_LVDS_0_I2C_1 269U +#define SC_R_LVDS_1 270U +#define SC_R_LVDS_1_PWM_0 271U +#define SC_R_LVDS_1_I2C_0 272U +#define SC_R_LVDS_1_I2C_1 273U +#define SC_R_LVDS_2 274U +#define SC_R_LVDS_2_PWM_0 275U +#define SC_R_LVDS_2_I2C_0 276U +#define SC_R_LVDS_2_I2C_1 277U +#define SC_R_MCU_0_PID0 278U +#define SC_R_MCU_0_PID1 279U +#define SC_R_MCU_0_PID2 280U +#define SC_R_MCU_0_PID3 281U +#define SC_R_MCU_0_PID4 282U +#define SC_R_MCU_0_RGPIO 283U +#define SC_R_MCU_0_SEMA42 284U +#define SC_R_MCU_0_TPM 285U +#define SC_R_MCU_0_PIT 286U +#define SC_R_MCU_0_UART 287U +#define SC_R_MCU_0_I2C 288U +#define SC_R_MCU_0_INTMUX 289U +#define SC_R_ENET_0_A0 290U +#define SC_R_ENET_0_A1 291U +#define SC_R_MCU_0_MU_0B 292U +#define SC_R_MCU_0_MU_0A0 293U +#define SC_R_MCU_0_MU_0A1 294U +#define SC_R_MCU_0_MU_0A2 295U +#define SC_R_MCU_0_MU_0A3 296U +#define SC_R_MCU_0_MU_1A 297U +#define SC_R_MCU_1_PID0 298U +#define SC_R_MCU_1_PID1 299U +#define SC_R_MCU_1_PID2 300U +#define SC_R_MCU_1_PID3 301U +#define SC_R_MCU_1_PID4 302U +#define SC_R_MCU_1_RGPIO 303U +#define SC_R_MCU_1_SEMA42 304U +#define SC_R_MCU_1_TPM 305U +#define SC_R_MCU_1_PIT 306U +#define SC_R_MCU_1_UART 307U +#define SC_R_MCU_1_I2C 308U +#define SC_R_MCU_1_INTMUX 309U +#define SC_R_UNUSED17 310U +#define SC_R_UNUSED18 311U +#define SC_R_MCU_1_MU_0B 312U +#define SC_R_MCU_1_MU_0A0 313U +#define SC_R_MCU_1_MU_0A1 314U +#define SC_R_MCU_1_MU_0A2 315U +#define SC_R_MCU_1_MU_0A3 316U +#define SC_R_MCU_1_MU_1A 317U +#define SC_R_SAI_0 318U +#define SC_R_SAI_1 319U +#define SC_R_SAI_2 320U +#define SC_R_IRQSTR_AP_0 321U +#define SC_R_IRQSTR_DSP 322U +#define SC_R_ELCDIF_PLL 323U +#define SC_R_OCRAM 324U +#define SC_R_AUDIO_PLL_0 325U +#define SC_R_PI_0 326U +#define SC_R_PI_0_PWM_0 327U +#define SC_R_PI_0_PWM_1 328U +#define SC_R_PI_0_I2C_0 329U +#define SC_R_PI_0_PLL 330U +#define SC_R_PI_1 331U +#define SC_R_PI_1_PWM_0 332U +#define SC_R_PI_1_PWM_1 333U +#define SC_R_PI_1_I2C_0 334U +#define SC_R_PI_1_PLL 335U +#define SC_R_SC_PID0 336U +#define SC_R_SC_PID1 337U +#define SC_R_SC_PID2 338U +#define SC_R_SC_PID3 339U +#define SC_R_SC_PID4 340U +#define SC_R_SC_SEMA42 341U +#define SC_R_SC_TPM 342U +#define SC_R_SC_PIT 343U +#define SC_R_SC_UART 344U +#define SC_R_SC_I2C 345U +#define SC_R_SC_MU_0B 346U +#define SC_R_SC_MU_0A0 347U +#define SC_R_SC_MU_0A1 348U +#define SC_R_SC_MU_0A2 349U +#define SC_R_SC_MU_0A3 350U +#define SC_R_SC_MU_1A 351U +#define SC_R_SYSCNT_RD 352U +#define SC_R_SYSCNT_CMP 353U +#define SC_R_DEBUG 354U +#define SC_R_SYSTEM 355U +#define SC_R_SNVS 356U +#define SC_R_OTP 357U +#define SC_R_VPU_PID0 358U +#define SC_R_VPU_PID1 359U +#define SC_R_VPU_PID2 360U +#define SC_R_VPU_PID3 361U +#define SC_R_VPU_PID4 362U +#define SC_R_VPU_PID5 363U +#define SC_R_VPU_PID6 364U +#define SC_R_VPU_PID7 365U +#define SC_R_ENET_0_A2 366U +#define SC_R_ENET_1_A0 367U +#define SC_R_ENET_1_A1 368U +#define SC_R_ENET_1_A2 369U +#define SC_R_ENET_1_A3 370U +#define SC_R_ENET_1_A4 371U +#define SC_R_DMA_4_CH0 372U +#define SC_R_DMA_4_CH1 373U +#define SC_R_DMA_4_CH2 374U +#define SC_R_DMA_4_CH3 375U +#define SC_R_DMA_4_CH4 376U +#define SC_R_ISI_0_CH0 377U +#define SC_R_ISI_0_CH1 378U +#define SC_R_ISI_0_CH2 379U +#define SC_R_ISI_0_CH3 380U +#define SC_R_ISI_0_CH4 381U +#define SC_R_ISI_0_CH5 382U +#define SC_R_ISI_0_CH6 383U +#define SC_R_ISI_0_CH7 384U +#define SC_R_MJPEG_0_DEC_S0 385U +#define SC_R_MJPEG_0_DEC_S1 386U +#define SC_R_MJPEG_0_DEC_S2 387U +#define SC_R_MJPEG_0_DEC_S3 388U +#define SC_R_MJPEG_0_ENC_S0 389U +#define SC_R_MJPEG_0_ENC_S1 390U +#define SC_R_MJPEG_0_ENC_S2 391U +#define SC_R_MJPEG_0_ENC_S3 392U +#define SC_R_MIPI_0 393U +#define SC_R_MIPI_0_PWM_0 394U +#define SC_R_MIPI_0_I2C_0 395U +#define SC_R_MIPI_0_I2C_1 396U +#define SC_R_MIPI_1 397U +#define SC_R_MIPI_1_PWM_0 398U +#define SC_R_MIPI_1_I2C_0 399U +#define SC_R_MIPI_1_I2C_1 400U +#define SC_R_CSI_0 401U +#define SC_R_CSI_0_PWM_0 402U +#define SC_R_CSI_0_I2C_0 403U +#define SC_R_CSI_1 404U +#define SC_R_CSI_1_PWM_0 405U +#define SC_R_CSI_1_I2C_0 406U +#define SC_R_HDMI 407U +#define SC_R_HDMI_I2S 408U +#define SC_R_HDMI_I2C_0 409U +#define SC_R_HDMI_PLL_0 410U +#define SC_R_HDMI_RX 411U +#define SC_R_HDMI_RX_BYPASS 412U +#define SC_R_HDMI_RX_I2C_0 413U +#define SC_R_ASRC_0 414U +#define SC_R_ESAI_0 415U +#define SC_R_SPDIF_0 416U +#define SC_R_SPDIF_1 417U +#define SC_R_SAI_3 418U +#define SC_R_SAI_4 419U +#define SC_R_SAI_5 420U +#define SC_R_GPT_5 421U +#define SC_R_GPT_6 422U +#define SC_R_GPT_7 423U +#define SC_R_GPT_8 424U +#define SC_R_GPT_9 425U +#define SC_R_GPT_10 426U +#define SC_R_DMA_2_CH5 427U +#define SC_R_DMA_2_CH6 428U +#define SC_R_DMA_2_CH7 429U +#define SC_R_DMA_2_CH8 430U +#define SC_R_DMA_2_CH9 431U +#define SC_R_DMA_2_CH10 432U +#define SC_R_DMA_2_CH11 433U +#define SC_R_DMA_2_CH12 434U +#define SC_R_DMA_2_CH13 435U +#define SC_R_DMA_2_CH14 436U +#define SC_R_DMA_2_CH15 437U +#define SC_R_DMA_2_CH16 438U +#define SC_R_DMA_2_CH17 439U +#define SC_R_DMA_2_CH18 440U +#define SC_R_DMA_2_CH19 441U +#define SC_R_DMA_2_CH20 442U +#define SC_R_DMA_2_CH21 443U +#define SC_R_DMA_2_CH22 444U +#define SC_R_DMA_2_CH23 445U +#define SC_R_DMA_2_CH24 446U +#define SC_R_DMA_2_CH25 447U +#define SC_R_DMA_2_CH26 448U +#define SC_R_DMA_2_CH27 449U +#define SC_R_DMA_2_CH28 450U +#define SC_R_DMA_2_CH29 451U +#define SC_R_DMA_2_CH30 452U +#define SC_R_DMA_2_CH31 453U +#define SC_R_ASRC_1 454U +#define SC_R_ESAI_1 455U +#define SC_R_SAI_6 456U +#define SC_R_SAI_7 457U +#define SC_R_AMIX 458U +#define SC_R_MQS_0 459U +#define SC_R_DMA_3_CH0 460U +#define SC_R_DMA_3_CH1 461U +#define SC_R_DMA_3_CH2 462U +#define SC_R_DMA_3_CH3 463U +#define SC_R_DMA_3_CH4 464U +#define SC_R_DMA_3_CH5 465U +#define SC_R_DMA_3_CH6 466U +#define SC_R_DMA_3_CH7 467U +#define SC_R_DMA_3_CH8 468U +#define SC_R_DMA_3_CH9 469U +#define SC_R_DMA_3_CH10 470U +#define SC_R_DMA_3_CH11 471U +#define SC_R_DMA_3_CH12 472U +#define SC_R_DMA_3_CH13 473U +#define SC_R_DMA_3_CH14 474U +#define SC_R_DMA_3_CH15 475U +#define SC_R_DMA_3_CH16 476U +#define SC_R_DMA_3_CH17 477U +#define SC_R_DMA_3_CH18 478U +#define SC_R_DMA_3_CH19 479U +#define SC_R_DMA_3_CH20 480U +#define SC_R_DMA_3_CH21 481U +#define SC_R_DMA_3_CH22 482U +#define SC_R_DMA_3_CH23 483U +#define SC_R_DMA_3_CH24 484U +#define SC_R_DMA_3_CH25 485U +#define SC_R_DMA_3_CH26 486U +#define SC_R_DMA_3_CH27 487U +#define SC_R_DMA_3_CH28 488U +#define SC_R_DMA_3_CH29 489U +#define SC_R_DMA_3_CH30 490U +#define SC_R_DMA_3_CH31 491U +#define SC_R_AUDIO_PLL_1 492U +#define SC_R_AUDIO_CLK_0 493U +#define SC_R_AUDIO_CLK_1 494U +#define SC_R_MCLK_OUT_0 495U +#define SC_R_MCLK_OUT_1 496U +#define SC_R_PMIC_0 497U +#define SC_R_PMIC_1 498U +#define SC_R_SECO 499U +#define SC_R_CAAM_JR1 500U +#define SC_R_CAAM_JR2 501U +#define SC_R_CAAM_JR3 502U +#define SC_R_SECO_MU_2 503U +#define SC_R_SECO_MU_3 504U +#define SC_R_SECO_MU_4 505U +#define SC_R_HDMI_RX_PWM_0 506U +#define SC_R_AP_2 507U +#define SC_R_AP_2_0 508U +#define SC_R_AP_2_1 509U +#define SC_R_AP_2_2 510U +#define SC_R_AP_2_3 511U +#define SC_R_DSP 512U +#define SC_R_DSP_RAM 513U +#define SC_R_CAAM_JR1_OUT 514U +#define SC_R_CAAM_JR2_OUT 515U +#define SC_R_CAAM_JR3_OUT 516U +#define SC_R_VPU_DEC_0 517U +#define SC_R_VPU_ENC_0 518U +#define SC_R_CAAM_JR0 519U +#define SC_R_CAAM_JR0_OUT 520U +#define SC_R_PMIC_2 521U +#define SC_R_DBLOGIC 522U +#define SC_R_HDMI_PLL_1 523U +#define SC_R_BOARD_R0 524U +#define SC_R_BOARD_R1 525U +#define SC_R_BOARD_R2 526U +#define SC_R_BOARD_R3 527U +#define SC_R_BOARD_R4 528U +#define SC_R_BOARD_R5 529U +#define SC_R_BOARD_R6 530U +#define SC_R_BOARD_R7 531U +#define SC_R_MJPEG_0_DEC_MP 532U +#define SC_R_MJPEG_0_ENC_MP 533U +#define SC_R_VPU_TS_0 534U +#define SC_R_VPU_MU_0 535U +#define SC_R_VPU_MU_1 536U +#define SC_R_VPU_MU_2 537U +#define SC_R_VPU_MU_3 538U +#define SC_R_VPU_ENC_1 539U +#define SC_R_VPU 540U +#define SC_R_DMA_5_CH0 541U +#define SC_R_DMA_5_CH1 542U +#define SC_R_DMA_5_CH2 543U +#define SC_R_DMA_5_CH3 544U +#define SC_R_ATTESTATION 545U +#define SC_R_LAST 546U +#define SC_R_ALL ((sc_rsrc_t) UINT16_MAX) /*!< All resources */ +/** @} */ + +/*! + * @name Compatibility defines for sc_rsrc_t + */ +/** @{ */ +#define SC_R_A35 SC_R_AP_2 +#define SC_R_A35_0 SC_R_AP_2_0 +#define SC_R_A35_1 SC_R_AP_2_1 +#define SC_R_A35_2 SC_R_AP_2_2 +#define SC_R_A35_3 SC_R_AP_2_3 +#define SC_R_A53 SC_R_AP_0 +#define SC_R_A53_0 SC_R_AP_0_0 +#define SC_R_A53_1 SC_R_AP_0_1 +#define SC_R_A53_2 SC_R_AP_0_2 +#define SC_R_A53_3 SC_R_AP_0_3 +#define SC_R_A72 SC_R_AP_1 +#define SC_R_A72_0 SC_R_AP_1_0 +#define SC_R_A72_1 SC_R_AP_1_1 +#define SC_R_A72_2 SC_R_AP_1_2 +#define SC_R_A72_3 SC_R_AP_1_3 +#define SC_R_GIC SC_R_GIC_0 +#define SC_R_HSIO_GPIO SC_R_HSIO_GPIO_0 +#define SC_R_IEE SC_R_IEE_0 +#define SC_R_IEE_R0 SC_R_IEE_0_R0 +#define SC_R_IEE_R1 SC_R_IEE_0_R1 +#define SC_R_IEE_R2 SC_R_IEE_0_R2 +#define SC_R_IEE_R3 SC_R_IEE_0_R3 +#define SC_R_IEE_R4 SC_R_IEE_0_R4 +#define SC_R_IEE_R5 SC_R_IEE_0_R5 +#define SC_R_IEE_R6 SC_R_IEE_0_R6 +#define SC_R_IEE_R7 SC_R_IEE_0_R7 +#define SC_R_IRQSTR_M4_0 SC_R_IRQSTR_MCU_0 +#define SC_R_IRQSTR_M4_1 SC_R_IRQSTR_MCU_1 +#define SC_R_IRQSTR_SCU2 SC_R_IRQSTR_AP_0 +#define SC_R_ISI_CH0 SC_R_ISI_0_CH0 +#define SC_R_ISI_CH1 SC_R_ISI_0_CH1 +#define SC_R_ISI_CH2 SC_R_ISI_0_CH2 +#define SC_R_ISI_CH3 SC_R_ISI_0_CH3 +#define SC_R_ISI_CH4 SC_R_ISI_0_CH4 +#define SC_R_ISI_CH5 SC_R_ISI_0_CH5 +#define SC_R_ISI_CH6 SC_R_ISI_0_CH6 +#define SC_R_ISI_CH7 SC_R_ISI_0_CH7 +#define SC_R_M4_0_I2C SC_R_MCU_0_I2C +#define SC_R_M4_0_INTMUX SC_R_MCU_0_INTMUX +#define SC_R_M4_0_MU_0A0 SC_R_MCU_0_MU_0A0 +#define SC_R_M4_0_MU_0A1 SC_R_MCU_0_MU_0A1 +#define SC_R_M4_0_MU_0A2 SC_R_MCU_0_MU_0A2 +#define SC_R_M4_0_MU_0A3 SC_R_MCU_0_MU_0A3 +#define SC_R_M4_0_MU_0B SC_R_MCU_0_MU_0B +#define SC_R_M4_0_MU_1A SC_R_MCU_0_MU_1A +#define SC_R_M4_0_PID0 SC_R_MCU_0_PID0 +#define SC_R_M4_0_PID1 SC_R_MCU_0_PID1 +#define SC_R_M4_0_PID2 SC_R_MCU_0_PID2 +#define SC_R_M4_0_PID3 SC_R_MCU_0_PID3 +#define SC_R_M4_0_PID4 SC_R_MCU_0_PID4 +#define SC_R_M4_0_PIT SC_R_MCU_0_PIT +#define SC_R_M4_0_RGPIO SC_R_MCU_0_RGPIO +#define SC_R_M4_0_SEMA42 SC_R_MCU_0_SEMA42 +#define SC_R_M4_0_TPM SC_R_MCU_0_TPM +#define SC_R_M4_0_UART SC_R_MCU_0_UART +#define SC_R_M4_1_I2C SC_R_MCU_1_I2C +#define SC_R_M4_1_INTMUX SC_R_MCU_1_INTMUX +#define SC_R_M4_1_MU_0A0 SC_R_MCU_1_MU_0A0 +#define SC_R_M4_1_MU_0A1 SC_R_MCU_1_MU_0A1 +#define SC_R_M4_1_MU_0A2 SC_R_MCU_1_MU_0A2 +#define SC_R_M4_1_MU_0A3 SC_R_MCU_1_MU_0A3 +#define SC_R_M4_1_MU_0B SC_R_MCU_1_MU_0B +#define SC_R_M4_1_MU_1A SC_R_MCU_1_MU_1A +#define SC_R_M4_1_PID0 SC_R_MCU_1_PID0 +#define SC_R_M4_1_PID1 SC_R_MCU_1_PID1 +#define SC_R_M4_1_PID2 SC_R_MCU_1_PID2 +#define SC_R_M4_1_PID3 SC_R_MCU_1_PID3 +#define SC_R_M4_1_PID4 SC_R_MCU_1_PID4 +#define SC_R_M4_1_PIT SC_R_MCU_1_PIT +#define SC_R_M4_1_RGPIO SC_R_MCU_1_RGPIO +#define SC_R_M4_1_SEMA42 SC_R_MCU_1_SEMA42 +#define SC_R_M4_1_TPM SC_R_MCU_1_TPM +#define SC_R_M4_1_UART SC_R_MCU_1_UART +#define SC_R_MJPEG_DEC_MP SC_R_MJPEG_0_DEC_MP +#define SC_R_MJPEG_DEC_S0 SC_R_MJPEG_0_DEC_S0 +#define SC_R_MJPEG_DEC_S1 SC_R_MJPEG_0_DEC_S1 +#define SC_R_MJPEG_DEC_S2 SC_R_MJPEG_0_DEC_S2 +#define SC_R_MJPEG_DEC_S3 SC_R_MJPEG_0_DEC_S3 +#define SC_R_MJPEG_ENC_MP SC_R_MJPEG_0_ENC_MP +#define SC_R_MJPEG_ENC_S0 SC_R_MJPEG_0_ENC_S0 +#define SC_R_MJPEG_ENC_S1 SC_R_MJPEG_0_ENC_S1 +#define SC_R_MJPEG_ENC_S2 SC_R_MJPEG_0_ENC_S2 +#define SC_R_MJPEG_ENC_S3 SC_R_MJPEG_0_ENC_S3 +#define SC_R_PERF SC_R_PERF_0 +#define SC_R_SMMU SC_R_SMMU_0 +/** @} */ + +/*! + * Define for ATF/Linux. Not used by SCFW. Not a valid parameter + * for any SCFW API calls! + */ +#define SC_R_NONE 0xFFF0U + +/* NOTE - please add by replacing some of the UNUSED from above! */ + +/*! + * Defines for sc_ctrl_t + */ +#define SC_C_TEMP 0U +#define SC_C_TEMP_HI 1U +#define SC_C_TEMP_LOW 2U +#define SC_C_PXL_LINK_MST1_ADDR 3U +#define SC_C_PXL_LINK_MST2_ADDR 4U +#define SC_C_PXL_LINK_MST_ENB 5U +#define SC_C_PXL_LINK_MST1_ENB 6U +#define SC_C_PXL_LINK_MST2_ENB 7U +#define SC_C_PXL_LINK_SLV1_ADDR 8U +#define SC_C_PXL_LINK_SLV2_ADDR 9U +#define SC_C_PXL_LINK_MST_VLD 10U +#define SC_C_PXL_LINK_MST1_VLD 11U +#define SC_C_PXL_LINK_MST2_VLD 12U +#define SC_C_SINGLE_MODE 13U +#define SC_C_ID 14U +#define SC_C_PXL_CLK_POLARITY 15U +#define SC_C_LINESTATE 16U +#define SC_C_PCIE_G_RST 17U +#define SC_C_PCIE_BUTTON_RST 18U +#define SC_C_PCIE_PERST 19U +#define SC_C_PHY_RESET 20U +#define SC_C_PXL_LINK_RATE_CORRECTION 21U +#define SC_C_PANIC 22U +#define SC_C_PRIORITY_GROUP 23U +#define SC_C_TXCLK 24U +#define SC_C_CLKDIV 25U +#define SC_C_DISABLE_50 26U +#define SC_C_DISABLE_125 27U +#define SC_C_SEL_125 28U +#define SC_C_MODE 29U +#define SC_C_SYNC_CTRL0 30U +#define SC_C_KACHUNK_CNT 31U +#define SC_C_KACHUNK_SEL 32U +#define SC_C_SYNC_CTRL1 33U +#define SC_C_DPI_RESET 34U +#define SC_C_MIPI_RESET 35U +#define SC_C_DUAL_MODE 36U +#define SC_C_VOLTAGE 37U +#define SC_C_PXL_LINK_SEL 38U +#define SC_C_OFS_SEL 39U +#define SC_C_OFS_AUDIO 40U +#define SC_C_OFS_PERIPH 41U +#define SC_C_OFS_IRQ 42U +#define SC_C_RST0 43U +#define SC_C_RST1 44U +#define SC_C_SEL0 45U +#define SC_C_CALIB0 46U +#define SC_C_CALIB1 47U +#define SC_C_CALIB2 48U +#define SC_C_IPG_DEBUG 49U +#define SC_C_IPG_DOZE 50U +#define SC_C_IPG_WAIT 51U +#define SC_C_IPG_STOP 52U +#define SC_C_IPG_STOP_MODE 53U +#define SC_C_IPG_STOP_ACK 54U +#define SC_C_SYNC_CTRL 55U +#define SC_C_OFS_AUDIO_ALT 56U +#define SC_C_DSP_BYP 57U +#define SC_C_CLK_GEN_EN 58U +#define SC_C_INTF_SEL 59U +#define SC_C_RXC_DLY 60U +#define SC_C_TIMER_SEL 61U +#define SC_C_MISC0 62U +#define SC_C_MISC1 63U +#define SC_C_MISC2 64U +#define SC_C_MISC3 65U +#define SC_C_LAST 66U + +/*! + * Define for used to specify all pads + */ +#define SC_P_ALL ((sc_pad_t) UINT16_MAX) /*!< All pads */ + +/* Types */ + +/*! + * This type is used to store a boolean. + */ +typedef uint8_t sc_bool_t; + +/*! + * This type is used to store a system (full-size) address. + */ +typedef uint64_t sc_faddr_t; + +/*! + * This type is used to indicate error response for most functions. + */ +typedef uint8_t sc_err_t; + +/*! + * This type is used to indicate a resource. Resources include peripherals + * and bus masters (but not memory regions). Note items from list should + * never be changed or removed (only added to at the end of the list). + */ +typedef uint16_t sc_rsrc_t; + +/*! + * This type is used to indicate a control. + */ +typedef uint32_t sc_ctrl_t; + +/*! + * This type is used to indicate a pad. Valid values are SoC specific. + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +typedef uint16_t sc_pad_t; + +#ifdef DOXYGEN + /* Extra documentation of standard types */ + + /*! + * Type used to declare an 8-bit integer. + */ + typedef __INT8_TYPE__ int8_t; + + /*! + * Type used to declare a 16-bit integer. + */ + typedef __INT16_TYPE__ int16_t; + + /*! + * Type used to declare a 32-bit integer. + */ + typedef __INT32_TYPE__ int32_t; + + /*! + * Type used to declare a 64-bit integer. + */ + typedef __INT64_TYPE__ int64_t; + + /*! + * Type used to declare an 8-bit unsigned integer. + */ + typedef __UINT8_TYPE__ uint8_t; + + /*! + * Type used to declare a 16-bit unsigned integer. + */ + typedef __UINT16_TYPE__ uint16_t; + + /*! + * Type used to declare a 32-bit unsigned integer. + */ + typedef __UINT32_TYPE__ uint32_t; + + /*! + * Type used to declare a 64-bit unsigned integer. + */ + typedef __UINT64_TYPE__ uint64_t; +#endif + +#endif /* SC_TYPES_H */ + diff --git a/platform/soc/MX8DXL/Makefile b/platform/soc/MX8DXL/Makefile new file mode 100755 index 0000000..da097a7 --- /dev/null +++ b/platform/soc/MX8DXL/Makefile @@ -0,0 +1,7 @@ + +OBJS += $(OUT)/soc/MX8DXL/soc.o +OBJS += $(OUT)/soc/common/soc_common.o + +DIRS += $(OUT)/soc/MX8DXL +DIRS += $(OUT)/soc/common + diff --git a/platform/soc/MX8QM/Makefile b/platform/soc/MX8QM/Makefile new file mode 100755 index 0000000..3e8695d --- /dev/null +++ b/platform/soc/MX8QM/Makefile @@ -0,0 +1,7 @@ + +OBJS += $(OUT)/soc/MX8QM/soc.o +OBJS += $(OUT)/soc/common/soc_common.o + +DIRS += $(OUT)/soc/MX8QM +DIRS += $(OUT)/soc/common + diff --git a/platform/soc/MX8QX/Makefile b/platform/soc/MX8QX/Makefile new file mode 100755 index 0000000..7f837d9 --- /dev/null +++ b/platform/soc/MX8QX/Makefile @@ -0,0 +1,7 @@ + +OBJS += $(OUT)/soc/MX8QX/soc.o +OBJS += $(OUT)/soc/common/soc_common.o + +DIRS += $(OUT)/soc/MX8QX +DIRS += $(OUT)/soc/common + diff --git a/platform/ss/a35/v1/Makefile b/platform/ss/a35/v1/Makefile new file mode 100755 index 0000000..65a49d3 --- /dev/null +++ b/platform/ss/a35/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/a35/v1/ss.o + +CONFIGH += $(SRC)/ss/a35/v1/config.h $(SRC)/ss/a35/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/a35/v1/resource.txt + +CLK_MD += $(SRC)/ss/a35/v1/clock.txt + +CTRL_MD += $(SRC)/ss/a35/v1/control.txt + +DIRS += $(OUT)/ss/a35/v1 + diff --git a/platform/ss/a35/v1/dsc.h b/platform/ss/a35/v1/dsc.h new file mode 100755 index 0000000..b4e8e36 --- /dev/null +++ b/platform/ss/a35/v1/dsc.h @@ -0,0 +1,214 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup A35_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A35_DSC_H +#define SC_SS_A35_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_CORE0_POR REGBIT(0, 2) +#define RST_CORE1_POR REGBIT(0, 3) +#define RST_CORE2_POR REGBIT(0, 4) +#define RST_CORE3_POR REGBIT(0, 5) +#define RST_DEBUG REGBIT(0, 6) +#define RST_BIST REGBIT(0, 7) + +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_RESET_VECTOR REGBIT(0, 17) +#define GPR_L2_REQ REGBIT(0, 20) +#define GPR_L2_FLUSH_REQ REGBIT(0, 21) +#define GPR_L2_RST_INV_DISABLE REGBIT(0, 22) +#define GPR_DBG_L1_RST_DIS REGBIT(0, 23) +#define GPR_EDBG_RQ0 REGBIT(0, 24) +#define GPR_EDBG_RQ1 REGBIT(0, 25) +#define GPR_EDBG_RQ2 REGBIT(0, 26) +#define GPR_EDBG_RQ3 REGBIT(0, 27) +#define GPR_CLUSTERIDAFF1_0 REGBIT(0, 28) +#define GPR_CLUSTERIDAFF1_1 REGBIT(0, 29) +#define GPR_ADBGIC_PWRDNREQN REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_EVENTO_RESET REGBIT(1, 4) +#define GPR_NEON_REQ0 REGBIT(1, 8) +#define GPR_NEON_REQ1 REGBIT(1, 9) +#define GPR_NEON_REQ2 REGBIT(1, 10) +#define GPR_NEON_REQ3 REGBIT(1, 11) +#define GPR_CPUQ_REQ0 REGBIT(1, 12) +#define GPR_CPUQ_REQ1 REGBIT(1, 13) +#define GPR_CPUQ_REQ2 REGBIT(1, 14) +#define GPR_CPUQ_REQ3 REGBIT(1, 15) +#define GPR_RST_CORE0 REGBIT(1, 16) +#define GPR_RST_CORE1 REGBIT(1, 17) +#define GPR_RST_CORE2 REGBIT(1, 18) +#define GPR_RST_CORE3 REGBIT(1, 19) +#define GPR_DBG_PWRD_UP0 REGBIT(1, 20) +#define GPR_DBG_PWRD_UP1 REGBIT(1, 21) +#define GPR_DBG_PWRD_UP2 REGBIT(1, 22) +#define GPR_DBG_PWRD_UP3 REGBIT(1, 23) +#define GPR_EVENTI REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_L2_ACTIVE_A35 REGBIT(0, 24) +#define GPS_L2_DENY_A35 REGBIT(0, 25) +#define GPS_L2_ACCEPT_B_A35 REGBIT(0, 26) +#define GPS_L2_FLUSHDONE_A35 REGBIT(0, 27) +#define GPS_ADBGIC_PWRDNACKN REGBIT(0, 28) +#define GPS_EVENTO REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_CPUQ_DENY0 REGBIT(1, 0) +#define GPS_CPUQ_DENY1 REGBIT(1, 1) +#define GPS_CPUQ_DENY2 REGBIT(1, 2) +#define GPS_CPUQ_DENY3 REGBIT(1, 3) +#define GPS_CPUQ_ACCEPT_B0 REGBIT(1, 4) +#define GPS_CPUQ_ACCEPT_B1 REGBIT(1, 5) +#define GPS_CPUQ_ACCEPT_B2 REGBIT(1, 6) +#define GPS_CPUQ_ACCEPT_B3 REGBIT(1, 7) +#define GPS_NEON_ACTIVE0 REGBIT(1, 8) +#define GPS_NEON_ACTIVE1 REGBIT(1, 9) +#define GPS_NEON_ACTIVE2 REGBIT(1, 10) +#define GPS_NEON_ACTIVE3 REGBIT(1, 11) +#define GPS_NEON_DENY0 REGBIT(1, 12) +#define GPS_NEON_DENY1 REGBIT(1, 13) +#define GPS_NEON_DENY2 REGBIT(1, 14) +#define GPS_NEON_DENY3 REGBIT(1, 15) +#define GPS_NEON_ACCEPT0_B REGBIT(1, 16) +#define GPS_NEON_ACCEPT1_B REGBIT(1, 17) +#define GPS_NEON_ACCEPT2_B REGBIT(1, 18) +#define GPS_NEON_ACCEPT3_B REGBIT(1, 19) +#define GPS_CPUQ_ACTIVE0 REGBIT(1, 20) +#define GPS_CPUQ_ACTIVE1 REGBIT(1, 21) +#define GPS_CPUQ_ACTIVE2 REGBIT(1, 22) +#define GPS_CPUQ_ACTIVE3 REGBIT(1, 23) +#define GPS_STANDBYWFI0 REGBIT(1, 24) +#define GPS_STANDBYWFI1 REGBIT(1, 25) +#define GPS_STANDBYWFI2 REGBIT(1, 26) +#define GPS_STANDBYWFI3 REGBIT(1, 27) +#define GPS_STANDBYWFE0 REGBIT(1, 28) +#define GPS_STANDBYWFE1 REGBIT(1, 29) +#define GPS_STANDBYWFE2 REGBIT(1, 30) +#define GPS_STANDBYWFE3 REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 2 Bit Definitions + */ +/** @{ */ +#define GPS_DBG_RST_REQ0 REGBIT(2, 0) +#define GPS_DBG_RST_REQ1 REGBIT(2, 1) +#define GPS_DBG_RST_REQ2 REGBIT(2, 2) +#define GPS_DBG_RST_REQ3 REGBIT(2, 3) +#define GPS_DBG_NOPWRDWN0 REGBIT(2, 4) +#define GPS_DBG_NOPWRDWN1 REGBIT(2, 5) +#define GPS_DBG_NOPWRDWN2 REGBIT(2, 6) +#define GPS_DBG_NOPWRDWN3 REGBIT(2, 7) +#define GPS_DBG_PWR_UP_REQ0 REGBIT(2, 8) +#define GPS_DBG_PWR_UP_REQ1 REGBIT(2, 9) +#define GPS_DBG_PWR_UP_REQ2 REGBIT(2, 10) +#define GPS_DBG_PWR_UP_REQ3 REGBIT(2, 11) +#define GPS_DBG_ACK0 REGBIT(2, 12) +#define GPS_DBG_ACK1 REGBIT(2, 13) +#define GPS_DBG_ACK2 REGBIT(2, 14) +#define GPS_DBG_ACK3 REGBIT(2, 15) +#define GPS_WARM_RESET_REQ0 REGBIT(2, 16) +#define GPS_WARM_RESET_REQ1 REGBIT(2, 17) +#define GPS_WARM_RESET_REQ2 REGBIT(2, 18) +#define GPS_WARM_RESET_REQ3 REGBIT(2, 19) +#define GPS_STANDBYWFIL2_A35 REGBIT(2, 20) +#define GPS_CACTIVES_A35_GIC REGBIT(2, 21) +#define GPS_CACTIVEM_A35_GIC REGBIT(2, 22) +#define GPS_SMPEN0 REGBIT(2, 24) +#define GPS_SMPEN1 REGBIT(2, 25) +#define GPS_SMPEN2 REGBIT(2, 26) +#define GPS_SMPEN3 REGBIT(2, 27) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_EVENTO REGBIT64(1, 0) +#define IRQ_CLREXMONACK REGBIT64(1, 1) +#define IRQ_L2_FLUSHDONE REGBIT64(1, 2) +#define IRQ_L2_DENY REGBIT64(1, 7) +#define IRQ_L2_ACCEPT_B REGBIT64(1, 8) +#define IRQ_STANDBYWFI REGBIT64(1, 9) +#define IRQ_STANDBYWFIL2 REGBIT64(1, 13) +#define IRQ_DBG_ACK REGBIT64(1, 14) +#define IRQ_CA35_COMM_IRQ_B REGBIT64(1, 15) +#define IRQ_DBG_RST_REQ REGBIT64(1, 16) +#define IRQ_DBG_PWR_UP_REQ REGBIT64(1, 17) +#define IRQ_PWR_DN_ACKN_TO_GIC_SLV REGBIT64(1, 18) +#define IRQ_WARMRESETREQ REGBIT64(1, 20) + +/** @} */ + +#endif /* SC_SS_A35_DSC_H */ + +/** @} */ diff --git a/platform/ss/a35/v1/ss.h b/platform/ss/a35/v1/ss.h new file mode 100755 index 0000000..d32661b --- /dev/null +++ b/platform/ss/a35/v1/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the A35 subsystem API. + * + * @addtogroup A35_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A35_SS_H +#define SC_SS_A35_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(a35) + +/* Functions */ + +SS_FUNC_PROTO_A35 + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_a35[]; + +#endif /* SC_SS_A35_SS_H */ + +/** @} */ + diff --git a/platform/ss/a35/v2/Makefile b/platform/ss/a35/v2/Makefile new file mode 100755 index 0000000..da971d8 --- /dev/null +++ b/platform/ss/a35/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/a35/v2/ss.o + +CONFIGH += $(SRC)/ss/a35/v2/config.h $(SRC)/ss/a35/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/a35/v2/resource.txt + +CLK_MD += $(SRC)/ss/a35/v2/clock.txt + +CTRL_MD += $(SRC)/ss/a35/v2/control.txt + +DIRS += $(OUT)/ss/a35/v2 + diff --git a/platform/ss/a35/v2/dsc.h b/platform/ss/a35/v2/dsc.h new file mode 100755 index 0000000..193b672 --- /dev/null +++ b/platform/ss/a35/v2/dsc.h @@ -0,0 +1,174 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup A35_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A35_DSC_H +#define SC_SS_A35_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_CORE0_POR REGBIT(0, 2) +#define RST_CORE1_POR REGBIT(0, 3) +#define RST_DEBUG REGBIT(0, 6) +#define RST_BIST REGBIT(0, 7) + +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_RESET_VECTOR REGBIT(0, 17) +#define GPR_L2_REQ REGBIT(0, 20) +#define GPR_L2_FLUSH_REQ REGBIT(0, 21) +#define GPR_L2_RST_INV_DISABLE REGBIT(0, 22) +#define GPR_DBG_L1_RST_DIS REGBIT(0, 23) +#define GPR_EDBG_RQ0 REGBIT(0, 24) +#define GPR_EDBG_RQ1 REGBIT(0, 25) +#define GPR_CLUSTERIDAFF1_0 REGBIT(0, 28) +#define GPR_CLUSTERIDAFF1_1 REGBIT(0, 29) +#define GPR_ADBGIC_PWRDNREQN REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_EVENTO_RESET REGBIT(1, 4) +#define GPR_NEON_REQ0 REGBIT(1, 8) +#define GPR_NEON_REQ1 REGBIT(1, 9) +#define GPR_CPUQ_REQ0 REGBIT(1, 12) +#define GPR_CPUQ_REQ1 REGBIT(1, 13) +#define GPR_RST_CORE0 REGBIT(1, 16) +#define GPR_RST_CORE1 REGBIT(1, 17) +#define GPR_DBG_PWRD_UP0 REGBIT(1, 20) +#define GPR_DBG_PWRD_UP1 REGBIT(1, 21) +#define GPR_EVENTI REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_L2_ACTIVE_A35 REGBIT(0, 24) +#define GPS_L2_DENY_A35 REGBIT(0, 25) +#define GPS_L2_ACCEPT_B_A35 REGBIT(0, 26) +#define GPS_L2_FLUSHDONE_A35 REGBIT(0, 27) +#define GPS_ADBGIC_PWRDNACKN REGBIT(0, 28) +#define GPS_EVENTO REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_CPUQ_DENY0 REGBIT(1, 0) +#define GPS_CPUQ_DENY1 REGBIT(1, 1) +#define GPS_CPUQ_ACCEPT_B0 REGBIT(1, 4) +#define GPS_CPUQ_ACCEPT_B1 REGBIT(1, 5) +#define GPS_NEON_ACTIVE0 REGBIT(1, 8) +#define GPS_NEON_ACTIVE1 REGBIT(1, 9) +#define GPS_NEON_DENY0 REGBIT(1, 12) +#define GPS_NEON_DENY1 REGBIT(1, 13) +#define GPS_NEON_ACCEPT0_B REGBIT(1, 16) +#define GPS_NEON_ACCEPT1_B REGBIT(1, 17) +#define GPS_CPUQ_ACTIVE0 REGBIT(1, 20) +#define GPS_CPUQ_ACTIVE1 REGBIT(1, 21) +#define GPS_STANDBYWFI0 REGBIT(1, 24) +#define GPS_STANDBYWFI1 REGBIT(1, 25) +#define GPS_STANDBYWFE0 REGBIT(1, 28) +#define GPS_STANDBYWFE1 REGBIT(1, 29) +/** @} */ + +/*! + * @name GPR Status 2 Bit Definitions + */ +/** @{ */ +#define GPS_DBG_RST_REQ0 REGBIT(2, 0) +#define GPS_DBG_RST_REQ1 REGBIT(2, 1) +#define GPS_DBG_NOPWRDWN0 REGBIT(2, 4) +#define GPS_DBG_NOPWRDWN1 REGBIT(2, 5) +#define GPS_DBG_PWR_UP_REQ0 REGBIT(2, 8) +#define GPS_DBG_PWR_UP_REQ1 REGBIT(2, 9) +#define GPS_DBG_ACK0 REGBIT(2, 12) +#define GPS_DBG_ACK1 REGBIT(2, 13) +#define GPS_WARM_RESET_REQ0 REGBIT(2, 16) +#define GPS_WARM_RESET_REQ1 REGBIT(2, 17) +#define GPS_STANDBYWFIL2_A35 REGBIT(2, 20) +#define GPS_CACTIVES_A35_GIC REGBIT(2, 21) +#define GPS_CACTIVEM_A35_GIC REGBIT(2, 22) +#define GPS_SMPEN0 REGBIT(2, 24) +#define GPS_SMPEN1 REGBIT(2, 25) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_EVENTO REGBIT64(1, 0) +#define IRQ_CLREXMONACK REGBIT64(1, 1) +#define IRQ_L2_FLUSHDONE REGBIT64(1, 2) +#define IRQ_L2_DENY REGBIT64(1, 7) +#define IRQ_L2_ACCEPT_B REGBIT64(1, 8) +#define IRQ_STANDBYWFI REGBIT64(1, 9) +#define IRQ_STANDBYWFIL2 REGBIT64(1, 13) +#define IRQ_DBG_ACK REGBIT64(1, 14) +#define IRQ_CA35_COMM_IRQ_B REGBIT64(1, 15) +#define IRQ_DBG_RST_REQ REGBIT64(1, 16) +#define IRQ_DBG_PWR_UP_REQ REGBIT64(1, 17) +#define IRQ_PWR_DN_ACKN_TO_GIC_SLV REGBIT64(1, 18) +#define IRQ_WARMRESETREQ REGBIT64(1, 20) + +/** @} */ + +#endif /* SC_SS_A35_DSC_H */ + +/** @} */ diff --git a/platform/ss/a35/v2/ss.h b/platform/ss/a35/v2/ss.h new file mode 100755 index 0000000..71c4a5b --- /dev/null +++ b/platform/ss/a35/v2/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2018-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the A35 subsystem API. + * + * @addtogroup A35_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A35_SS_H +#define SC_SS_A35_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(a35) + +/* Functions */ + +SS_FUNC_PROTO_A35 + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_a35[]; + +#endif /* SC_SS_A35_SS_H */ + +/** @} */ + diff --git a/platform/ss/a53/v1/Makefile b/platform/ss/a53/v1/Makefile new file mode 100755 index 0000000..b00b64d --- /dev/null +++ b/platform/ss/a53/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/a53/v1/ss.o + +CONFIGH += $(SRC)/ss/a53/v1/config.h $(SRC)/ss/a53/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/a53/v1/resource.txt + +CLK_MD += $(SRC)/ss/a53/v1/clock.txt + +CTRL_MD += $(SRC)/ss/a53/v1/control.txt + +DIRS += $(OUT)/ss/a53/v1 + diff --git a/platform/ss/a53/v1/config.h b/platform/ss/a53/v1/config.h new file mode 100644 index 0000000..2a638a1 --- /dev/null +++ b/platform/ss/a53/v1/config.h @@ -0,0 +1,147 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the A53 subsystem. + * + * @addtogroup A53_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_A53_CONFIG_H +#define SC_SS_A53_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_A53 5U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_A53 \ + void ss_init_a53(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_set_cpu_power_mode_a53(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t \ + wake_src); \ + sc_err_t ss_set_cpu_resume_a53(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); \ + sc_err_t ss_req_sys_if_power_mode_a53(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, \ + sc_pm_power_mode_t lpm); \ + sc_err_t ss_set_clock_rate_a53(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_cpu_start_a53(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_rdc_set_master_a53(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_updown_a53(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_a53(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + void ss_link_enable_a53(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_adb_enable_a53(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_adb_wait_a53(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_A53 \ + { \ + ss_init_a53, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_a53, \ + ss_set_cpu_resume_a53, \ + ss_req_sys_if_power_mode_a53, \ + ss_set_clock_rate_a53, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_a53, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_a53, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_a53, \ + ss_prepost_power_mode_a53, \ + ss_iso_disable_base, \ + ss_link_enable_a53, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_a53, \ + ss_adb_wait_a53, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_A53_0 \ + "A53_0", \ + "A53_1", \ + "A53_2", \ + "A53_3", \ + "A53", \ + +#endif + +#endif /* SC_SS_A53_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/a53/v1/dsc.h b/platform/ss/a53/v1/dsc.h new file mode 100755 index 0000000..9ea0cf9 --- /dev/null +++ b/platform/ss/a53/v1/dsc.h @@ -0,0 +1,218 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup A53_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A53_DSC_H +#define SC_SS_A53_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_CORE0_POR REGBIT(0, 2) +#define RST_CORE1_POR REGBIT(0, 3) +#define RST_CORE2_POR REGBIT(0, 4) +#define RST_CORE3_POR REGBIT(0, 5) +#define RST_DEBUG REGBIT(0, 6) +#define RST_BIST REGBIT(0, 7) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_BROADCAST_INNER REGBIT(0, 16) +#define GPR_RESET_VECTOR REGBIT(0, 17) +#define GPR_L2_REQ REGBIT(0, 20) +#define GPR_L2_FLUSH_REQ REGBIT(0, 21) +#define GPR_L2_RST_INV_DISABLE REGBIT(0, 22) +#define GPR_DBG_L1_RST_DIS REGBIT(0, 23) +#define GPR_EDBG_RQ0 REGBIT(0, 24) +#define GPR_EDBG_RQ1 REGBIT(0, 25) +#define GPR_EDBG_RQ2 REGBIT(0, 26) +#define GPR_EDBG_RQ3 REGBIT(0, 27) +#define GPR_CLUSTERIDAFF1_0 REGBIT(0, 28) +#define GPR_CLUSTERIDAFF1_1 REGBIT(0, 29) +#define GPR_SYSBARDENABLE REGBIT(0, 30) +#define GPR_ADBGIC_PWRDNREQN REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_ACINACTM REGBIT(1, 1) +#define GPR_EVENTO_RESET REGBIT(1, 4) +#define GPR_NEON_REQ0 REGBIT(1, 8) +#define GPR_NEON_REQ1 REGBIT(1, 9) +#define GPR_NEON_REQ2 REGBIT(1, 10) +#define GPR_NEON_REQ3 REGBIT(1, 11) +#define GPR_CPUQ_REQ0 REGBIT(1, 12) +#define GPR_CPUQ_REQ1 REGBIT(1, 13) +#define GPR_CPUQ_REQ2 REGBIT(1, 14) +#define GPR_CPUQ_REQ3 REGBIT(1, 15) +#define GPR_RST_CORE0 REGBIT(1, 16) +#define GPR_RST_CORE1 REGBIT(1, 17) +#define GPR_RST_CORE2 REGBIT(1, 18) +#define GPR_RST_CORE3 REGBIT(1, 19) +#define GPR_DBG_PWRD_UP0 REGBIT(1, 20) +#define GPR_DBG_PWRD_UP1 REGBIT(1, 21) +#define GPR_DBG_PWRD_UP2 REGBIT(1, 22) +#define GPR_DBG_PWRD_UP3 REGBIT(1, 23) +#define GPR_EVENTI REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_L2_ACTIVE_A53 REGBIT(0, 24) +#define GPS_L2_DENY_A53 REGBIT(0, 25) +#define GPS_L2_ACCEPT_B_A53 REGBIT(0, 26) +#define GPS_L2_FLUSHDONE_A53 REGBIT(0, 27) +#define GPS_ADBGIC_PWRDNACKN REGBIT(0, 28) +#define GPS_EVENTO REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_CPUQ_DENY0 REGBIT(1, 0) +#define GPS_CPUQ_DENY1 REGBIT(1, 1) +#define GPS_CPUQ_DENY2 REGBIT(1, 2) +#define GPS_CPUQ_DENY3 REGBIT(1, 3) +#define GPS_CPUQ_ACCEPT_B0 REGBIT(1, 4) +#define GPS_CPUQ_ACCEPT_B1 REGBIT(1, 5) +#define GPS_CPUQ_ACCEPT_B2 REGBIT(1, 6) +#define GPS_CPUQ_ACCEPT_B3 REGBIT(1, 7) +#define GPS_NEON_ACTIVE0 REGBIT(1, 8) +#define GPS_NEON_ACTIVE1 REGBIT(1, 9) +#define GPS_NEON_ACTIVE2 REGBIT(1, 10) +#define GPS_NEON_ACTIVE3 REGBIT(1, 11) +#define GPS_NEON_DENY0 REGBIT(1, 12) +#define GPS_NEON_DENY1 REGBIT(1, 13) +#define GPS_NEON_DENY2 REGBIT(1, 14) +#define GPS_NEON_DENY3 REGBIT(1, 15) +#define GPS_NEON_ACCEPT0_B REGBIT(1, 16) +#define GPS_NEON_ACCEPT1_B REGBIT(1, 17) +#define GPS_NEON_ACCEPT2_B REGBIT(1, 18) +#define GPS_NEON_ACCEPT3_B REGBIT(1, 19) +#define GPS_CPUQ_ACTIVE0 REGBIT(1, 20) +#define GPS_CPUQ_ACTIVE1 REGBIT(1, 21) +#define GPS_CPUQ_ACTIVE2 REGBIT(1, 22) +#define GPS_CPUQ_ACTIVE3 REGBIT(1, 23) +#define GPS_STANDBYWFI0 REGBIT(1, 24) +#define GPS_STANDBYWFI1 REGBIT(1, 25) +#define GPS_STANDBYWFI2 REGBIT(1, 26) +#define GPS_STANDBYWFI3 REGBIT(1, 27) +#define GPS_STANDBYWFE0 REGBIT(1, 28) +#define GPS_STANDBYWFE1 REGBIT(1, 29) +#define GPS_STANDBYWFE2 REGBIT(1, 30) +#define GPS_STANDBYWFE3 REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 2 Bit Definitions + */ +/** @{ */ +#define GPS_DBG_RST_REQ0 REGBIT(2, 0) +#define GPS_DBG_RST_REQ1 REGBIT(2, 1) +#define GPS_DBG_RST_REQ2 REGBIT(2, 2) +#define GPS_DBG_RST_REQ3 REGBIT(2, 3) +#define GPS_DBG_NOPWRDWN0 REGBIT(2, 4) +#define GPS_DBG_NOPWRDWN1 REGBIT(2, 5) +#define GPS_DBG_NOPWRDWN2 REGBIT(2, 6) +#define GPS_DBG_NOPWRDWN3 REGBIT(2, 7) +#define GPS_DBG_PWR_UP_REQ0 REGBIT(2, 8) +#define GPS_DBG_PWR_UP_REQ1 REGBIT(2, 9) +#define GPS_DBG_PWR_UP_REQ2 REGBIT(2, 10) +#define GPS_DBG_PWR_UP_REQ3 REGBIT(2, 11) +#define GPS_DBG_ACK0 REGBIT(2, 12) +#define GPS_DBG_ACK1 REGBIT(2, 13) +#define GPS_DBG_ACK2 REGBIT(2, 14) +#define GPS_DBG_ACK3 REGBIT(2, 15) +#define GPS_WARM_RESET_REQ0 REGBIT(2, 16) +#define GPS_WARM_RESET_REQ1 REGBIT(2, 17) +#define GPS_WARM_RESET_REQ2 REGBIT(2, 18) +#define GPS_WARM_RESET_REQ3 REGBIT(2, 19) +#define GPS_STANDBYWFIL2_A53 REGBIT(2, 20) +#define GPS_CACTIVES_A53_GIC REGBIT(2, 21) +#define GPS_CACTIVEM_A53_GIC REGBIT(2, 22) +#define GPS_SMPEN0 REGBIT(2, 24) +#define GPS_SMPEN1 REGBIT(2, 25) +#define GPS_SMPEN2 REGBIT(2, 26) +#define GPS_SMPEN3 REGBIT(2, 27) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_EVENTO REGBIT64(1, 0) +#define IRQ_CLREXMONACK REGBIT64(1, 1) +#define IRQ_L2_FLUSHDONE REGBIT64(1, 2) +#define IRQ_NEON_DENY REGBIT64(1, 3) +#define IRQ_NEON_ACCEPT_B REGBIT64(1, 4) +#define IRQ_CPUQ_DENY REGBIT64(1, 5) +#define IRQ_CPUQ_ACCEPT_B REGBIT64(1, 6) +#define IRQ_L2_DENY REGBIT64(1, 7) +#define IRQ_L2_ACCEPT_B REGBIT64(1, 8) +#define IRQ_STANDBYWFI REGBIT64(1, 9) +#define IRQ_STANDBYWFIL2 REGBIT64(1, 13) +#define IRQ_DBG_ACK REGBIT64(1, 14) +#define IRQ_CA53_COMM_IRQ_B REGBIT64(1, 15) +#define IRQ_DBG_RST_REQ REGBIT64(1, 16) +#define IRQ_DBG_PWR_UP_REQ REGBIT64(1, 17) +#define IRQ_PWR_DN_ACKN_TO_GIC_SLV REGBIT64(1, 18) +/** @} */ + +#endif /* SC_SS_A53_DSC_H */ + +/** @} */ diff --git a/platform/ss/a53/v1/rsrc.h b/platform/ss/a53/v1/rsrc.h new file mode 100644 index 0000000..a23475c --- /dev/null +++ b/platform/ss/a53/v1/rsrc.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the A53 subsystem. + * + * @addtogroup A53_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_A53_RSRC_H +#define SC_SS_A53_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_A53_0 0U +#define SS_R_A53_1 1U +#define SS_R_A53_2 2U +#define SS_R_A53_3 3U +#define SS_R_A53 4U +/** @} */ + +#endif /* SC_SS_A53_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/a53/v1/ss.h b/platform/ss/a53/v1/ss.h new file mode 100755 index 0000000..3a48346 --- /dev/null +++ b/platform/ss/a53/v1/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the A53 subsystem API. + * + * @addtogroup A53_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A53_SS_H +#define SC_SS_A53_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(a53) + +/* Functions */ + +SS_FUNC_PROTO_A53 + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_a53[]; + +#endif /* SC_SS_A53_SS_H */ + +/** @} */ + diff --git a/platform/ss/a72/v1/Makefile b/platform/ss/a72/v1/Makefile new file mode 100755 index 0000000..0e5efcf --- /dev/null +++ b/platform/ss/a72/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/a72/v1/ss.o + +CONFIGH += $(SRC)/ss/a72/v1/config.h $(SRC)/ss/a72/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/a72/v1/resource.txt + +CLK_MD += $(SRC)/ss/a72/v1/clock.txt + +CTRL_MD += $(SRC)/ss/a72/v1/control.txt + +DIRS += $(OUT)/ss/a72/v1 + diff --git a/platform/ss/a72/v1/config.h b/platform/ss/a72/v1/config.h new file mode 100644 index 0000000..bb6613e --- /dev/null +++ b/platform/ss/a72/v1/config.h @@ -0,0 +1,145 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the A72 subsystem. + * + * @addtogroup A72_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_A72_CONFIG_H +#define SC_SS_A72_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_A72 3U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_A72 \ + void ss_init_a72(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_set_cpu_power_mode_a72(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t \ + wake_src); \ + sc_err_t ss_set_cpu_resume_a72(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); \ + sc_err_t ss_req_sys_if_power_mode_a72(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, \ + sc_pm_power_mode_t lpm); \ + sc_err_t ss_set_clock_rate_a72(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_cpu_start_a72(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_rdc_set_master_a72(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_updown_a72(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_a72(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + void ss_link_enable_a72(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_adb_enable_a72(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_adb_wait_a72(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_A72 \ + { \ + ss_init_a72, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_a72, \ + ss_set_cpu_resume_a72, \ + ss_req_sys_if_power_mode_a72, \ + ss_set_clock_rate_a72, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_a72, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_a72, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_a72, \ + ss_prepost_power_mode_a72, \ + ss_iso_disable_base, \ + ss_link_enable_a72, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_a72, \ + ss_adb_wait_a72, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_A72_0 \ + "A72_0", \ + "A72_1", \ + "A72", \ + +#endif + +#endif /* SC_SS_A72_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/a72/v1/dsc.h b/platform/ss/a72/v1/dsc.h new file mode 100755 index 0000000..300093d --- /dev/null +++ b/platform/ss/a72/v1/dsc.h @@ -0,0 +1,172 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup A72_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A72_DSC_H +#define SC_SS_A72_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_CORE0_POR REGBIT(0, 2) +#define RST_CORE1_POR REGBIT(0, 3) +#define RST_DEBUG REGBIT(0, 6) + +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_BROADCAST_INNER REGBIT(0, 16) +#define GPR_RESET_VECTOR REGBIT(0, 17) +#define GPR_L2_REQ REGBIT(0, 20) +#define GPR_L2_FLUSH_REQ REGBIT(0, 21) +#define GPR_L2_RST_INV_DISABLE REGBIT(0, 22) +#define GPR_DBG_L1_RST_DIS REGBIT(0, 23) +#define GPR_EDBG_RQ0 REGBIT(0, 24) +#define GPR_EDBG_RQ1 REGBIT(0, 25) +#define GPR_CLUSTERIDAFF1_0 REGBIT(0, 28) +#define GPR_CLUSTERIDAFF1_1 REGBIT(0, 29) +#define GPR_SYSBARDENABLE REGBIT(0, 30) +#define GPR_ADBGIC_PWRDNREQN REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @} */ +#define GPR_ADB_PWRDNREQN REGBIT(1, 32) +#define GPR_ACINACTM REGBIT(1, 33) +#define GPR_EVENTO_RESET REGBIT(1, 36) +#define GPR_CPUQ_REQ0 REGBIT(1, 44) +#define GPR_CPUQ_REQ1 REGBIT(1, 45) +#define GPR_RST_CORE0 REGBIT(1, 48) +#define GPR_RST_CORE1 REGBIT(1, 49) +#define GPR_DBG_PWRD_UP0 REGBIT(1, 52) +#define GPR_DBG_PWRD_UP1 REGBIT(1, 53) +#define GPR_EVENTI REGBIT(1, 63) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_L2_ACTIVE_A72 REGBIT(0, 24) +#define GPS_L2_DENY_A72 REGBIT(0, 25) +#define GPS_L2_ACCEPT_B_A72 REGBIT(0, 26) +#define GPS_L2_FLUSHDONE_A72 REGBIT(0, 27) +#define GPS_ADBGIC_PWRDNACKN REGBIT(0, 28) +#define GPS_ADBACE_PWRDNACKN REGBIT(0, 29) +#define GPS_EVENTO REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_CPUQ_DENY0 REGBIT(1, 32) +#define GPS_CPUQ_DENY1 REGBIT(1, 33) +#define GPS_CPUQ_ACCEPT_B0 REGBIT(1, 36) +#define GPS_CPUQ_ACCEPT_B1 REGBIT(1, 37) +#define GPS_CPUQ_ACTIVE0 REGBIT(1, 52) +#define GPS_CPUQ_ACTIVE1 REGBIT(1, 53) +#define GPS_STANDBYWFI0 REGBIT(1, 56) +#define GPS_STANDBYWFI1 REGBIT(1, 57) +#define GPS_STANDBYWFE0 REGBIT(1, 60) +#define GPS_STANDBYWFE1 REGBIT(1, 61) +/** @} */ + +/*! + * @name GPR Status 2 Bit Definitions + */ +/** @{ */ +#define GPS_DBG_RST_REQ0 REGBIT(2, 64) +#define GPS_DBG_RST_REQ1 REGBIT(2, 65) +#define GPS_DBG_NOPWRDWN0 REGBIT(2, 68) +#define GPS_DBG_NOPWRDWN1 REGBIT(2, 69) +#define GPS_DBG_PWR_UP_REQ0 REGBIT(2, 72) +#define GPS_DBG_PWR_UP_REQ1 REGBIT(2, 73) +#define GPS_DBG_ACK0 REGBIT(2, 76) +#define GPS_DBG_ACK1 REGBIT(2, 77) +#define GPS_WARM_RESET_REQ0 REGBIT(2, 80) +#define GPS_WARM_RESET_REQ1 REGBIT(2, 81) +#define GPS_STANDBYWFIL2_A72 REGBIT(2, 84) +#define GPS_CACTIVES_A72_GIC REGBIT(2, 85) +#define GPS_CACTIVEM_A72_GIC REGBIT(2, 86) +#define GPS_CACTIVES_ACE REGBIT(2, 87) +#define GPS_SMPEN0 REGBIT(2, 88) +#define GPS_SMPEN1 REGBIT(2, 89) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_EVENTO REGBIT64(1, 0) +#define IRQ_CLREXMONACK REGBIT64(1, 1) +#define IRQ_L2_FLUSHDONE REGBIT64(1, 2) +#define IRQ_CPUQ_DENY REGBIT64(1, 5) +#define IRQ_CPUQ_ACCEPT_B REGBIT64(1, 6) +#define IRQ_L2_DENY REGBIT64(1, 7) +#define IRQ_L2_ACCEPT_B REGBIT64(1, 8) +#define IRQ_STANDBYWFI REGBIT64(1, 9) +#define IRQ_STANDBYWFIL2 REGBIT64(1, 13) +#define IRQ_DBG_ACK REGBIT64(1, 14) +#define IRQ_CA72_COMM_IRQ_B REGBIT64(1, 15) +#define IRQ_DBG_RST_REQ REGBIT64(1, 16) +#define IRQ_DBG_PWR_UP_REQ REGBIT64(1, 17) +#define IRQ_PWR_DN_ACKN_TO_GIC_SLV REGBIT64(1, 18) +#define IRQ_ADBACE_PWRDNACKN REGBIT64(1, 19) +/** @} */ + +#endif /* SC_SS_A72_DSC_H */ + +/** @} */ diff --git a/platform/ss/a72/v1/rsrc.h b/platform/ss/a72/v1/rsrc.h new file mode 100644 index 0000000..d39be4b --- /dev/null +++ b/platform/ss/a72/v1/rsrc.h @@ -0,0 +1,64 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the A72 subsystem. + * + * @addtogroup A72_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_A72_RSRC_H +#define SC_SS_A72_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_A72_0 0U +#define SS_R_A72_1 1U +#define SS_R_A72 2U +/** @} */ + +#endif /* SC_SS_A72_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/a72/v1/ss.h b/platform/ss/a72/v1/ss.h new file mode 100755 index 0000000..1e47dd3 --- /dev/null +++ b/platform/ss/a72/v1/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the A72 subsystem API. + * + * @addtogroup A72_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_A72_SS_H +#define SC_SS_A72_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(a72) + +/* Functions */ + +SS_FUNC_PROTO_A72 + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_a72[]; + +#endif /* SC_SS_A72_SS_H */ + +/** @} */ + diff --git a/platform/ss/adma/v2/Makefile b/platform/ss/adma/v2/Makefile new file mode 100755 index 0000000..aecb3e9 --- /dev/null +++ b/platform/ss/adma/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/adma/v2/ss.o + +CONFIGH += $(SRC)/ss/adma/v2/config.h $(SRC)/ss/adma/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/adma/v2/resource.txt + +CLK_MD += $(SRC)/ss/adma/v2/clock.txt + +CTRL_MD += $(SRC)/ss/adma/v2/control.txt + +DIRS += $(OUT)/ss/adma/v2 + diff --git a/platform/ss/adma/v2/dsc.h b/platform/ss/adma/v2/dsc.h new file mode 100755 index 0000000..205bba4 --- /dev/null +++ b/platform/ss/adma/v2/dsc.h @@ -0,0 +1,385 @@ +/* +** ################################################################### +** +** Copyright 2018-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup ADMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_ADMA_DSC_H +#define SC_SS_ADMA_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_DSP REGBIT(0, 2) +#define RST_SS_DSP_CORE REGBIT(0, 3) +#define RST_SS_DSP_DEBUG REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_OBS_SEL2 REGBIT(0, 10) +#define GPR_OBS_SEL3 REGBIT(0, 11) +#define GPR_SYS_OFFSET_AUD_ALT REGBIT(0, 16) +#define GPR_ADB_GIC_PWRDNREQN REGBIT(0, 24) +#define GPR_ADB_DSP_PWRDNREQN0 REGBIT(0, 25) +#define GPR_ADB_DSP_PWRDNREQN1 REGBIT(0, 26) +#define GPR_DSP_CACHE_SEL REGBIT(0, 27) +#define GPR_DSP_CACHEABLE REGBIT(0, 28) +#define GPR_LCDIF_CACHEABLE REGBIT(0, 29) +#define GPR_AUDIO_EDMA_CACHEABLE REGBIT(0, 30) +#define GPR_PERIPH_EDMA_CACHEABLE REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_DMA_CLOCK_RATIO0 REGBIT(1, 32) +#define GPR_DMA_CLOCK_RATIO1 REGBIT(1, 33) +#define GPR_DMA_CLOCK_RATIO_ENB REGBIT(1, 34) +#define GPR_DSP_DMA_BYPASS REGBIT(1, 35) +#define GPR_DMA01_DSP_BYPASS REGBIT(1, 36) +#define GPR_DMA23_DSP_BYPASS REGBIT(1, 37) +#define GPR_PIXEL_RATE_CORR REGBIT(1, 38) +#define GPR_SYS_OFFSET_SEL REGBIT(1, 39) +#define GPR_SYS_OFFSET_AUD REGBIT(1, 40) +#define GPR_SYS_OFFSET_DMA REGBIT(1, 48) +#define GPR_SYS_OFFSET_GIC REGBIT(1, 56) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_ADB_GIC_PWRDNACKN REGBIT(0, 16) +#define GPS_ADB_GIC_CACTIVES REGBIT(0, 17) +#define GPS_ADB_GIC_CACTIVEM REGBIT(0, 18) +#define GPS_ADB_DSP_PWRDNACKN0 REGBIT(0, 25) +#define GPS_ADB_DSP_CACTIVES0 REGBIT(0, 26) +#define GPS_ADB_DSP_CACTIVEM0 REGBIT(0, 27) +#define GPS_ADB_DSP_PWRDNACKN1 REGBIT(0, 29) +#define GPS_ADB_DSP_CACTIVES1 REGBIT(0, 30) +#define GPS_ADB_DSP_CACTIVEM1 REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_OBS_OUT REGBIT(1, 32) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GIC_WAKE00 REGBIT64(1, 0) +#define IRQ_GIC_WAKE01 REGBIT64(1, 1) +#define IRQ_GIC_WAKE02 REGBIT64(1, 2) +#define IRQ_GIC_WAKE03 REGBIT64(1, 3) +#define IRQ_IRQSTR_CTI0 REGBIT64(1, 8) +#define IRQ_IRQSTR_CTI1 REGBIT64(1, 9) +#define IRQ_IRQSTR_CTI2 REGBIT64(1, 10) +#define IRQ_IRQSTR_CTI3 REGBIT64(1, 11) +#define IRQ_IRQSTR_CTI4 REGBIT64(1, 12) +#define IRQ_GIC_ECC_FATAL REGBIT64(1, 13) +#define IRQ_LPI2C0 REGBIT64(1, 15) +#define IRQ_LPI2C1 REGBIT64(1, 16) +#define IRQ_LPI2C2 REGBIT64(1, 17) +#define IRQ_LPI2C3 REGBIT64(1, 18) +#define IRQ_LPSPI0 REGBIT64(1, 19) +#define IRQ_LPSPI1 REGBIT64(1, 20) +#define IRQ_LPSPI2 REGBIT64(1, 21) +#define IRQ_LPSPI3 REGBIT64(1, 22) +#define IRQ_LPUART0 REGBIT64(1, 23) +#define IRQ_LPUART1 REGBIT64(1, 24) +#define IRQ_LPUART2 REGBIT64(1, 25) +#define IRQ_LPUART3 REGBIT64(1, 26) +#define IRQ_ADC0 REGBIT64(1, 27) +/** @} */ + +/*! + * @name CSR2 0x00 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_EXPSTATE REGBIT(0x0, 0) +/** @} */ + +/*! + * @name CSR2 0x01 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_IMPWIRE REGBIT(0x1, 0) +/** @} */ + +/*! + * @name CSR2 0x02 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_PRID REGBIT(0x2, 0) +/** @} */ + +/*! + * @name CSR2 0x30 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_OCDHALTONRESET REGBIT(0x3, 0) +#define CSR2_DSP_RUNSTALL REGBIT(0x3, 1) +#define CSR2_DSP_STATVECTORSEL REGBIT(0x3, 2) +/** @} */ + +/*! + * @name CSR2 0x40 Bit Definitions + */ +/** @{ */ +/** @} */ + +/*! + * @name CSR3 0x00 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_DEBUG REGBIT(0x0, 0) +#define CSR3_EDMA3_IPG_DEBUG REGBIT(0x0, 1) +#define CSR3_SPI0_IPG_DEBUG REGBIT(0x0, 3) +#define CSR3_SPI1_IPG_DEBUG REGBIT(0x0, 4) +#define CSR3_SPI2_IPG_DEBUG REGBIT(0x0, 5) +#define CSR3_SPI3_IPG_DEBUG REGBIT(0x0, 6) +#define CSR3_I2C0_IPG_DEBUG REGBIT(0x0, 17) +#define CSR3_I2C1_IPG_DEBUG REGBIT(0x0, 18) +#define CSR3_I2C2_IPG_DEBUG REGBIT(0x0, 19) +#define CSR3_I2C3_IPG_DEBUG REGBIT(0x0, 20) +#define CSR3_FTM0_IPG_DEBUG REGBIT(0x0, 26) +#define CSR3_FTM1_IPG_DEBUG REGBIT(0x0, 27) +#define CSR3_CAN0_IPG_DEBUG REGBIT(0x0, 29) +#define CSR3_CAN1_IPG_DEBUG REGBIT(0x0, 30) +#define CSR3_CAN2_IPG_DEBUG REGBIT(0x0, 31) +/** @} */ + +/*! + * @name CSR3 0x10 Bit Definitions + */ +/** @{ */ +#define CSR3_SPI0_IPG_DOZE REGBIT(0x1, 3) +#define CSR3_SPI1_IPG_DOZE REGBIT(0x1, 4) +#define CSR3_SPI2_IPG_DOZE REGBIT(0x1, 5) +#define CSR3_SPI3_IPG_DOZE REGBIT(0x1, 6) +#define CSR3_UART0_IPG_DOZE REGBIT(0x1, 8) +#define CSR3_UART1_IPG_DOZE REGBIT(0x1, 9) +#define CSR3_UART2_IPG_DOZE REGBIT(0x1, 10) +#define CSR3_UART3_IPG_DOZE REGBIT(0x1, 11) +#define CSR3_I2C0_IPG_DOZE REGBIT(0x1, 17) +#define CSR3_I2C1_IPG_DOZE REGBIT(0x1, 18) +#define CSR3_I2C2_IPG_DOZE REGBIT(0x1, 19) +#define CSR3_I2C3_IPG_DOZE REGBIT(0x1, 20) +#define CSR3_ADC0_IPG_DOZE REGBIT(0x1, 23) +#define CSR3_CAN0_IPG_DOZE REGBIT(0x1, 29) +#define CSR3_CAN1_IPG_DOZE REGBIT(0x1, 30) +#define CSR3_CAN2_IPG_DOZE REGBIT(0x1, 31) +/** @} */ + +/*! + * @name CSR3 0x20 Bit Definitions + */ +/** @{ */ +#define CSR3_SPI0_IPG_STOP_MODE REGBIT(0x2, 3) +#define CSR3_SPI1_IPG_STOP_MODE REGBIT(0x2, 4) +#define CSR3_SPI2_IPG_STOP_MODE REGBIT(0x2, 5) +#define CSR3_SPI3_IPG_STOP_MODE REGBIT(0x2, 6) +#define CSR3_UART0_IPG_STOP_MODE REGBIT(0x2, 8) +#define CSR3_UART1_IPG_STOP_MODE REGBIT(0x2, 9) +#define CSR3_UART2_IPG_STOP_MODE REGBIT(0x2, 10) +#define CSR3_UART3_IPG_STOP_MODE REGBIT(0x2, 11) +#define CSR3_I2C0_IPG_STOP_MODE REGBIT(0x2, 17) +#define CSR3_I2C1_IPG_STOP_MODE REGBIT(0x2, 18) +#define CSR3_I2C2_IPG_STOP_MODE REGBIT(0x2, 19) +#define CSR3_I2C3_IPG_STOP_MODE REGBIT(0x2, 20) +/** @} */ + +/*! + * @name CSR3 0x30 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_STOP REGBIT(0x3, 0) +#define CSR3_EDMA3_IPG_STOP REGBIT(0x3, 1) +#define CSR3_SPI0_IPG_STOP REGBIT(0x3, 3) +#define CSR3_SPI1_IPG_STOP REGBIT(0x3, 4) +#define CSR3_SPI2_IPG_STOP REGBIT(0x3, 5) +#define CSR3_SPI3_IPG_STOP REGBIT(0x3, 6) +#define CSR3_UART0_IPG_STOP REGBIT(0x3, 8) +#define CSR3_UART1_IPG_STOP REGBIT(0x3, 9) +#define CSR3_UART2_IPG_STOP REGBIT(0x3, 10) +#define CSR3_UART3_IPG_STOP REGBIT(0x3, 11) +#define CSR3_I2C0_IPG_STOP REGBIT(0x3, 17) +#define CSR3_I2C1_IPG_STOP REGBIT(0x3, 18) +#define CSR3_I2C2_IPG_STOP REGBIT(0x3, 19) +#define CSR3_I2C3_IPG_STOP REGBIT(0x3, 20) +#define CSR3_ADC0_IPG_STOP REGBIT(0x3, 23) +#define CSR3_CAN0_IPG_STOP REGBIT(0x3, 29) +#define CSR3_CAN1_IPG_STOP REGBIT(0x3, 30) +#define CSR3_CAN2_IPG_STOP REGBIT(0x3, 31) +/** @} */ + +/*! + * @name CSR3 0x40 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_STOP_ACK REGBIT(0x4, 0) +#define CSR3_EDMA3_IPG_STOP_ACK REGBIT(0x4, 1) +#define CSR3_SPI0_IPG_STOP_ACK REGBIT(0x4, 3) +#define CSR3_SPI1_IPG_STOP_ACK REGBIT(0x4, 4) +#define CSR3_SPI2_IPG_STOP_ACK REGBIT(0x4, 5) +#define CSR3_SPI3_IPG_STOP_ACK REGBIT(0x4, 6) +#define CSR3_UART0_IPG_STOP_ACK REGBIT(0x4, 8) +#define CSR3_UART1_IPG_STOP_ACK REGBIT(0x4, 9) +#define CSR3_UART2_IPG_STOP_ACK REGBIT(0x4, 10) +#define CSR3_UART3_IPG_STOP_ACK REGBIT(0x4, 11) +#define CSR3_I2C0_IPG_STOP_ACK REGBIT(0x4, 17) +#define CSR3_I2C1_IPG_STOP_ACK REGBIT(0x4, 18) +#define CSR3_I2C2_IPG_STOP_ACK REGBIT(0x4, 19) +#define CSR3_I2C3_IPG_STOP_ACK REGBIT(0x4, 20) +#define CSR3_ADC0_IPG_STOP_ACK REGBIT(0x4, 23) +#define CSR3_CAN0_IPG_STOP_ACK REGBIT(0x4, 29) +#define CSR3_CAN1_IPG_STOP_ACK REGBIT(0x4, 30) +#define CSR3_CAN2_IPG_STOP_ACK REGBIT(0x4, 31) +/** @} */ + +/*! + * @name CSR3 0x80 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_DEBUG REGBIT(0x8, 0) +#define CSR3_EDMA1_IPG_DEBUG REGBIT(0x8, 1) +#define CSR3_GPT0_IPG_DEBUG REGBIT(0x8, 2) +#define CSR3_GPT1_IPG_DEBUG REGBIT(0x8, 3) +#define CSR3_GPT2_IPG_DEBUG REGBIT(0x8, 4) +#define CSR3_GPT3_IPG_DEBUG REGBIT(0x8, 5) +#define CSR3_GPT4_IPG_DEBUG REGBIT(0x8, 6) +#define CSR3_GPT5_IPG_DEBUG REGBIT(0x8, 7) +#define CSR3_SAI0_IPG_DEBUG REGBIT(0x8, 8) +#define CSR3_SAI1_IPG_DEBUG REGBIT(0x8, 9) +#define CSR3_SAI2_IPG_DEBUG REGBIT(0x8, 10) +#define CSR3_SAI3_IPG_DEBUG REGBIT(0x8, 11) +#define CSR3_SAI4_IPG_DEBUG REGBIT(0x8, 12) +#define CSR3_SAI5_IPG_DEBUG REGBIT(0x8, 13) +#define CSR3_PWM_IPG_DEBUG REGBIT(0x8, 16) +/** @} */ + +/*! + * @name CSR3 0x90 Bit Definitions + */ +/** @{ */ +#define CSR3_GPT0_IPG_DOZE REGBIT(0x9, 2) +#define CSR3_GPT1_IPG_DOZE REGBIT(0x9, 3) +#define CSR3_GPT2_IPG_DOZE REGBIT(0x9, 4) +#define CSR3_GPT3_IPG_DOZE REGBIT(0x9, 5) +#define CSR3_GPT4_IPG_DOZE REGBIT(0x9, 6) +#define CSR3_GPT5_IPG_DOZE REGBIT(0x9, 7) +#define CSR3_PWM_IPG_DOZE REGBIT(0x9, 16) +/** @} */ + +/*! + * @name CSR3 0xA0 Bit Definitions + */ +/** @{ */ +#define CSR3_GPT0_IPG_WAIT REGBIT(0xA, 2) +#define CSR3_GPT1_IPG_WAIT REGBIT(0xA, 3) +#define CSR3_GPT2_IPG_WAIT REGBIT(0xA, 4) +#define CSR3_GPT3_IPG_WAIT REGBIT(0xA, 5) +#define CSR3_GPT4_IPG_WAIT REGBIT(0xA, 6) +#define CSR3_GPT5_IPG_WAIT REGBIT(0xA, 7) +#define CSR3_SAI0_IPG_STOP_MODE REGBIT(0xA, 8) +#define CSR3_SAI1_IPG_STOP_MODE REGBIT(0xA, 9) +#define CSR3_SAI2_IPG_STOP_MODE REGBIT(0xA, 10) +#define CSR3_SAI3_IPG_STOP_MODE REGBIT(0xA, 11) +#define CSR3_SAI4_IPG_STOP_MODE REGBIT(0xA, 12) +#define CSR3_SAI5_IPG_STOP_MODE REGBIT(0xA, 13) +#define CSR3_PWM_IPG_WAIT REGBIT(0xA, 16) +/** @} */ + +/*! + * @name CSR3 0xB0 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP REGBIT(0xB, 0) +#define CSR3_EDMA1_IPG_STOP REGBIT(0xB, 1) +#define CSR3_GPT0_IPG_STOP REGBIT(0xB, 2) +#define CSR3_GPT1_IPG_STOP REGBIT(0xB, 3) +#define CSR3_GPT2_IPG_STOP REGBIT(0xB, 4) +#define CSR3_GPT3_IPG_STOP REGBIT(0xB, 5) +#define CSR3_GPT4_IPG_STOP REGBIT(0xB, 6) +#define CSR3_GPT5_IPG_STOP REGBIT(0xB, 7) +#define CSR3_SAI0_IPG_STOP REGBIT(0xB, 8) +#define CSR3_SAI1_IPG_STOP REGBIT(0xB, 9) +#define CSR3_SAI2_IPG_STOP REGBIT(0xB, 10) +#define CSR3_SAI3_IPG_STOP REGBIT(0xB, 11) +#define CSR3_SAI4_IPG_STOP REGBIT(0xB, 12) +#define CSR3_SAI5_IPG_STOP REGBIT(0xB, 13) +#define CSR3_PWM_IPG_STOP REGBIT(0xB, 16) +/** @} */ + +/*! + * @name CSR3 0xC0 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP_ACK REGBIT(0xC, 0) +#define CSR3_EDMA1_IPG_STOP_ACK REGBIT(0xC, 1) +#define CSR3_SAI0_IPG_STOP_ACK REGBIT(0xC, 8) +#define CSR3_SAI1_IPG_STOP_ACK REGBIT(0xC, 9) +#define CSR3_SAI2_IPG_STOP_ACK REGBIT(0xC, 10) +#define CSR3_SAI3_IPG_STOP_ACK REGBIT(0xC, 11) +#define CSR3_SAI4_IPG_STOP_ACK REGBIT(0xC, 12) +#define CSR3_SAI5_IPG_STOP_ACK REGBIT(0xC, 13) +/** @} */ + +#endif /* SC_SS_ADMA_DSC_H */ + +/** @} */ + diff --git a/platform/ss/adma/v2/ss.h b/platform/ss/adma/v2/ss.h new file mode 100755 index 0000000..50ee2fc --- /dev/null +++ b/platform/ss/adma/v2/ss.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright 2018-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the ADMA subsystem API. + * + * @addtogroup ADMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_ADMA_SS_H +#define SC_SS_ADMA_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(adma) + +/* Functions */ + +SS_FUNC_PROTO_ADMA + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_adma[]; + +#endif /* SC_SS_ADMA_SS_H */ + +/** @} */ + diff --git a/platform/ss/adma/v3/Makefile b/platform/ss/adma/v3/Makefile new file mode 100755 index 0000000..eb305b8 --- /dev/null +++ b/platform/ss/adma/v3/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/adma/v3/ss.o + +CONFIGH += $(SRC)/ss/adma/v3/config.h $(SRC)/ss/adma/v3/rsrc.h + +RSRC_MD += $(SRC)/ss/adma/v3/resource.txt + +CLK_MD += $(SRC)/ss/adma/v3/clock.txt + +CTRL_MD += $(SRC)/ss/adma/v3/control.txt + +DIRS += $(OUT)/ss/adma/v3 + diff --git a/platform/ss/adma/v3/dsc.h b/platform/ss/adma/v3/dsc.h new file mode 100755 index 0000000..9b5548e --- /dev/null +++ b/platform/ss/adma/v3/dsc.h @@ -0,0 +1,387 @@ +/* +** ################################################################### +** +** Copyright 2018-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup ADMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_ADMA_DSC_H +#define SC_SS_ADMA_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_DSP REGBIT(0, 2) +#define RST_SS_DSP_CORE REGBIT(0, 3) +#define RST_SS_DSP_DEBUG REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_OBS_SEL2 REGBIT(0, 10) +#define GPR_OBS_SEL3 REGBIT(0, 11) +#define GPR_ADB_GIC_PWRDNREQN REGBIT(0, 24) +#define GPR_ADB_DSP_PWRDNREQN0 REGBIT(0, 25) +#define GPR_ADB_DSP_PWRDNREQN1 REGBIT(0, 26) +#define GPR_LCDIF_CACHEABLE REGBIT(0, 29) +#define GPR_AUDIO_EDMA_CACHEABLE REGBIT(0, 30) +#define GPR_PERIPH_EDMA_CACHEABLE REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_DMA_CLOCK_RATIO0 REGBIT(1, 32) +#define GPR_DMA_CLOCK_RATIO1 REGBIT(1, 33) +#define GPR_DMA_CLOCK_RATIO_ENB REGBIT(1, 34) +#define GPR_DSP_DMA_BYPASS REGBIT(1, 35) +#define GPR_DMA01_DSP_BYPASS REGBIT(1, 36) +#define GPR_DMA23_DSP_BYPASS REGBIT(1, 37) +#define GPR_PIXEL_RATE_CORR REGBIT(1, 38) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_ADB_GIC_PWRDNACKN REGBIT(0, 16) +#define GPS_ADB_GIC_CACTIVES REGBIT(0, 17) +#define GPS_ADB_GIC_CACTIVEM REGBIT(0, 18) +#define GPS_ADB_DSP_PWRDNACKN0 REGBIT(0, 25) +#define GPS_ADB_DSP_CACTIVES0 REGBIT(0, 26) +#define GPS_ADB_DSP_CACTIVEM0 REGBIT(0, 27) +#define GPS_ADB_DSP_PWRDNACKN1 REGBIT(0, 29) +#define GPS_ADB_DSP_CACTIVES1 REGBIT(0, 30) +#define GPS_ADB_DSP_CACTIVEM1 REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_OBS_OUT REGBIT(1, 32) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GIC_WAKE00 REGBIT64(1, 0) +#define IRQ_GIC_WAKE01 REGBIT64(1, 1) +#define IRQ_GIC_WAKE02 REGBIT64(1, 2) +#define IRQ_GIC_WAKE03 REGBIT64(1, 3) +#define IRQ_IRQSTR_CTI0 REGBIT64(1, 8) +#define IRQ_IRQSTR_CTI1 REGBIT64(1, 9) +#define IRQ_IRQSTR_CTI2 REGBIT64(1, 10) +#define IRQ_IRQSTR_CTI3 REGBIT64(1, 11) +#define IRQ_IRQSTR_CTI4 REGBIT64(1, 12) +#define IRQ_GIC_ECC_FATAL REGBIT64(1, 13) +#define IRQ_LPI2C0 REGBIT64(1, 15) +#define IRQ_LPI2C1 REGBIT64(1, 16) +#define IRQ_LPI2C2 REGBIT64(1, 17) +#define IRQ_LPI2C3 REGBIT64(1, 18) +#define IRQ_LPSPI0 REGBIT64(1, 19) +#define IRQ_LPSPI1 REGBIT64(1, 20) +#define IRQ_LPSPI2 REGBIT64(1, 21) +#define IRQ_LPSPI3 REGBIT64(1, 22) +#define IRQ_LPUART0 REGBIT64(1, 23) +#define IRQ_LPUART1 REGBIT64(1, 24) +#define IRQ_LPUART2 REGBIT64(1, 25) +#define IRQ_LPUART3 REGBIT64(1, 26) +#define IRQ_ADC0 REGBIT64(1, 27) +/** @} */ + +/*! + * @name CSR2 0x00 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_EXPSTATE REGBIT(0x0, 0) +/** @} */ + +/*! + * @name CSR2 0x01 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_IMPWIRE REGBIT(0x1, 0) +/** @} */ + +/*! + * @name CSR2 0x02 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_PRID REGBIT(0x2, 0) +/** @} */ + +/*! + * @name CSR2 0x30 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_OCDHALTONRESET REGBIT(0x3, 0) +#define CSR2_DSP_RUNSTALL REGBIT(0x3, 1) +#define CSR2_DSP_STATVECTORSEL REGBIT(0x3, 2) +/** @} */ + +/*! + * @name CSR2 0x40 Bit Definitions + */ +/** @{ */ +/** @} */ + +/*! + * @name CSR3 0x00 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_DEBUG REGBIT(0x0, 0) +#define CSR3_EDMA3_IPG_DEBUG REGBIT(0x0, 1) +#define CSR3_SPI0_IPG_DEBUG REGBIT(0x0, 3) +#define CSR3_SPI1_IPG_DEBUG REGBIT(0x0, 4) +#define CSR3_SPI2_IPG_DEBUG REGBIT(0x0, 5) +#define CSR3_SPI3_IPG_DEBUG REGBIT(0x0, 6) +#define CSR3_I2C0_IPG_DEBUG REGBIT(0x0, 17) +#define CSR3_I2C1_IPG_DEBUG REGBIT(0x0, 18) +#define CSR3_I2C2_IPG_DEBUG REGBIT(0x0, 19) +#define CSR3_I2C3_IPG_DEBUG REGBIT(0x0, 20) +#define CSR3_FTM0_IPG_DEBUG REGBIT(0x0, 26) +#define CSR3_FTM1_IPG_DEBUG REGBIT(0x0, 27) +#define CSR3_CAN0_IPG_DEBUG REGBIT(0x0, 29) +#define CSR3_CAN1_IPG_DEBUG REGBIT(0x0, 30) +#define CSR3_CAN2_IPG_DEBUG REGBIT(0x0, 31) +/** @} */ + +/*! + * @name CSR3 0x10 Bit Definitions + */ +/** @{ */ +#define CSR3_SPI0_IPG_DOZE REGBIT(0x1, 3) +#define CSR3_SPI1_IPG_DOZE REGBIT(0x1, 4) +#define CSR3_SPI2_IPG_DOZE REGBIT(0x1, 5) +#define CSR3_SPI3_IPG_DOZE REGBIT(0x1, 6) +#define CSR3_UART0_IPG_DOZE REGBIT(0x1, 8) +#define CSR3_UART1_IPG_DOZE REGBIT(0x1, 9) +#define CSR3_UART2_IPG_DOZE REGBIT(0x1, 10) +#define CSR3_UART3_IPG_DOZE REGBIT(0x1, 11) +#define CSR3_I2C0_IPG_DOZE REGBIT(0x1, 17) +#define CSR3_I2C1_IPG_DOZE REGBIT(0x1, 18) +#define CSR3_I2C2_IPG_DOZE REGBIT(0x1, 19) +#define CSR3_I2C3_IPG_DOZE REGBIT(0x1, 20) +#define CSR3_ADC0_IPG_DOZE REGBIT(0x1, 23) +#define CSR3_CAN0_IPG_DOZE REGBIT(0x1, 29) +#define CSR3_CAN1_IPG_DOZE REGBIT(0x1, 30) +#define CSR3_CAN2_IPG_DOZE REGBIT(0x1, 31) +/** @} */ + +/*! + * @name CSR3 0x20 Bit Definitions + */ +/** @{ */ +#define CSR3_SPI0_IPG_STOP_MODE REGBIT(0x2, 3) +#define CSR3_SPI1_IPG_STOP_MODE REGBIT(0x2, 4) +#define CSR3_SPI2_IPG_STOP_MODE REGBIT(0x2, 5) +#define CSR3_SPI3_IPG_STOP_MODE REGBIT(0x2, 6) +#define CSR3_UART0_IPG_STOP_MODE REGBIT(0x2, 8) +#define CSR3_UART1_IPG_STOP_MODE REGBIT(0x2, 9) +#define CSR3_UART2_IPG_STOP_MODE REGBIT(0x2, 10) +#define CSR3_UART3_IPG_STOP_MODE REGBIT(0x2, 11) +#define CSR3_I2C0_IPG_STOP_MODE REGBIT(0x2, 17) +#define CSR3_I2C1_IPG_STOP_MODE REGBIT(0x2, 18) +#define CSR3_I2C2_IPG_STOP_MODE REGBIT(0x2, 19) +#define CSR3_I2C3_IPG_STOP_MODE REGBIT(0x2, 20) +/** @} */ + +/*! + * @name CSR3 0x30 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_STOP REGBIT(0x3, 0) +#define CSR3_EDMA3_IPG_STOP REGBIT(0x3, 1) +#define CSR3_SPI0_IPG_STOP REGBIT(0x3, 3) +#define CSR3_SPI1_IPG_STOP REGBIT(0x3, 4) +#define CSR3_SPI2_IPG_STOP REGBIT(0x3, 5) +#define CSR3_SPI3_IPG_STOP REGBIT(0x3, 6) +#define CSR3_UART0_IPG_STOP REGBIT(0x3, 8) +#define CSR3_UART1_IPG_STOP REGBIT(0x3, 9) +#define CSR3_UART2_IPG_STOP REGBIT(0x3, 10) +#define CSR3_UART3_IPG_STOP REGBIT(0x3, 11) +#define CSR3_I2C0_IPG_STOP REGBIT(0x3, 17) +#define CSR3_I2C1_IPG_STOP REGBIT(0x3, 18) +#define CSR3_I2C2_IPG_STOP REGBIT(0x3, 19) +#define CSR3_I2C3_IPG_STOP REGBIT(0x3, 20) +#define CSR3_ADC0_IPG_STOP REGBIT(0x3, 23) +#define CSR3_CAN0_IPG_STOP REGBIT(0x3, 29) +#define CSR3_CAN1_IPG_STOP REGBIT(0x3, 30) +#define CSR3_CAN2_IPG_STOP REGBIT(0x3, 31) +/** @} */ + +/*! + * @name CSR3 0x40 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA2_IPG_STOP_ACK REGBIT(0x4, 0) +#define CSR3_EDMA3_IPG_STOP_ACK REGBIT(0x4, 1) +#define CSR3_SPI0_IPG_STOP_ACK REGBIT(0x4, 3) +#define CSR3_SPI1_IPG_STOP_ACK REGBIT(0x4, 4) +#define CSR3_SPI2_IPG_STOP_ACK REGBIT(0x4, 5) +#define CSR3_SPI3_IPG_STOP_ACK REGBIT(0x4, 6) +#define CSR3_UART0_IPG_STOP_ACK REGBIT(0x4, 8) +#define CSR3_UART1_IPG_STOP_ACK REGBIT(0x4, 9) +#define CSR3_UART2_IPG_STOP_ACK REGBIT(0x4, 10) +#define CSR3_UART3_IPG_STOP_ACK REGBIT(0x4, 11) +#define CSR3_I2C0_IPG_STOP_ACK REGBIT(0x4, 17) +#define CSR3_I2C1_IPG_STOP_ACK REGBIT(0x4, 18) +#define CSR3_I2C2_IPG_STOP_ACK REGBIT(0x4, 19) +#define CSR3_I2C3_IPG_STOP_ACK REGBIT(0x4, 20) +#define CSR3_ADC0_IPG_STOP_ACK REGBIT(0x4, 23) +#define CSR3_CAN0_IPG_STOP_ACK REGBIT(0x4, 29) +#define CSR3_CAN1_IPG_STOP_ACK REGBIT(0x4, 30) +#define CSR3_CAN2_IPG_STOP_ACK REGBIT(0x4, 31) +/** @} */ + +/*! + * @name CSR3 0x80 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_DEBUG REGBIT(0x8, 0) +#define CSR3_EDMA1_IPG_DEBUG REGBIT(0x8, 1) +#define CSR3_GPT0_IPG_DEBUG REGBIT(0x8, 2) +#define CSR3_GPT1_IPG_DEBUG REGBIT(0x8, 3) +#define CSR3_GPT2_IPG_DEBUG REGBIT(0x8, 4) +#define CSR3_GPT3_IPG_DEBUG REGBIT(0x8, 5) +#define CSR3_GPT4_IPG_DEBUG REGBIT(0x8, 6) +#define CSR3_GPT5_IPG_DEBUG REGBIT(0x8, 7) +#define CSR3_SAI0_IPG_DEBUG REGBIT(0x8, 8) +#define CSR3_SAI1_IPG_DEBUG REGBIT(0x8, 9) +#define CSR3_SAI2_IPG_DEBUG REGBIT(0x8, 10) +#define CSR3_SAI3_IPG_DEBUG REGBIT(0x8, 11) +#define CSR3_SAI4_IPG_DEBUG REGBIT(0x8, 12) +#define CSR3_SAI5_IPG_DEBUG REGBIT(0x8, 13) +#define CSR3_PWM_IPG_DEBUG REGBIT(0x8, 16) +/** @} */ + +/*! + * @name CSR3 0x90 Bit Definitions + */ +/** @{ */ +#define CSR3_GPT0_IPG_DOZE REGBIT(0x9, 2) +#define CSR3_GPT1_IPG_DOZE REGBIT(0x9, 3) +#define CSR3_GPT2_IPG_DOZE REGBIT(0x9, 4) +#define CSR3_GPT3_IPG_DOZE REGBIT(0x9, 5) +#define CSR3_GPT4_IPG_DOZE REGBIT(0x9, 6) +#define CSR3_GPT5_IPG_DOZE REGBIT(0x9, 7) +#define CSR3_PWM_IPG_DOZE REGBIT(0x9, 16) +/** @} */ + +/*! + * @name CSR3 0xA0 Bit Definitions + */ +/** @{ */ +#define CSR3_GPT0_IPG_WAIT REGBIT(0xA, 2) +#define CSR3_GPT1_IPG_WAIT REGBIT(0xA, 3) +#define CSR3_GPT2_IPG_WAIT REGBIT(0xA, 4) +#define CSR3_GPT3_IPG_WAIT REGBIT(0xA, 5) +#define CSR3_GPT4_IPG_WAIT REGBIT(0xA, 6) +#define CSR3_GPT5_IPG_WAIT REGBIT(0xA, 7) +#define CSR3_SAI0_IPG_STOP_MODE REGBIT(0xA, 8) +#define CSR3_SAI1_IPG_STOP_MODE REGBIT(0xA, 9) +#define CSR3_SAI2_IPG_STOP_MODE REGBIT(0xA, 10) +#define CSR3_SAI3_IPG_STOP_MODE REGBIT(0xA, 11) +#define CSR3_SAI4_IPG_STOP_MODE REGBIT(0xA, 12) +#define CSR3_SAI5_IPG_STOP_MODE REGBIT(0xA, 13) +#define CSR3_PWM_IPG_WAIT REGBIT(0xA, 16) +/** @} */ + +/*! + * @name CSR3 0xB0 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP REGBIT(0xB, 0) +#define CSR3_EDMA1_IPG_STOP REGBIT(0xB, 1) +#define CSR3_GPT0_IPG_STOP REGBIT(0xB, 2) +#define CSR3_GPT1_IPG_STOP REGBIT(0xB, 3) +#define CSR3_GPT2_IPG_STOP REGBIT(0xB, 4) +#define CSR3_GPT3_IPG_STOP REGBIT(0xB, 5) +#define CSR3_GPT4_IPG_STOP REGBIT(0xB, 6) +#define CSR3_GPT5_IPG_STOP REGBIT(0xB, 7) +#define CSR3_SAI0_IPG_STOP REGBIT(0xB, 8) +#define CSR3_SAI1_IPG_STOP REGBIT(0xB, 9) +#define CSR3_SAI2_IPG_STOP REGBIT(0xB, 10) +#define CSR3_SAI3_IPG_STOP REGBIT(0xB, 11) +#define CSR3_SAI4_IPG_STOP REGBIT(0xB, 12) +#define CSR3_SAI5_IPG_STOP REGBIT(0xB, 13) +#define CSR3_PWM_IPG_STOP REGBIT(0xB, 16) +/** @} */ + +/*! + * @name CSR3 0xC0 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP_ACK REGBIT(0xC, 0) +#define CSR3_EDMA1_IPG_STOP_ACK REGBIT(0xC, 1) +#define CSR3_SAI0_IPG_STOP_ACK REGBIT(0xC, 8) +#define CSR3_SAI1_IPG_STOP_ACK REGBIT(0xC, 9) +#define CSR3_SAI2_IPG_STOP_ACK REGBIT(0xC, 10) +#define CSR3_SAI3_IPG_STOP_ACK REGBIT(0xC, 11) +#define CSR3_SAI4_IPG_STOP_ACK REGBIT(0xC, 12) +#define CSR3_SAI5_IPG_STOP_ACK REGBIT(0xC, 13) +/** @} */ + +#if (defined(FSL_FEATURE_DSC_HAS_PER_RESET) && FSL_FEATURE_DSC_HAS_PER_RESET) +/*! + * @name ECSR 0x00 Reset Bit Definitions + */ +/** @{ */ +#define CSR_GIC_RESET REGBIT(0x0, 0) +/** @} */ +#endif + +#endif /* SC_SS_ADMA_DSC_H */ + +/** @} */ + diff --git a/platform/ss/adma/v3/ss.h b/platform/ss/adma/v3/ss.h new file mode 100755 index 0000000..50ee2fc --- /dev/null +++ b/platform/ss/adma/v3/ss.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright 2018-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the ADMA subsystem API. + * + * @addtogroup ADMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_ADMA_SS_H +#define SC_SS_ADMA_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(adma) + +/* Functions */ + +SS_FUNC_PROTO_ADMA + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_adma[]; + +#endif /* SC_SS_ADMA_SS_H */ + +/** @} */ + diff --git a/platform/ss/audio/v1/Makefile b/platform/ss/audio/v1/Makefile new file mode 100755 index 0000000..737d8f0 --- /dev/null +++ b/platform/ss/audio/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/audio/v1/ss.o + +CONFIGH += $(SRC)/ss/audio/v1/config.h $(SRC)/ss/audio/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/audio/v1/resource.txt + +CLK_MD += $(SRC)/ss/audio/v1/clock.txt + +CTRL_MD += $(SRC)/ss/audio/v1/control.txt + +DIRS += $(OUT)/ss/audio/v1 + diff --git a/platform/ss/audio/v1/config.h b/platform/ss/audio/v1/config.h new file mode 100644 index 0000000..08c82c3 --- /dev/null +++ b/platform/ss/audio/v1/config.h @@ -0,0 +1,214 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the AUDIO subsystem. + * + * @addtogroup AUDIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_AUDIO_CONFIG_H +#define SC_SS_AUDIO_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_AUDIO 92U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_AUDIO \ + sc_err_t ss_set_control_audio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + void ss_updown_audio(sc_sub_t ss, sc_bool_t up); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_AUDIO \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_audio, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_audio, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_AUDIO_0 \ + "ASRC_0", \ + "ESAI_0", \ + "SPDIF_0", \ + "SPDIF_1", \ + "SAI_0", \ + "SAI_1", \ + "SAI_2", \ + "SAI_3", \ + "SAI_4", \ + "SAI_5", \ + "GPT_5", \ + "GPT_6", \ + "GPT_7", \ + "GPT_8", \ + "GPT_9", \ + "GPT_10", \ + "DMA_2_CH0", \ + "DMA_2_CH1", \ + "DMA_2_CH2", \ + "DMA_2_CH3", \ + "DMA_2_CH4", \ + "DMA_2_CH5", \ + "DMA_2_CH6", \ + "DMA_2_CH7", \ + "DMA_2_CH8", \ + "DMA_2_CH9", \ + "DMA_2_CH10", \ + "DMA_2_CH11", \ + "DMA_2_CH12", \ + "DMA_2_CH13", \ + "DMA_2_CH14", \ + "DMA_2_CH15", \ + "DMA_2_CH16", \ + "DMA_2_CH17", \ + "DMA_2_CH18", \ + "DMA_2_CH19", \ + "DMA_2_CH20", \ + "DMA_2_CH21", \ + "DMA_2_CH22", \ + "DMA_2_CH23", \ + "DMA_2_CH24", \ + "DMA_2_CH25", \ + "DMA_2_CH26", \ + "DMA_2_CH27", \ + "DMA_2_CH28", \ + "DMA_2_CH29", \ + "DMA_2_CH30", \ + "DMA_2_CH31", \ + "ASRC_1", \ + "ESAI_1", \ + "SAI_6", \ + "SAI_7", \ + "AMIX", \ + "MQS_0", \ + "DMA_3_CH0", \ + "DMA_3_CH1", \ + "DMA_3_CH2", \ + "DMA_3_CH3", \ + "DMA_3_CH4", \ + "DMA_3_CH5", \ + "DMA_3_CH6", \ + "DMA_3_CH7", \ + "DMA_3_CH8", \ + "DMA_3_CH9", \ + "DMA_3_CH10", \ + "DMA_3_CH11", \ + "DMA_3_CH12", \ + "DMA_3_CH13", \ + "DMA_3_CH14", \ + "DMA_3_CH15", \ + "DMA_3_CH16", \ + "DMA_3_CH17", \ + "DMA_3_CH18", \ + "DMA_3_CH19", \ + "DMA_3_CH20", \ + "DMA_3_CH21", \ + "DMA_3_CH22", \ + "DMA_3_CH23", \ + "DMA_3_CH24", \ + "DMA_3_CH25", \ + "DMA_3_CH26", \ + "DMA_3_CH27", \ + "DMA_3_CH28", \ + "DMA_3_CH29", \ + "DMA_3_CH30", \ + "DMA_3_CH31", \ + "AUDIO_PLL_0", \ + "AUDIO_PLL_1", \ + "AUDIO_CLK_0", \ + "AUDIO_CLK_1", \ + "MCLK_OUT_0", \ + "MCLK_OUT_1", \ + +#endif + +#endif /* SC_SS_AUDIO_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/audio/v1/dsc.h b/platform/ss/audio/v1/dsc.h new file mode 100755 index 0000000..2963661 --- /dev/null +++ b/platform/ss/audio/v1/dsc.h @@ -0,0 +1,103 @@ +/* +** ################################################################### +** +** Copyright (c) 2016-2019 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup AUDIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_AUDIO_DSC_H +#define SC_SS_AUDIO_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_EDMA_IPDA_CHICKEN_OUT0 REGBIT(1, 32) +#define GPR_EDMA_IPDA_CHICKEN_OUT1 REGBIT(1, 33) +#define GPR_EDMA_IPDA_CHICKEN_OUT2 REGBIT(1, 34) +#define GPR_EDMA_IPDA_CHICKEN_OUT3 REGBIT(1, 35) +#define GPR_EDMA_IPDA_CHICKEN_OUT4 REGBIT(1, 36) +#define GPR_EDMA_IPDA_CHICKEN_OUT5 REGBIT(1, 37) +#define GPR_EDMA_IPDA_CHICKEN_OUT6 REGBIT(1, 38) +#define GPR_EDMA_IPDA_CHICKEN_OUT7 REGBIT(1, 39) +#define GPR_EDMA_IPDA_CHICKEN_OUT8 REGBIT(1, 40) +#define GPR_EDMA_IPDA_CHICKEN_OUT9 REGBIT(1, 41) +#define GPR_EDMA_IPDA_CHICKEN_OUT10 REGBIT(1, 42) +#define GPR_EDMA_IPDA_CHICKEN_OUT11 REGBIT(1, 43) +#define GPR_EDMA_IPDA_CHICKEN_OUT12 REGBIT(1, 44) +#define GPR_EDMA_IPDA_CHICKEN_OUT13 REGBIT(1, 45) +#define GPR_EDMA_IPDA_CHICKEN_OUT14 REGBIT(1, 46) +#define GPR_EDMA_IPDA_CHICKEN_OUT15 REGBIT(1, 47) +#define GPR_EDMA_IPDA_CHICKEN_OUT16 REGBIT(1, 48) +#define GPR_EDMA_IPDA_CHICKEN_OUT17 REGBIT(1, 49) +#define GPR_EDMA_IPDA_CHICKEN_OUT18 REGBIT(1, 50) +#define GPR_EDMA_IPDA_CHICKEN_OUT19 REGBIT(1, 51) +#define GPR_EDMA_IPDA_CHICKEN_OUT20 REGBIT(1, 52) +#define GPR_EDMA_IPDA_CHICKEN_OUT21 REGBIT(1, 53) +#define GPR_EDMA_IPDA_CHICKEN_OUT22 REGBIT(1, 54) +#define GPR_EDMA_IPDA_CHICKEN_OUT23 REGBIT(1, 55) +#define GPR_EDMA_IPDA_CHICKEN_OUT24 REGBIT(1, 56) +#define GPR_EDMA_IPDA_CHICKEN_OUT25 REGBIT(1, 57) +#define GPR_EDMA_IPDA_CHICKEN_OUT26 REGBIT(1, 58) +#define GPR_EDMA_IPDA_CHICKEN_OUT27 REGBIT(1, 59) +#define GPR_EDMA_IPDA_CHICKEN_OUT28 REGBIT(1, 60) +#define GPR_EDMA_IPDA_CHICKEN_OUT29 REGBIT(1, 61) +#define GPR_EDMA_IPDA_CHICKEN_OUT30 REGBIT(1, 62) +#define GPR_EDMA_IPDA_CHICKEN_OUT31 REGBIT(1, 63) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_DMA0_IPG_STOP_ACK REGBIT(1, 0) +#define GPS_DMA1_IPG_STOP_ACK REGBIT(1, 1) +/** @} */ + +#endif /* SC_SS_AUDIO_DSC_H */ + +/** @} */ + diff --git a/platform/ss/audio/v1/rsrc.h b/platform/ss/audio/v1/rsrc.h new file mode 100644 index 0000000..29ed836 --- /dev/null +++ b/platform/ss/audio/v1/rsrc.h @@ -0,0 +1,153 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the AUDIO subsystem. + * + * @addtogroup AUDIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_AUDIO_RSRC_H +#define SC_SS_AUDIO_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_ASRC_0 0U +#define SS_R_ESAI_0 1U +#define SS_R_SPDIF_0 2U +#define SS_R_SPDIF_1 3U +#define SS_R_SAI_0 4U +#define SS_R_SAI_1 5U +#define SS_R_SAI_2 6U +#define SS_R_SAI_3 7U +#define SS_R_SAI_4 8U +#define SS_R_SAI_5 9U +#define SS_R_GPT_5 10U +#define SS_R_GPT_6 11U +#define SS_R_GPT_7 12U +#define SS_R_GPT_8 13U +#define SS_R_GPT_9 14U +#define SS_R_GPT_10 15U +#define SS_R_DMA_2_CH0 16U +#define SS_R_DMA_2_CH1 17U +#define SS_R_DMA_2_CH2 18U +#define SS_R_DMA_2_CH3 19U +#define SS_R_DMA_2_CH4 20U +#define SS_R_DMA_2_CH5 21U +#define SS_R_DMA_2_CH6 22U +#define SS_R_DMA_2_CH7 23U +#define SS_R_DMA_2_CH8 24U +#define SS_R_DMA_2_CH9 25U +#define SS_R_DMA_2_CH10 26U +#define SS_R_DMA_2_CH11 27U +#define SS_R_DMA_2_CH12 28U +#define SS_R_DMA_2_CH13 29U +#define SS_R_DMA_2_CH14 30U +#define SS_R_DMA_2_CH15 31U +#define SS_R_DMA_2_CH16 32U +#define SS_R_DMA_2_CH17 33U +#define SS_R_DMA_2_CH18 34U +#define SS_R_DMA_2_CH19 35U +#define SS_R_DMA_2_CH20 36U +#define SS_R_DMA_2_CH21 37U +#define SS_R_DMA_2_CH22 38U +#define SS_R_DMA_2_CH23 39U +#define SS_R_DMA_2_CH24 40U +#define SS_R_DMA_2_CH25 41U +#define SS_R_DMA_2_CH26 42U +#define SS_R_DMA_2_CH27 43U +#define SS_R_DMA_2_CH28 44U +#define SS_R_DMA_2_CH29 45U +#define SS_R_DMA_2_CH30 46U +#define SS_R_DMA_2_CH31 47U +#define SS_R_ASRC_1 48U +#define SS_R_ESAI_1 49U +#define SS_R_SAI_6 50U +#define SS_R_SAI_7 51U +#define SS_R_AMIX 52U +#define SS_R_MQS_0 53U +#define SS_R_DMA_3_CH0 54U +#define SS_R_DMA_3_CH1 55U +#define SS_R_DMA_3_CH2 56U +#define SS_R_DMA_3_CH3 57U +#define SS_R_DMA_3_CH4 58U +#define SS_R_DMA_3_CH5 59U +#define SS_R_DMA_3_CH6 60U +#define SS_R_DMA_3_CH7 61U +#define SS_R_DMA_3_CH8 62U +#define SS_R_DMA_3_CH9 63U +#define SS_R_DMA_3_CH10 64U +#define SS_R_DMA_3_CH11 65U +#define SS_R_DMA_3_CH12 66U +#define SS_R_DMA_3_CH13 67U +#define SS_R_DMA_3_CH14 68U +#define SS_R_DMA_3_CH15 69U +#define SS_R_DMA_3_CH16 70U +#define SS_R_DMA_3_CH17 71U +#define SS_R_DMA_3_CH18 72U +#define SS_R_DMA_3_CH19 73U +#define SS_R_DMA_3_CH20 74U +#define SS_R_DMA_3_CH21 75U +#define SS_R_DMA_3_CH22 76U +#define SS_R_DMA_3_CH23 77U +#define SS_R_DMA_3_CH24 78U +#define SS_R_DMA_3_CH25 79U +#define SS_R_DMA_3_CH26 80U +#define SS_R_DMA_3_CH27 81U +#define SS_R_DMA_3_CH28 82U +#define SS_R_DMA_3_CH29 83U +#define SS_R_DMA_3_CH30 84U +#define SS_R_DMA_3_CH31 85U +#define SS_R_AUDIO_PLL_0 86U +#define SS_R_AUDIO_PLL_1 87U +#define SS_R_AUDIO_CLK_0 88U +#define SS_R_AUDIO_CLK_1 89U +#define SS_R_MCLK_OUT_0 90U +#define SS_R_MCLK_OUT_1 91U +/** @} */ + +#endif /* SC_SS_AUDIO_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/audio/v1/ss.h b/platform/ss/audio/v1/ss.h new file mode 100755 index 0000000..7807300 --- /dev/null +++ b/platform/ss/audio/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the AUDIO subsystem API. + * + * @addtogroup AUDIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_AUDIO_SS_H +#define SC_SS_AUDIO_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(audio) + +/* Functions */ + +SS_FUNC_PROTO_AUDIO + +#endif /* SC_SS_AUDIO_SS_H */ + +/** @} */ + diff --git a/platform/ss/base/v1/Makefile b/platform/ss/base/v1/Makefile new file mode 100755 index 0000000..b533599 --- /dev/null +++ b/platform/ss/base/v1/Makefile @@ -0,0 +1,9 @@ + +OBJS += $(OUT)/ss/base/v1/ss.o $(OUT)/ss/base/ss_common.o + +CONFIGH += $(SRC)/ss/base/v1/config.h + +DIRS += $(OUT)/ss/base/v1 + +DOX_ADD_COMMON += $(SRC)/ss/base/ss_common.c + diff --git a/platform/ss/base/v1/config.h b/platform/ss/base/v1/config.h new file mode 100644 index 0000000..029be6d --- /dev/null +++ b/platform/ss/base/v1/config.h @@ -0,0 +1,193 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the BASE subsystem. + * + * @addtogroup BASE_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_BASE_CONFIG_H +#define SC_SS_BASE_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_BASE 0 + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_BASE \ + void ss_init_base(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_trans_power_mode_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + sc_err_t ss_rsrc_reset_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_rm_pt_t pt, sc_bool_t pre); \ + sc_err_t ss_set_cpu_power_mode_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t \ + wake_src); \ + sc_err_t ss_set_cpu_resume_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); \ + sc_err_t ss_req_sys_if_power_mode_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, \ + sc_pm_power_mode_t lpm); \ + sc_err_t ss_set_clock_rate_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_get_clock_rate_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_clock_enable_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); \ + sc_err_t ss_force_clock_enable_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable); \ + sc_err_t ss_set_clock_parent_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t \ + new_parent); \ + sc_err_t ss_get_clock_parent_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); \ + sc_bool_t ss_is_rsrc_accessible_base(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx); \ + void ss_mu_irq_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t rsrc_idx, \ + uint32_t mask); \ + sc_err_t ss_cpu_start_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_rdc_enable_base(sc_sub_t ss, sc_bool_t master); \ + void ss_rdc_set_master_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_rdc_set_peripheral_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, const sc_rm_perm_t \ + *perms, sc_bool_t no_update); \ + sc_err_t ss_rdc_set_memory_base(sc_sub_t ss, sc_faddr_t start, \ + sc_faddr_t end, sc_bool_t valid, const sc_rm_perm_t *perms, \ + sc_rm_det_t det, sc_rm_rmsg_t rmsg, sc_faddr_t new_start, \ + sc_faddr_t new_end); \ + sc_err_t ss_set_control_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + sc_err_t ss_get_control_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t *val); \ + sc_err_t ss_irq_enable_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t mask, sc_bool_t enable); \ + sc_err_t ss_irq_status_base(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t *status); \ + void ss_irq_trigger_base(sc_sub_t ss, sc_irq_group_t group, uint32_t \ + irq, sc_rm_pt_t pt); \ + void ss_dump_base(sc_sub_t ss, sc_bool_t xrdc, sc_bool_t dsc, sc_bool_t \ + clk); \ + void ss_do_mem_repair_base(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t \ + enable); \ + void ss_updown_base(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_base(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + void ss_iso_disable_base(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_link_enable_base(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_ssi_power_base(sc_sub_t ss, sc_bool_t enable); \ + void ss_ssi_bhole_mode_base(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_pause_mode_base(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_wait_idle_base(sc_sub_t ss, sc_sub_t remote, uint8_t port); \ + void ss_adb_enable_base(sc_sub_t ss, sc_sub_t remote, sc_bool_t \ + enable); \ + void ss_adb_wait_base(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_prepost_clock_mode_base(sc_sub_t ss, ss_clock_t clk, \ + ss_prepost_t type, sc_pm_clk_mode_t from_mode, sc_pm_clk_mode_t \ + to_mode); \ + sc_bool_t ss_rdc_is_did_vld_base(sc_sub_t ss, const sc_rm_perm_t \ + *perms); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_BASE \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + +#endif + +#endif /* SC_SS_BASE_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/base/v1/dsc.h b/platform/ss/base/v1/dsc.h new file mode 100755 index 0000000..ea369fb --- /dev/null +++ b/platform/ss/base/v1/dsc.h @@ -0,0 +1,142 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the generic DSC header info defined by the standards + * doc. + * + * @addtogroup BASE_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_BASE_DSC_H +#define SC_SS_BASE_DSC_H + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_DSCMIX REGBIT(0, 0) +#define RST_SS REGBIT(0, 1) +#define RST_SS_PD2 REGBIT(0, 2) +#define RST_SS_PD3 REGBIT(0, 3) +#define RST_SS_PD4 REGBIT(0, 4) +#define RST_SS_PD5 REGBIT(0, 5) +#define RST_SS_PD6 REGBIT(0, 6) +#define RST_SS_MEM_REPAIR REGBIT(0, 7) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SSI0_PM REGBIT(0, 0) +#define GPR_SSI0_BHM REGBIT(0, 1) +#define GPR_SSI0_ISO_CONTROL REGBIT(0, 2) +#define GPR_SSI0_POWER_CONTROL REGBIT(0, 3) +#define GPR_SSI1_PM REGBIT(0, 4) +#define GPR_SSI1_BHM REGBIT(0, 5) +#define GPR_SSI1_ISO_CONTROL REGBIT(0, 6) +#define GPR_SSI1_POWER_CONTROL REGBIT(0, 7) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_SSI0_SI REGBIT(0, 0) +#define GPS_SSI0_RI REGBIT(0, 1) +#define GPS_SSI1_SI REGBIT(0, 2) +#define GPS_SSI1_RI REGBIT(0, 3) +#define GPS_SSI0_PM_DATA_PEND REGBIT(0, 4) +#define GPS_SSI1_PM_DATA_PEND REGBIT(0, 5) +/** @} */ + +/*! + * @name DSC IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_TEMP_PANIC REGBIT64(0, 0) +#define IRQ_TEMP_LOW REGBIT64(0, 1) +#define IRQ_TEMP_HIGH REGBIT64(0, 2) +#define IRQ_MSI_ERR REGBIT64(0, 3) +#define IRQ_MSI_OVFL REGBIT64(0, 4) +#define IRQ_MSI_AHB_OVFL REGBIT64(0, 5) +#define IRQ_BIST REGBIT64(0, 6) +#define IRQ_PWRCTRL_PFET_LF_ACK REGBIT64(0, 16) +#define IRQ_PWRCTRL_PFET_HF_ACK REGBIT64(0, 24) +/** @} */ + +/*! + * @name AI Toggle Mask Definitions + */ +/** @{ */ +#define AI_ANA_PLL0 REGBIT(0, 0) +#define AI_ANA_PLL1 REGBIT(0, 1) +#define AI_ANA_PLL2 REGBIT(0, 2) +#define AI_ANA_OSC24M REGBIT(0, 3) +#define AI_ANA_RC200OSC REGBIT(0, 4) +#define AI_ANA_VDROP_PROCMON REGBIT(0, 5) +#define AI_ANA_TEMP_SENSE REGBIT(0, 6) +#define AI_ANA_LVDS_TRANSCEIVER REGBIT(0, 7) +#define AI_ANA_NEG_CHARGE_PUMP REGBIT(0, 8) +#define AI_ANA_WELL_LEVEL_SOURCE REGBIT(0, 9) +#define AI_ANA_BANDGAP_REFERENCE REGBIT(0, 10) +#define AI_ANA_VA_REF_GEN REGBIT(0, 11) +#define AI_ANA_DIFF_CLOCK_REPEATER REGBIT(0, 12) +#define AI_ANA_DIFF_ROOT_CLK_BUFFER REGBIT(0, 13) +#define AI_ANA_DIFF_CLOCK_TERM REGBIT(0, 14) +#define AI_PHY_PHY_LDO REGBIT(0, 17) +#define AI_PHY_LVDS_TRANSCEIVER REGBIT(0, 18) +#define AI_PHY_BANDGAP_REFERENCE REGBIT(0, 19) +#define AI_PHY_VA_REF_GEN REGBIT(0, 20) +#define AI_PHY_DIFF_CLOCK_REPEATER REGBIT(0, 21) +#define AI_PHY_DIFF_ROOT_CLK_BUF0 REGBIT(0, 22) +#define AI_PHY_DIFF_ROOT_CLK_BUF1 REGBIT(0, 23) +#define AI_PHY_DIFF_ROOT_CLK_BUF2 REGBIT(0, 24) +#define AI_PHY_DIFF_CLOCK_TERM0 REGBIT(0, 25) +#define AI_PHY_DIFF_CLOCK_TERM1 REGBIT(0, 26) +#define AI_PHY_DIFF_CLOCK_TERM2 REGBIT(0, 27) +#define AI_PHY_DIFF_CLOCK_TERM3 REGBIT(0, 28) +/** @} */ + +#endif /* SC_SS_BASE_DSC_H */ + +/** @} */ + diff --git a/platform/ss/base/v1/ss.h b/platform/ss/base/v1/ss.h new file mode 100755 index 0000000..3881517 --- /dev/null +++ b/platform/ss/base/v1/ss.h @@ -0,0 +1,204 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the base subsystem API. + * + * @addtogroup BASE_SS BASE: Base Subsystem + * + * Module for Base subsystem access. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_BASE_H +#define SC_SS_BASE_H + +/* Includes */ + +#include "main/types.h" +#include "ss/inf/inf.h" +#include "svc/pm/svc.h" +#include "drivers/xrdc2/fsl_xrdc2.h" +#include "main/sched.h" + +/* Defines */ + +#define PD_DSC 0U +#define PD_SS 1U + +#define CLKOFFTRANS() ((from_mode <= SC_PM_PW_MODE_STBY) && (to_mode <= SC_PM_PW_MODE_STBY)) +#define CLK2OFF() ((from_mode > SC_PM_PW_MODE_STBY) && (to_mode <= SC_PM_PW_MODE_STBY)) +#define CLK2ON() ((from_mode <= SC_PM_PW_MODE_STBY) && (to_mode > SC_PM_PW_MODE_STBY)) +#define PWR2OFF() (to_mode == SC_PM_PW_MODE_OFF) +#define HSCLK() ((from_mode <= SC_PM_PW_MODE_LP) && (to_mode > SC_PM_PW_MODE_LP)) +#define LSCLK() ((from_mode > SC_PM_PW_MODE_LP) && (to_mode == SC_PM_PW_MODE_LP)) +#define PWR2ON() (from_mode == SC_PM_PW_MODE_OFF) +#define RUN2CLKOFF() ((from_mode > SC_PM_PW_MODE_STBY) && (to_mode == SC_PM_PW_MODE_STBY)) + +#define SS_RESET_NONE 0x7FFFU +#define SS_RESET_LINK 0x8000U + +/* Types */ + +/*! + * This type is used store static constant info on the signals for + * a P-channel interface. + */ +typedef struct +{ + uint8_t pstate; + uint8_t pstate_width; + uint8_t preq; + uint8_t paccept; + uint8_t pdeny; + uint8_t pactive; + uint8_t pactive_width; +} ss_pchannel_t; + +/*! + * This type is used store static constant info on the signals for + * a Q-channel interface. + */ +typedef struct +{ + uint8_t qreqn; + uint8_t qacceptn; + uint8_t qdeny; + uint8_t qactive; +} ss_qchannel_t; + +typedef uint16_t ss_reset_list_t; + +/* Functions */ + +SS_FUNC_PROTO_BASE + +#if (defined(FSL_FEATURE_DSC_HAS_PER_RESET) && FSL_FEATURE_DSC_HAS_PER_RESET) +void ss_reset_resource(ECSR_Reset_Type *csr_base, sc_sub_t ss, ss_idx_t ss_idx, + const ss_reset_list_t *reset_list, sc_bool_t old_sequence); +void ss_setup_reset_clk(sc_sub_t ss, ss_idx_t ss_idx, sc_pm_clk_t clk, + sc_bool_t enable); +void ss_setup_reset_plls(sc_sub_t ss, sc_bool_t enable); +#endif +void ss_init_boot_base(sc_sub_t ss, ss_idx_t ss_idx, sc_pm_power_mode_t to_mode); +sc_bool_t ss_is_powered(sc_sub_t ss); +void ss_set_rsrc_clks(sc_sub_t ss, ss_idx_t ss_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); +void ss_trans_pd(sc_sub_t ss, dsc_pdom_t pd, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); +uint8_t ss_pchannel_get_activity(sc_dsc_t dsc, const ss_pchannel_t channel); +uint8_t ss_pchannel_set_state(sc_dsc_t dsc, const ss_pchannel_t channel, + uint8_t new_state); +sc_bool_t ss_qchannel_set_state(sc_dsc_t dsc, const ss_qchannel_t channel, + sc_bool_t new_state); +void ss_ssi_link(sc_sub_t local, sc_sub_t remote, uint8_t local_port, + uint8_t remote_port, sc_bool_t enable); +void ss_ssi_po_link(sc_sub_t local, sc_sub_t remote, uint8_t port, + sc_bool_t enable); +void ss_adb_link(sc_sub_t local, sc_sub_t remote, sc_bool_t enable); +void ss_adb_enb(sc_sub_t ss, uint32_t adb, sc_bool_t enable); +void ss_adb_x2_enb(sc_sub_t ss, uint32_t adb1, uint32_t adb2, sc_bool_t enable); +void ss_adb_wt(sc_sub_t ss, uint32_t adb, sc_bool_t enable); +void ss_adb_x2_wt(sc_sub_t ss, uint32_t adb1, uint32_t adb2, sc_bool_t enable); +sc_err_t ss_check_pll_rate(sc_sub_t ss, ss_clock_t clk_index, + const sc_pm_clock_rate_t *rate, sc_bool_t rom_boot); +void ss_config_pll_rate(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clock_rate_t *rate, sc_bool_t rom_boot); +sc_err_t ss_config_clk_rate(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clock_rate_t *rate, sc_bool_t rom_boot); +void ss_config_pll_mode(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clk_mode_t mode, sc_bool_t rom_boot); +sc_err_t ss_config_clk_mode(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clk_mode_t mode, sc_bool_t rom_boot); +sc_err_t ss_ap_reset_vector(sc_faddr_t addr, uint32_t cpu, sc_bool_t *vector); +void ss_populate_boot_dev_info(ss_idx_t ss_idx, sc_sub_t ss, + sc_bool_t fix_pll_rate); +sc_err_t ss_get_clk_rate_by_index(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clock_rate_t *rate); +sc_pm_clk_parent_t ss_get_parent_index(sc_sub_t ss, ss_clock_t clk_index); +void ss_set_parent_by_index(sc_sub_t ss, ss_clock_t clk_index, + sc_pm_clk_parent_t new_parent_index); +sc_err_t ss_refactor_clks(sc_sub_t ss, ss_idx_t ss_idx, sc_pm_clk_t clk, + const sc_pm_clock_rate_t *cur_rate, sc_pm_clock_rate_t *rate); +void ss_active_bias_domains(sc_sub_t ss, uint8_t *active_mask, uint8_t *idle_mask); +void ss_config_max_core_freq(sc_sub_t ss, ss_clock_t pll_index, ss_clock_t cpu_clk_index, + dsc_clk_type_t pll_type, sc_pm_clock_rate_t max_rate); +void ss_trans_power_mode_noxrdc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); + +#ifdef XRDC_SUPPORT + void ss_rdc_enable_check(void); + void ss_rdc_power_down(sc_sub_t ss, dsc_pdom_t pd); + void ss_rdc_set_custom_master(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, sc_rm_spa_t pa, + sc_rm_did_t did, sc_rm_sid_t sid, xrdc_match_t match, + xrdc_match_t mask, uint8_t cid); + void ss_rdc_set_custom_mda(sc_sub_t ss, sc_rm_idx_t xrdc_master_idx, + sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, sc_rm_spa_t pa, sc_rm_did_t did, + sc_rm_sid_t sid, xrdc_match_t match, xrdc_match_t mask, uint8_t cid); +#endif /* XRDC_SUPPORT */ +void ss_dsc_irq_handler_base(sc_dsc_t dsc, + const ss_dsc_l2irq_handler *ss_dsc_l2irq_handlers, + const ss_dsc_l2irq_handler *ss_l2irq_handlers); +sc_bool_t ss_dsc_handler_default(sc_dsc_t dsc, uint32_t irqIndex); + +/* Debug Functions */ + +#if defined(DEBUG) || defined(GCOV) + void ss_dump_header_base(sc_sub_t ss); + void ss_dump_master_counts_base(sc_sub_t ss); + void ss_dump_xrdc_base(sc_sub_t ss, sc_dsc_t dsc, + const ss_base_info_t *base); + void ss_dump_clocks(sc_sub_t ss); +#endif + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_dsc_l2irq_handlers_base[]; +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_base[]; +extern sc_bool_t xrdc_enable; +extern sc_bool_t base_noflushl2; +extern sc_bool_t base_nopoweroff; +extern sc_bool_t base_gic_noblock; + +#endif /* SC_SS_BASE_H */ + +/** @} */ + diff --git a/platform/ss/cci/v1/Makefile b/platform/ss/cci/v1/Makefile new file mode 100755 index 0000000..e2cc168 --- /dev/null +++ b/platform/ss/cci/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/cci/v1/ss.o + +CONFIGH += $(SRC)/ss/cci/v1/config.h $(SRC)/ss/cci/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/cci/v1/resource.txt + +CLK_MD += $(SRC)/ss/cci/v1/clock.txt + +CTRL_MD += $(SRC)/ss/cci/v1/control.txt + +DIRS += $(OUT)/ss/cci/v1 + diff --git a/platform/ss/cci/v1/config.h b/platform/ss/cci/v1/config.h new file mode 100644 index 0000000..7128cb2 --- /dev/null +++ b/platform/ss/cci/v1/config.h @@ -0,0 +1,134 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the CCI subsystem. + * + * @addtogroup CCI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_CCI_CONFIG_H +#define SC_SS_CCI_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_CCI 1U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_CCI \ + sc_err_t ss_set_cpu_power_mode_cci(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t \ + wake_src); \ + void ss_prepost_power_mode_cci(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + void ss_link_enable_cci(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_ssi_bhole_mode_cci(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_pause_mode_cci(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_wait_idle_cci(sc_sub_t ss, sc_sub_t remote, uint8_t port); \ + sc_bool_t ss_rdc_is_did_vld_cci(sc_sub_t ss, const sc_rm_perm_t \ + *perms); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_CCI \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_cci, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_cci, \ + ss_iso_disable_base, \ + ss_link_enable_cci, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_cci, \ + ss_ssi_pause_mode_cci, \ + ss_ssi_wait_idle_cci, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_cci, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_CCI_0 \ + "CCI", \ + +#endif + +#endif /* SC_SS_CCI_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/cci/v1/dsc.h b/platform/ss/cci/v1/dsc.h new file mode 100755 index 0000000..0e30158 --- /dev/null +++ b/platform/ss/cci/v1/dsc.h @@ -0,0 +1,85 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup CCI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CCI_DSC_H +#define SC_SS_CCI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_ECOREVNUM REGBIT(1, 16) +#define GPR_CCI_CSYSREQ REGBIT(1, 24) +#define GPR_CCI_HYST_CTRL REGBIT(1, 30) +#define GPR_CCI_AUTO_GATE REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_CSYSACK_CCI REGBIT(0, 28) +#define GPS_CACTIVE_CCI REGBIT(0, 29) +#define GPS_CACTIVEM2_CCI REGBIT(0, 30) +#define GPS_CACTIVE_A72_ADB REGBIT(0, 31) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CACTIVE REGBIT64(1, 0) +#define IRQ_CACTIVEM REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_CCI_DSC_H */ + +/** @} */ + diff --git a/platform/ss/cci/v1/rsrc.h b/platform/ss/cci/v1/rsrc.h new file mode 100644 index 0000000..63484a2 --- /dev/null +++ b/platform/ss/cci/v1/rsrc.h @@ -0,0 +1,62 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the CCI subsystem. + * + * @addtogroup CCI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_CCI_RSRC_H +#define SC_SS_CCI_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_CCI 0U +/** @} */ + +#endif /* SC_SS_CCI_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/cci/v1/ss.h b/platform/ss/cci/v1/ss.h new file mode 100755 index 0000000..83f08d9 --- /dev/null +++ b/platform/ss/cci/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the CCI subsystem API. + * + * @addtogroup CCI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CCI_SS_H +#define SC_SS_CCI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(cci) + +/* Functions */ + +SS_FUNC_PROTO_CCI + +#endif /* SC_SS_CCI_SS_H */ + +/** @} */ + diff --git a/platform/ss/conn/v1/Makefile b/platform/ss/conn/v1/Makefile new file mode 100755 index 0000000..0fec512 --- /dev/null +++ b/platform/ss/conn/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/conn/v1/ss.o + +CONFIGH += $(SRC)/ss/conn/v1/config.h $(SRC)/ss/conn/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/conn/v1/resource.txt + +CLK_MD += $(SRC)/ss/conn/v1/clock.txt + +CTRL_MD += $(SRC)/ss/conn/v1/control.txt + +DIRS += $(OUT)/ss/conn/v1 + diff --git a/platform/ss/conn/v1/config.h b/platform/ss/conn/v1/config.h new file mode 100644 index 0000000..a404c29 --- /dev/null +++ b/platform/ss/conn/v1/config.h @@ -0,0 +1,143 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the CONN subsystem. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_CONN_CONFIG_H +#define SC_SS_CONN_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_CONN 16U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_CONN \ + void ss_init_conn(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_set_control_conn(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + void ss_updown_conn(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_conn(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + void ss_iso_disable_conn(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_CONN \ + { \ + ss_init_conn, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_conn, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_conn, \ + ss_prepost_power_mode_conn, \ + ss_iso_disable_conn, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_CONN_0 \ + "SDHC_0", \ + "SDHC_1", \ + "SDHC_2", \ + "ENET_0", \ + "ENET_1", \ + "DMA_4_CH0", \ + "DMA_4_CH1", \ + "DMA_4_CH2", \ + "DMA_4_CH3", \ + "DMA_4_CH4", \ + "USB_0", \ + "USB_1", \ + "USB_0_PHY", \ + "USB_2", \ + "USB_2_PHY", \ + "NAND", \ + +#endif + +#endif /* SC_SS_CONN_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/conn/v1/dsc.h b/platform/ss/conn/v1/dsc.h new file mode 100755 index 0000000..54cbba6 --- /dev/null +++ b/platform/ss/conn/v1/dsc.h @@ -0,0 +1,142 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CONN_DSC_H +#define SC_SS_CONN_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_USB2 REGBIT(0, 2) +#define RST_USB3_AON REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_ENET_CTRL0 REGBIT(0, 16) +#define GPR_ENET_CTRL1 REGBIT(0, 17) +#define GPR_ISO_USB3_NONSS REGBIT(0, 18) +#define GPR_ISO_USB3_SS REGBIT(0, 19) +#define GPR_ISO_USB2 REGBIT(0, 20) +#define GPR_PL301_CACHE_DIS REGBIT(0, 21) +#define GPR_PL301_M12_ID_FILTER REGBIT(0, 22) +#define GPR_PL301_FORCE_CACHEABLE REGBIT(0, 23) +#define GPR_ENET1_MUX REGBIT(0, 24) +#define GPR_ENET2_MUX REGBIT(0, 25) +#define GPR_ENET1_IPG_STOP REGBIT(0, 26) +#define GPR_ENET2_IPG_STOP REGBIT(0, 27) +#define GPR_ENET1_TX_CLK_SEL REGBIT(0, 28) +#define GPR_ENET2_TX_CLK_SEL REGBIT(0, 29) +#define GPR_USB2PHY_IPG_CLK_ACTIVE REGBIT(0, 30) +#define GPR_USB2PHY_XTAL_VLD REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_ENET1_CLKDIV_SEL REGBIT(1, 33) +#define GPR_ENET2_CLKDIV_SEL REGBIT(1, 34) +#define GPR_USB_PHY_TRIM REGBIT(1, 35) +#define GPR_DIS REGBIT(1, 57) +#define GPR_ENET1_50_DISABLE REGBIT(1, 58) +#define GPR_ENET1_125_DISABLE REGBIT(1, 59) +#define GPR_ENET2_50_DISABLE REGBIT(1, 60) +#define GPR_ENET2_125_DISABLE REGBIT(1, 61) +#define GPR_ENET1_125_SEL REGBIT(1, 62) +#define GPR_ENET2_125_SEL REGBIT(1, 63) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_ENET1_IPG_STOP_ACK REGBIT(0, 6) +#define GPS_ENET2_IPG_STOP_ACK REGBIT(0, 7) +/** @} */ + +/*! + * @name IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_ENET1_BUF1 REGBIT(1, 3) +#define IRQ_ENET1_BUF2 REGBIT(1, 4) +#define IRQ_ENET1 REGBIT(1, 5) +#define IRQ_ENET1_TIME REGBIT(1, 6) +#define IRQ_ENET2_BUF1 REGBIT(1, 7) +#define IRQ_ENET2_BUF2 REGBIT(1, 8) +#define IRQ_ENET2 REGBIT(1, 9) +#define IRQ_ENET2_TIME REGBIT(1, 10) +#define IRQ_DTCP REGBIT(1, 11) +#define IRQ_USBOH_OTG REGBIT(1, 14) +#define IRQ_USBOH_HSIC REGBIT(1, 15) +#define IRQ_USBOH_PHY REGBIT(1, 16) +#define IRQ_USBOH_WAKE REGBIT(1, 17) +#define IRQ_NAND_BCH REGBIT(1, 18) +#define IRQ_NAND_GPMI REGBIT(1, 19) +#define IRQ_DMA_CH0 REGBIT(1, 20) +#define IRQ_DMA_CH1 REGBIT(1, 21) +#define IRQ_DMA_CH2 REGBIT(1, 22) +#define IRQ_DMA_CH3 REGBIT(1, 23) +#define IRQ_DMA_CH4 REGBIT(1, 24) +#define IRQ_DMA_ERR REGBIT(1, 25) +#define IRQ_USB3 REGBIT(1, 26) +#define IRQ_NAND_DMA REGBIT(1, 27) +/** @} */ + +#endif /* SC_SS_CONN_DSC_H */ + +/** @} */ + diff --git a/platform/ss/conn/v1/rsrc.h b/platform/ss/conn/v1/rsrc.h new file mode 100644 index 0000000..5905d82 --- /dev/null +++ b/platform/ss/conn/v1/rsrc.h @@ -0,0 +1,77 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the CONN subsystem. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_CONN_RSRC_H +#define SC_SS_CONN_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_SDHC_0 0U +#define SS_R_SDHC_1 1U +#define SS_R_SDHC_2 2U +#define SS_R_ENET_0 3U +#define SS_R_ENET_1 4U +#define SS_R_DMA_4_CH0 5U +#define SS_R_DMA_4_CH1 6U +#define SS_R_DMA_4_CH2 7U +#define SS_R_DMA_4_CH3 8U +#define SS_R_DMA_4_CH4 9U +#define SS_R_USB_0 10U +#define SS_R_USB_1 11U +#define SS_R_USB_0_PHY 12U +#define SS_R_USB_2 13U +#define SS_R_USB_2_PHY 14U +#define SS_R_NAND 15U +/** @} */ + +#endif /* SC_SS_CONN_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/conn/v1/ss.h b/platform/ss/conn/v1/ss.h new file mode 100755 index 0000000..7ed2685 --- /dev/null +++ b/platform/ss/conn/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the CONN subsystem API. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CONN_SS_H +#define SC_SS_CONN_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(conn) + +/* Functions */ + +SS_FUNC_PROTO_CONN + +#endif /* SC_SS_CONN_SS_H */ + +/** @} */ + diff --git a/platform/ss/conn/v2/Makefile b/platform/ss/conn/v2/Makefile new file mode 100755 index 0000000..2cc2d49 --- /dev/null +++ b/platform/ss/conn/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/conn/v2/ss.o + +CONFIGH += $(SRC)/ss/conn/v2/config.h $(SRC)/ss/conn/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/conn/v2/resource.txt + +CLK_MD += $(SRC)/ss/conn/v2/clock.txt + +CTRL_MD += $(SRC)/ss/conn/v2/control.txt + +DIRS += $(OUT)/ss/conn/v2 + diff --git a/platform/ss/conn/v2/dsc.h b/platform/ss/conn/v2/dsc.h new file mode 100755 index 0000000..185bb27 --- /dev/null +++ b/platform/ss/conn/v2/dsc.h @@ -0,0 +1,145 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CONN_DSC_H +#define SC_SS_CONN_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_USB2 REGBIT(0, 2) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_ENET_QOS_DIS_CRC_CHK REGBIT(0, 10) +#define GPR_ENET_QOS_CLK_GEN_EN REGBIT(0, 11) +#define GPR_ENET_QOS_INTF_SEL REGBIT(0, 12) +#define GPR_ENET_RXC_DELAY REGBIT(0, 16) +#define GPR_ENET_EC0_DIS REGBIT(0, 18) +#define GPR_ISO_USB_OTG1 REGBIT(0, 19) +#define GPR_ISO_USB_OTG2 REGBIT(0, 20) +#define GPR_PL301_CACHE_DIS REGBIT(0, 21) +#define GPR_PL301_M12_ID_FILTER REGBIT(0, 22) +#define GPR_PL301_FORCE_CACHEABLE REGBIT(0, 23) +#define GPR_ENET1_MUX REGBIT(0, 24) +#define GPR_ENET2_MUX REGBIT(0, 25) +#define GPR_ENET1_IPG_STOP REGBIT(0, 26) +#define GPR_ENET1_TX_CLK_SEL REGBIT(0, 28) +#define GPR_USB2PHY_IPG_CLK_ACTIVE REGBIT(0, 30) +#define GPR_USB2PHY_XTAL_VLD REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_ENET1_CLKDIV_SEL REGBIT(1, 33) +#define GPR_USB_PHY_TRIM REGBIT(1, 35) +#define GPR_DIS REGBIT(1, 57) +#define GPR_ENET1_50_DISABLE REGBIT(1, 58) +#define GPR_ENET1_125_DISABLE REGBIT(1, 59) +#define GPR_ENET2_50_DISABLE REGBIT(1, 60) +#define GPR_ENET2_125_DISABLE REGBIT(1, 61) +#define GPR_ENET1_125_SEL REGBIT(1, 62) +#define GPR_ENET2_125_SEL REGBIT(1, 63) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_ENET1_IPG_STOP_ACK REGBIT(0, 6) +/** @} */ + +/*! + * @name IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_ENET1_BUF1 REGBIT(1, 3) +#define IRQ_ENET1_BUF2 REGBIT(1, 4) +#define IRQ_ENET1 REGBIT(1, 5) +#define IRQ_ENET1_TIME REGBIT(1, 6) +#define IRQ_ENET2_PMT REGBIT(1, 7) +#define IRQ_ENET2 REGBIT(1, 8) +#define IRQ_USBOH_OTG REGBIT(1, 14) +#define IRQ_USBOH_OTG2 REGBIT(1, 15) +#define IRQ_USBOH_PHY REGBIT(1, 16) +#define IRQ_USBOH_WAKE REGBIT(1, 17) +#define IRQ_NAND_BCH REGBIT(1, 18) +#define IRQ_NAND_GPMI REGBIT(1, 19) +#define IRQ_NAND_DMA REGBIT(1, 27) +/** @} */ + +#if (defined(FSL_FEATURE_DSC_HAS_PER_RESET) && FSL_FEATURE_DSC_HAS_PER_RESET) +/*! + * @name ECSR 0x00 Reset Bit Definitions + */ +/** @{ */ +#define CSR_SDHC1_RESET REGBIT8(0x0, 0) +#define CSR_SDHC2_RESET REGBIT8(0x0, 1) +#define CSR_SDHC3_RESET REGBIT8(0x0, 2) +#define CSR_ENET1_RESET REGBIT8(0x0, 3) +#define CSR_ENET2_RESET REGBIT8(0x0, 4) +#define CSR_USB_RESET REGBIT8(0x0, 5) +#define CSR_USB_PHY1_RESET REGBIT8(0x0, 6) +#define CSR_USB_PHY2_RESET REGBIT8(0x0, 7) +#define CSR_NAND_RESET REGBIT8(0x0, 8) +/** @} */ +#endif + +#endif /* SC_SS_CONN_DSC_H */ + +/** @} */ + diff --git a/platform/ss/conn/v2/ss.h b/platform/ss/conn/v2/ss.h new file mode 100755 index 0000000..8bdbc6d --- /dev/null +++ b/platform/ss/conn/v2/ss.h @@ -0,0 +1,62 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the CONN subsystem API. + * + * @addtogroup CONN_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CONN_SS_H +#define SC_SS_CONN_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(conn) + +/* Functions */ + +SS_FUNC_PROTO_CONN + +#endif /* SC_SS_CONN_SS_H */ + +/** @} */ + diff --git a/platform/ss/csi/v1/Makefile b/platform/ss/csi/v1/Makefile new file mode 100755 index 0000000..f8c2750 --- /dev/null +++ b/platform/ss/csi/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/csi/v1/ss.o + +CONFIGH += $(SRC)/ss/csi/v1/config.h $(SRC)/ss/csi/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/csi/v1/resource.txt + +CLK_MD += $(SRC)/ss/csi/v1/clock.txt + +CTRL_MD += $(SRC)/ss/csi/v1/control.txt + +DIRS += $(OUT)/ss/csi/v1 + diff --git a/platform/ss/csi/v1/config.h b/platform/ss/csi/v1/config.h new file mode 100644 index 0000000..cb23634 --- /dev/null +++ b/platform/ss/csi/v1/config.h @@ -0,0 +1,134 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the CSI subsystem. + * + * @addtogroup CSI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_CSI_CONFIG_H +#define SC_SS_CSI_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_CSI 3U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_CSI \ + void ss_init_csi(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_trans_power_mode_csi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_CSI \ + { \ + ss_init_csi, \ + ss_trans_power_mode_csi, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_CSI_0 \ + "CSI_0", \ + "CSI_0_PWM_0", \ + "CSI_0_I2C_0", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_CSI_1 \ + "CSI_1", \ + "CSI_1_PWM_0", \ + "CSI_1_I2C_0", \ + +#endif + +#endif /* SC_SS_CSI_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/csi/v1/dsc.h b/platform/ss/csi/v1/dsc.h new file mode 100755 index 0000000..9137f06 --- /dev/null +++ b/platform/ss/csi/v1/dsc.h @@ -0,0 +1,102 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup CSI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CSI_DSC_H +#define SC_SS_CSI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_MIPI REGBIT(0, 2) +#define RST_BUS REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 0) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 1) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 2) +#define GPR_PWM0_IPG_STOP REGBIT(0, 3) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 4) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 5) +#define GPR_I2C0_IPG_STOP REGBIT(0, 6) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 7) +#define GPR_PHY_ISO REGBIT(0, 16) +#define GPR_DISPLAY_CTRL_LINK_SLV REGBIT(0, 25) +#define GPR_RX_RCAL REGBIT(0, 26) +#define GPR_RXLPRP0 REGBIT(0, 28) +#define GPR_RXLPRP1 REGBIT(0, 29) +#define GPR_RXCDRP0 REGBIT(0, 30) +#define GPR_RXCDRP1 REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 0) +#define GPS_LANES_STOPPED REGBIT(0, 1) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO REGBIT64(1, 0) +#define IRQ_LPI2C0 REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_CSI_DSC_H */ + +/** @} */ + diff --git a/platform/ss/csi/v1/rsrc.h b/platform/ss/csi/v1/rsrc.h new file mode 100644 index 0000000..1bbc5a6 --- /dev/null +++ b/platform/ss/csi/v1/rsrc.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the CSI subsystem. + * + * @addtogroup CSI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_CSI_RSRC_H +#define SC_SS_CSI_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_CSI_0 0U +#define SS_R_CSI_0_PWM_0 1U +#define SS_R_CSI_0_I2C_0 2U +#define SS_R_CSI_1 0U +#define SS_R_CSI_1_PWM_0 1U +#define SS_R_CSI_1_I2C_0 2U +/** @} */ + +#endif /* SC_SS_CSI_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/csi/v1/ss.h b/platform/ss/csi/v1/ss.h new file mode 100755 index 0000000..b13c092 --- /dev/null +++ b/platform/ss/csi/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the CSI subsystem API. + * + * @addtogroup CSI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_CSI_SS_H +#define SC_SS_CSI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(csi) + +/* Functions */ + +SS_FUNC_PROTO_CSI + +#endif /* SC_SS_CSI_SS_H */ + +/** @} */ + diff --git a/platform/ss/db/v1/Makefile b/platform/ss/db/v1/Makefile new file mode 100755 index 0000000..1482515 --- /dev/null +++ b/platform/ss/db/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/db/v1/ss.o + +CONFIGH += $(SRC)/ss/db/v1/config.h $(SRC)/ss/db/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/db/v1/resource.txt + +CLK_MD += $(SRC)/ss/db/v1/clock.txt + +CTRL_MD += $(SRC)/ss/db/v1/control.txt + +DIRS += $(OUT)/ss/db/v1 + diff --git a/platform/ss/db/v1/config.h b/platform/ss/db/v1/config.h new file mode 100644 index 0000000..e7e56bc --- /dev/null +++ b/platform/ss/db/v1/config.h @@ -0,0 +1,136 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the DB subsystem. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_DB_CONFIG_H +#define SC_SS_DB_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_DB 1U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_DB \ + void ss_rdc_enable_db(sc_sub_t ss, sc_bool_t master); \ + sc_err_t ss_rdc_set_memory_db(sc_sub_t ss, sc_faddr_t start, sc_faddr_t \ + end, sc_bool_t valid, const sc_rm_perm_t *perms, sc_rm_det_t det, \ + sc_rm_rmsg_t rmsg, sc_faddr_t new_start, sc_faddr_t new_end); \ + void ss_updown_db(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_db(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + void ss_link_enable_db(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_ssi_bhole_mode_db(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_pause_mode_db(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_wait_idle_db(sc_sub_t ss, sc_sub_t remote, uint8_t port); \ + void ss_adb_enable_db(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_adb_wait_db(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_DB \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_db, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_db, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_db, \ + ss_prepost_power_mode_db, \ + ss_iso_disable_base, \ + ss_link_enable_db, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_db, \ + ss_ssi_pause_mode_db, \ + ss_ssi_wait_idle_db, \ + ss_adb_enable_db, \ + ss_adb_wait_db, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DB_0 \ + "DB", \ + +#endif + +#endif /* SC_SS_DB_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/db/v1/dsc.h b/platform/ss/db/v1/dsc.h new file mode 100755 index 0000000..7155f24 --- /dev/null +++ b/platform/ss/db/v1/dsc.h @@ -0,0 +1,198 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_DSC_H +#define SC_SS_DB_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SSI2_PM REGBIT(0, 8) +#define GPR_SSI2_BHM REGBIT(0, 9) +#define GPR_SSI3_PM REGBIT(0, 10) +#define GPR_SSI3_BHM REGBIT(0, 11) +#define GPR_SSI4_PM REGBIT(0, 12) +#define GPR_SSI4_BHM REGBIT(0, 13) +#define GPR_SSI5_PM REGBIT(0, 14) +#define GPR_SSI5_BHM REGBIT(0, 15) +#define GPR_SSI6_PM REGBIT(0, 16) +#define GPR_SSI6_BHM REGBIT(0, 17) +#define GPR_SSI7_PM REGBIT(0, 18) +#define GPR_SSI7_BHM REGBIT(0, 19) +#define GPR_SSI8_PM REGBIT(0, 20) +#define GPR_SSI8_BHM REGBIT(0, 21) +#define GPR_SSI9_PM REGBIT(0, 22) +#define GPR_SSI9_BHM REGBIT(0, 23) +#define GPR_SSI10_PM REGBIT(0, 24) +#define GPR_SSI10_BHM REGBIT(0, 25) +#define GPR_SSI11_PM REGBIT(0, 26) +#define GPR_SSI11_BHM REGBIT(0, 27) +#define GPR_SSI12_PM REGBIT(0, 28) +#define GPR_SSI12_BHM REGBIT(0, 29) +#define GPR_SSI13_PM REGBIT(0, 30) +#define GPR_SSI13_BHM REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_SSI14_PM REGBIT(1, 0) +#define GPR_SSI14_BHM REGBIT(1, 1) +#define GPR_SSI15_PM REGBIT(1, 2) +#define GPR_SSI15_BHM REGBIT(1, 3) +#define GPR_SSI_DRC0_PM0 REGBIT(1, 4) +#define GPR_SSI_DRC0_PM1 REGBIT(1, 5) +#define GPR_SSI_DRC0_BHM0 REGBIT(1, 6) +#define GPR_SSI_DRC0_BHM1 REGBIT(1, 7) +#define GPR_SSI_DRC1_PM0 REGBIT(1, 8) +#define GPR_SSI_DRC1_PM1 REGBIT(1, 9) +#define GPR_SSI_DRC1_BHM0 REGBIT(1, 10) +#define GPR_SSI_DRC1_BHM1 REGBIT(1, 11) +#define GPR_SSI0_TCU_PM0 REGBIT(1, 12) +#define GPR_SSI0_TCU_PM1 REGBIT(1, 13) +#define GPR_SSI0_TCU_PM2 REGBIT(1, 14) +#define GPR_SSI0_TCU_PM3 REGBIT(1, 15) +#define GPR_SSI1_TCU_PM0 REGBIT(1, 16) +#define GPR_SSI1_TCU_PM1 REGBIT(1, 17) +#define GPR_SSI1_TCU_PM2 REGBIT(1, 18) +#define GPR_SSI1_TCU_PM3 REGBIT(1, 19) +#define GPR_SSI2_TCU_PM0 REGBIT(1, 20) +#define GPR_SSI2_TCU_PM1 REGBIT(1, 21) +#define GPR_SSI2_TCU_PM2 REGBIT(1, 22) +#define GPR_SSI2_TCU_PM3 REGBIT(1, 23) +#define GPR_SSI3_TCU_PM0 REGBIT(1, 24) +#define GPR_SSI3_TCU_PM1 REGBIT(1, 25) +#define GPR_SSI3_TCU_PM2 REGBIT(1, 26) +#define GPR_SSI3_TCU_PM3 REGBIT(1, 27) +#define GPR_ADB_PWRDNREQN REGBIT(1, 28) +#define GPR_TBU_PD_QREQN REGBIT(1, 29) +#define GPR_QEN REGBIT(1, 30) +#define GPR_SSI_IDLE_STRAP REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_SSI2_SI REGBIT(0, 4) +#define GPS_SSI2_RI REGBIT(0, 5) +#define GPS_SSI3_SI REGBIT(0, 6) +#define GPS_SSI3_RI REGBIT(0, 7) +#define GPS_SSI4_SI REGBIT(0, 8) +#define GPS_SSI4_RI REGBIT(0, 9) +#define GPS_SSI5_SI REGBIT(0, 10) +#define GPS_SSI5_RI REGBIT(0, 11) +#define GPS_SSI6_SI REGBIT(0, 12) +#define GPS_SSI6_RI REGBIT(0, 13) +#define GPS_SSI7_SI REGBIT(0, 14) +#define GPS_SSI7_RI REGBIT(0, 15) +#define GPS_SSI8_SI REGBIT(0, 16) +#define GPS_SSI8_RI REGBIT(0, 17) +#define GPS_SSI9_SI REGBIT(0, 18) +#define GPS_SSI9_RI REGBIT(0, 19) +#define GPS_SSI10_SI REGBIT(0, 20) +#define GPS_SSI10_RI REGBIT(0, 21) +#define GPS_SSI11_SI REGBIT(0, 22) +#define GPS_SSI11_RI REGBIT(0, 23) +#define GPS_SSI12_SI REGBIT(0, 24) +#define GPS_SSI12_RI REGBIT(0, 25) +#define GPS_SSI13_SI REGBIT(0, 26) +#define GPS_SSI13_RI REGBIT(0, 27) +#define GPS_SSI14_SI REGBIT(0, 28) +#define GPS_SSI14_RI REGBIT(0, 29) +#define GPS_SSI15_SI REGBIT(0, 30) +#define GPS_SSI15_RI REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_SSI_DRC0_SI REGBIT(1, 0) +#define GPS_SSI_DRC0_RI REGBIT(1, 1) +#define GPS_SSI_DRC1_SI REGBIT(1, 2) +#define GPS_SSI_DRC1_RI REGBIT(1, 3) +#define GPS_ADB_PWRDNACKN REGBIT(1, 4) +#define GPS_TBU_PD_QACCEPTN REGBIT(1, 5) +#define GPS_CACTIVE_PG0 REGBIT(1, 6) +#define GPS_CACTIVE_PG1 REGBIT(1, 7) +#define GPS_CACTIVE_PG2 REGBIT(1, 8) +#define GPS_CACTIVE_PG3 REGBIT(1, 9) +#define GPS_CACTIVE_BN REGBIT(1, 10) +#undef GPS_SSI0_PM_DATA_PEND +#define GPS_SSI0_PM_DATA_PEND REGBIT(1, 11) +#undef GPS_SSI1_PM_DATA_PEND +#define GPS_SSI1_PM_DATA_PEND REGBIT(1, 12) +#define GPS_SSI2_PM_DATA_PEND REGBIT(1, 13) +#define GPS_SSI3_PM_DATA_PEND REGBIT(1, 14) +#define GPS_SSI4_PM_DATA_PEND REGBIT(1, 15) +#define GPS_SSI5_PM_DATA_PEND REGBIT(1, 16) +#define GPS_SSI6_PM_DATA_PEND REGBIT(1, 17) +#define GPS_SSI7_PM_DATA_PEND REGBIT(1, 18) +#define GPS_SSI8_PM_DATA_PEND REGBIT(1, 19) +#define GPS_SSI9_PM_DATA_PEND REGBIT(1, 20) +#define GPS_SSI10_PM_DATA_PEND REGBIT(1, 21) +#define GPS_SSI11_PM_DATA_PEND REGBIT(1, 22) +#define GPS_SSI12_PM_DATA_PEND REGBIT(1, 23) +#define GPS_SSI13_PM_DATA_PEND REGBIT(1, 24) +#define GPS_SSI14_PM_DATA_PEND REGBIT(1, 25) +#define GPS_SSI15_PM_DATA_PEND REGBIT(1, 26) +#define GPS_SSI_DRC0_PM_DATA_PEND0 REGBIT(1, 27) +#define GPS_SSI_DRC0_PM_DATA_PEND1 REGBIT(1, 28) +#define GPS_SSI_DRC1_PM_DATA_PEND0 REGBIT(1, 29) +#define GPS_SSI_DRC1_PM_DATA_PEND1 REGBIT(1, 30) +/** @} */ + +#endif /* SC_SS_DB_DSC_H */ + +/** @} */ + diff --git a/platform/ss/db/v1/rsrc.h b/platform/ss/db/v1/rsrc.h new file mode 100644 index 0000000..4c1036c --- /dev/null +++ b/platform/ss/db/v1/rsrc.h @@ -0,0 +1,62 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the DB subsystem. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_DB_RSRC_H +#define SC_SS_DB_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_DB 0U +/** @} */ + +#endif /* SC_SS_DB_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/db/v1/ss.h b/platform/ss/db/v1/ss.h new file mode 100755 index 0000000..a370fa8 --- /dev/null +++ b/platform/ss/db/v1/ss.h @@ -0,0 +1,65 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DB subsystem API. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_SS_H +#define SC_SS_DB_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(db) + +/* Functions */ + +SS_FUNC_PROTO_DB + +void ss_auto_clock_gate_db(sc_bool_t enable); + +#endif /* SC_SS_DB_SS_H */ + +/** @} */ + diff --git a/platform/ss/db/v2/Makefile b/platform/ss/db/v2/Makefile new file mode 100755 index 0000000..91c09fc --- /dev/null +++ b/platform/ss/db/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/db/v2/ss.o + +CONFIGH += $(SRC)/ss/db/v2/config.h $(SRC)/ss/db/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/db/v2/resource.txt + +CLK_MD += $(SRC)/ss/db/v2/clock.txt + +CTRL_MD += $(SRC)/ss/db/v2/control.txt + +DIRS += $(OUT)/ss/db/v2 + diff --git a/platform/ss/db/v2/dsc.h b/platform/ss/db/v2/dsc.h new file mode 100755 index 0000000..aff36b3 --- /dev/null +++ b/platform/ss/db/v2/dsc.h @@ -0,0 +1,150 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_DSC_H +#define SC_SS_DB_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SSI2_PM REGBIT(0, 8) +#define GPR_SSI2_BHM REGBIT(0, 9) +#define GPR_SSI3_PM REGBIT(0, 10) +#define GPR_SSI3_BHM REGBIT(0, 11) +#define GPR_SSI4_PM REGBIT(0, 12) +#define GPR_SSI4_BHM REGBIT(0, 13) +#define GPR_SSI5_PM REGBIT(0, 14) +#define GPR_SSI5_BHM REGBIT(0, 15) +#define GPR_SSI6_PM REGBIT(0, 16) +#define GPR_SSI6_BHM REGBIT(0, 17) +#define GPR_SSI7_PM REGBIT(0, 18) +#define GPR_SSI7_BHM REGBIT(0, 19) +#define GPR_SSI8_PM REGBIT(0, 20) +#define GPR_SSI8_BHM REGBIT(0, 21) +#define GPR_SSI9_PM REGBIT(0, 22) +#define GPR_SSI9_BHM REGBIT(0, 23) +#define GPR_SSI10_PM REGBIT(0, 24) +#define GPR_SSI10_BHM REGBIT(0, 25) +#define GPR_SSI11_PM REGBIT(0, 26) +#define GPR_SSI11_BHM REGBIT(0, 27) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_SSI_DRC0_PM0 REGBIT(1, 4) +#define GPR_SSI_DRC0_PM1 REGBIT(1, 5) +#define GPR_SSI_DRC0_BHM0 REGBIT(1, 6) +#define GPR_SSI_DRC0_BHM1 REGBIT(1, 7) +#define GPR_ADB_PWRDNREQN REGBIT(1, 28) +#define GPR_SSI_IDLE_STRAP REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_SSI2_SI REGBIT(0, 4) +#define GPS_SSI2_RI REGBIT(0, 5) +#define GPS_SSI3_SI REGBIT(0, 6) +#define GPS_SSI3_RI REGBIT(0, 7) +#define GPS_SSI4_SI REGBIT(0, 8) +#define GPS_SSI4_RI REGBIT(0, 9) +#define GPS_SSI5_SI REGBIT(0, 10) +#define GPS_SSI5_RI REGBIT(0, 11) +#define GPS_SSI6_SI REGBIT(0, 12) +#define GPS_SSI6_RI REGBIT(0, 13) +#define GPS_SSI7_SI REGBIT(0, 14) +#define GPS_SSI7_RI REGBIT(0, 15) +#define GPS_SSI8_SI REGBIT(0, 16) +#define GPS_SSI8_RI REGBIT(0, 17) +#define GPS_SSI9_SI REGBIT(0, 18) +#define GPS_SSI9_RI REGBIT(0, 19) +#define GPS_SSI10_SI REGBIT(0, 20) +#define GPS_SSI10_RI REGBIT(0, 21) +#define GPS_SSI11_SI REGBIT(0, 22) +#define GPS_SSI11_RI REGBIT(0, 23) +/** @} */ + +/*! + * @name GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_SSI_DRC0_SI REGBIT(1, 0) +#define GPS_SSI_DRC0_RI REGBIT(1, 1) +#define GPS_ADB_PWRDNACKN REGBIT(1, 4) +#define GPS_CACTIVE_PG0 REGBIT(1, 6) +#define GPS_CACTIVE_PG1 REGBIT(1, 7) +#define GPS_CACTIVE_PG2 REGBIT(1, 8) +#define GPS_CACTIVE_BN REGBIT(1, 10) +#undef GPS_SSI0_PM_DATA_PEND +#define GPS_SSI0_PM_DATA_PEND REGBIT(1, 11) +#undef GPS_SSI1_PM_DATA_PEND +#define GPS_SSI1_PM_DATA_PEND REGBIT(1, 12) +#define GPS_SSI2_PM_DATA_PEND REGBIT(1, 13) +#define GPS_SSI3_PM_DATA_PEND REGBIT(1, 14) +#define GPS_SSI4_PM_DATA_PEND REGBIT(1, 15) +#define GPS_SSI5_PM_DATA_PEND REGBIT(1, 16) +#define GPS_SSI6_PM_DATA_PEND REGBIT(1, 17) +#define GPS_SSI7_PM_DATA_PEND REGBIT(1, 18) +#define GPS_SSI8_PM_DATA_PEND REGBIT(1, 19) +#define GPS_SSI9_PM_DATA_PEND REGBIT(1, 20) +#define GPS_SSI10_PM_DATA_PEND REGBIT(1, 21) +#define GPS_SSI11_PM_DATA_PEND REGBIT(1, 22) +#define GPS_SSI_DRC0_PM_DATA_PEND0 REGBIT(1, 27) +#define GPS_SSI_DRC0_PM_DATA_PEND1 REGBIT(1, 28) +/** @} */ + +#endif /* SC_SS_DB_DSC_H */ + +/** @} */ + diff --git a/platform/ss/db/v2/ss.h b/platform/ss/db/v2/ss.h new file mode 100755 index 0000000..a370fa8 --- /dev/null +++ b/platform/ss/db/v2/ss.h @@ -0,0 +1,65 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DB subsystem API. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_SS_H +#define SC_SS_DB_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(db) + +/* Functions */ + +SS_FUNC_PROTO_DB + +void ss_auto_clock_gate_db(sc_bool_t enable); + +#endif /* SC_SS_DB_SS_H */ + +/** @} */ + diff --git a/platform/ss/db/v4/Makefile b/platform/ss/db/v4/Makefile new file mode 100755 index 0000000..5b71f82 --- /dev/null +++ b/platform/ss/db/v4/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/db/v4/ss.o + +CONFIGH += $(SRC)/ss/db/v4/config.h $(SRC)/ss/db/v4/rsrc.h + +RSRC_MD += $(SRC)/ss/db/v4/resource.txt + +CLK_MD += $(SRC)/ss/db/v4/clock.txt + +CTRL_MD += $(SRC)/ss/db/v4/control.txt + +DIRS += $(OUT)/ss/db/v4 + diff --git a/platform/ss/db/v4/dsc.h b/platform/ss/db/v4/dsc.h new file mode 100755 index 0000000..75b7be8 --- /dev/null +++ b/platform/ss/db/v4/dsc.h @@ -0,0 +1,127 @@ +/* +** ################################################################### +** +** Copyright (c) 2019-2020 Freescale Semiconductor, Inc. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_DSC_H +#define SC_SS_DB_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_V2X REGBIT(0, 2) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SSI2_PM REGBIT(0, 8) +#define GPR_SSI2_BHM REGBIT(0, 9) +#define GPR_SSI3_PM REGBIT(0, 10) +#define GPR_SSI3_BHM REGBIT(0, 11) +#define GPR_SSI4_PM REGBIT(0, 12) +#define GPR_SSI4_BHM REGBIT(0, 13) +#define GPR_SSI5_PM REGBIT(0, 14) +#define GPR_SSI5_BHM REGBIT(0, 15) +#define GPR_SSI6_PM REGBIT(0, 16) +#define GPR_SSI6_BHM REGBIT(0, 17) +#define GPR_V2XDB_ADB_PWRDNREQN REGBIT(0, 18) +#define GPR_DBV2X_ADB_PWRDNREQN REGBIT(0, 19) +#define GPR_SSI_DRC0_PM0 REGBIT(0, 20) +#define GPR_SSI_DRC0_PM1 REGBIT(0, 21) +#define GPR_SSI_DRC0_BHM0 REGBIT(0, 22) +#define GPR_SSI_DRC0_BHM1 REGBIT(0, 23) +#define GPR_V2X_CLOCK_RUN REGBIT(0, 30) +#define GPR_SSI_IDLE_STRAP REGBIT(0, 31) + +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_SSI2_SI REGBIT(0, 4) +#define GPS_SSI2_RI REGBIT(0, 5) +#define GPS_SSI3_SI REGBIT(0, 6) +#define GPS_SSI3_RI REGBIT(0, 7) +#define GPS_SSI4_SI REGBIT(0, 8) +#define GPS_SSI4_RI REGBIT(0, 9) +#define GPS_SSI5_SI REGBIT(0, 10) +#define GPS_SSI5_RI REGBIT(0, 11) +#define GPS_SSI6_SI REGBIT(0, 12) +#define GPS_SSI6_RI REGBIT(0, 13) +#define GPR_V2XDB_ADB_PWRDNACKN REGBIT(0, 14) +#define GPR_DBV2X_ADB_PWRDNACKN REGBIT(0, 15) +#define GPS_SSI_DRC0_SI REGBIT(0, 16) +#define GPS_SSI_DRC0_RI REGBIT(0, 17) +#undef GPS_SSI0_PM_DATA_PEND +#define GPS_SSI0_PM_DATA_PEND REGBIT(0, 20) +#undef GPS_SSI1_PM_DATA_PEND +#define GPS_SSI1_PM_DATA_PEND REGBIT(0, 21) +#define GPS_SSI2_PM_DATA_PEND REGBIT(0, 22) +#define GPS_SSI3_PM_DATA_PEND REGBIT(0, 23) +#define GPS_SSI4_PM_DATA_PEND REGBIT(0, 24) +#define GPS_SSI5_PM_DATA_PEND REGBIT(0, 25) +#define GPS_SSI6_PM_DATA_PEND REGBIT(0, 26) +#define GPS_SSI_DRC0_PM_DATA_PEND0 REGBIT(0, 28) +#define GPS_SSI_DRC0_PM_DATA_PEND1 REGBIT(0, 29) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_SERIOUS_ERR REGBIT64(1, 0) +#define IRQ_V2X_MU REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_DB_DSC_H */ + +/** @} */ + diff --git a/platform/ss/db/v4/ss.h b/platform/ss/db/v4/ss.h new file mode 100755 index 0000000..ee54f79 --- /dev/null +++ b/platform/ss/db/v4/ss.h @@ -0,0 +1,83 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DB subsystem API. + * + * @addtogroup DB_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DB_SS_H +#define SC_SS_DB_SS_H + +#include "ss/inf/inf.h" + +/* Types */ + +typedef enum +{ + SS_V2X_AUTH_IP, + SS_V2X_AUTH_PASS, + SS_V2X_AUTH_FAIL +} ss_v2x_state_t; + +/* Externs */ + +SS_BASE_INFO_PROTO(db) + +/* Functions */ + +SS_FUNC_PROTO_DB + +void ss_auto_clock_gate_db(sc_bool_t enable); +void ss_v2x_enable(void); +void ss_v2x_set_state(ss_v2x_state_t state); +ss_v2x_state_t ss_v2x_get_state(void); +sc_bool_t ss_v2x_clock_run(sc_bool_t enable); +void ss_v2x_auth_finish(void); + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_db[]; + +#endif /* SC_SS_DB_SS_H */ + +/** @} */ + diff --git a/platform/ss/dblogic/v1/Makefile b/platform/ss/dblogic/v1/Makefile new file mode 100755 index 0000000..4dde1af --- /dev/null +++ b/platform/ss/dblogic/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/dblogic/v1/ss.o + +CONFIGH += $(SRC)/ss/dblogic/v1/config.h $(SRC)/ss/dblogic/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/dblogic/v1/resource.txt + +CLK_MD += $(SRC)/ss/dblogic/v1/clock.txt + +CTRL_MD += $(SRC)/ss/dblogic/v1/control.txt + +DIRS += $(OUT)/ss/dblogic/v1 + diff --git a/platform/ss/dblogic/v1/config.h b/platform/ss/dblogic/v1/config.h new file mode 100644 index 0000000..e589935 --- /dev/null +++ b/platform/ss/dblogic/v1/config.h @@ -0,0 +1,142 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the DBLOGIC subsystem. + * + * @addtogroup DBLOGIC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_DBLOGIC_CONFIG_H +#define SC_SS_DBLOGIC_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_DBLOGIC 9U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_DBLOGIC \ + void ss_prepost_power_mode_dblogic(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + void ss_link_enable_dblogic(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t \ + enable); \ + void ss_ssi_power_dblogic(sc_sub_t ss, sc_bool_t enable); \ + void ss_ssi_pause_mode_dblogic(sc_sub_t ss, sc_sub_t remote, uint8_t \ + port, sc_bool_t enable); \ + void ss_ssi_wait_idle_dblogic(sc_sub_t ss, sc_sub_t remote, uint8_t \ + port); \ + void ss_adb_enable_dblogic(sc_sub_t ss, sc_sub_t remote, sc_bool_t \ + enable); \ + void ss_adb_wait_dblogic(sc_sub_t ss, sc_sub_t remote, sc_bool_t \ + enable); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_DBLOGIC \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_dblogic, \ + ss_iso_disable_base, \ + ss_link_enable_dblogic, \ + ss_ssi_power_dblogic, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_dblogic, \ + ss_ssi_wait_idle_dblogic, \ + ss_adb_enable_dblogic, \ + ss_adb_wait_dblogic, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DBLOGIC_0 \ + "DBLOGIC", \ + "GIC_SMMU", \ + "IRQSTR_M4_0", \ + "IRQSTR_M4_1", \ + "SMMU", \ + "GIC", \ + "IRQSTR_SCU2", \ + "IRQSTR_DSP", \ + "STM", \ + +#endif + +#endif /* SC_SS_DBLOGIC_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/dblogic/v1/dsc.h b/platform/ss/dblogic/v1/dsc.h new file mode 100755 index 0000000..8f545df --- /dev/null +++ b/platform/ss/dblogic/v1/dsc.h @@ -0,0 +1,117 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DBLOGIC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DBLOGIC_DSC_H +#define SC_SS_DBLOGIC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SSI0_TBU_PM (0xFUL << 4) +#define GPR_SSI1_TBU_PM (0xFUL << 8) +#define GPR_SSI2_TBU_PM (0xFUL << 12) +#define GPR_SSI3_TBU_PM (0xFUL << 16) +#define GPR_ADB_PWRDNREQN0 REGBIT(0, 26) +#define GPR_STM_NSGUAREN_B REGBIT(0, 27) +#define GPR_ADB_PWRDNREQN1 REGBIT(0, 28) +#define GPR_SSI_IDLE_STRAP REGBIT(0, 29) +#define GPR_TCU_QREQN REGBIT(0, 30) +#define GPR_TCU_SPF_BYPASS REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#undef GPS_SSI0_PM_DATA_PEND +#define GPS_SSI0_PM_DATA_PEND REGBIT(0, 3) +#define GPS_SSI0_TBU_IDLE REGBIT(0, 4) +#define GPS_SSI0_TBU_PM_DATA_PEND REGBIT(0, 5) +#define GPS_SSI1_TBU_IDLE REGBIT(0, 6) +#define GPS_SSI1_TBU_PM_DATA_PEND REGBIT(0, 7) +#define GPS_SSI2_TBU_IDLE REGBIT(0, 8) +#define GPS_SSI2_TBU_PM_DATA_PEND REGBIT(0, 9) +#define GPS_SSI3_TBU_IDLE REGBIT(0, 10) +#define GPS_SSI3_TBU_PM_DATA_PEND REGBIT(0, 11) +#define GPS_STM_QACCEPTN REGBIT(0, 12) +#define GPS_STM_QDENY REGBIT(0, 13) +#define GPS_ADB_PWRDNACKN0 REGBIT(0, 24) +#define GPS_ADB_PWRDNACKN1 REGBIT(0, 25) +#define GPS_ADB_CACTIVE_S0 REGBIT(0, 26) +#define GPS_ADB_CACTIVE_S1 REGBIT(0, 27) +#define GPS_ADB_CACTIVE_M0 REGBIT(0, 28) +#define GPS_ADB_CACTIVE_M1 REGBIT(0, 29) +#define GPS_AWAKEUP_PTW REGBIT(0, 31) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GIC_WAKE00 REGBIT64(1, 0) +#define IRQ_GIC_WAKE01 REGBIT64(1, 1) +#define IRQ_GIC_WAKE02 REGBIT64(1, 2) +#define IRQ_GIC_WAKE03 REGBIT64(1, 3) +#define IRQ_GIC_WAKE10 REGBIT64(1, 4) +#define IRQ_GIC_WAKE11 REGBIT64(1, 5) +#define IRQ_IRQSTR_CTI0 REGBIT64(1, 8) +#define IRQ_IRQSTR_CTI1 REGBIT64(1, 9) +#define IRQ_IRQSTR_CTI2 REGBIT64(1, 10) +#define IRQ_IRQSTR_CTI3 REGBIT64(1, 11) +#define IRQ_IRQSTR_CTI4 REGBIT64(1, 12) +#define IRQ_GIC_ECC_FATAL REGBIT64(1, 13) +#define IRQ_GIC_AXI_ERR REGBIT64(1, 14) +/** @} */ + +#endif /* SC_SS_DBLOGIC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/dblogic/v1/rsrc.h b/platform/ss/dblogic/v1/rsrc.h new file mode 100644 index 0000000..d119673 --- /dev/null +++ b/platform/ss/dblogic/v1/rsrc.h @@ -0,0 +1,70 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the DBLOGIC subsystem. + * + * @addtogroup DBLOGIC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_DBLOGIC_RSRC_H +#define SC_SS_DBLOGIC_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_DBLOGIC 0U +#define SS_R_GIC_SMMU 1U +#define SS_R_IRQSTR_M4_0 2U +#define SS_R_IRQSTR_M4_1 3U +#define SS_R_SMMU 4U +#define SS_R_GIC 5U +#define SS_R_IRQSTR_SCU2 6U +#define SS_R_IRQSTR_DSP 7U +#define SS_R_STM 8U +/** @} */ + +#endif /* SC_SS_DBLOGIC_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/dblogic/v1/ss.h b/platform/ss/dblogic/v1/ss.h new file mode 100755 index 0000000..2e2fae7 --- /dev/null +++ b/platform/ss/dblogic/v1/ss.h @@ -0,0 +1,69 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DBLOGIC subsystem API. + * + * @addtogroup DBLOGIC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DBLOGIC_SS_H +#define SC_SS_DBLOGIC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(dblogic) + +/* Functions */ + +SS_FUNC_PROTO_DBLOGIC + +void smmu0_spf_bypass(sc_bool_t enable); + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_dblogic[]; + +#endif /* SC_SS_DBLOGIC_SS_H */ + +/** @} */ + diff --git a/platform/ss/dc/v1/Makefile b/platform/ss/dc/v1/Makefile new file mode 100755 index 0000000..94d600a --- /dev/null +++ b/platform/ss/dc/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/dc/v1/ss.o + +CONFIGH += $(SRC)/ss/dc/v1/config.h $(SRC)/ss/dc/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/dc/v1/resource.txt + +CLK_MD += $(SRC)/ss/dc/v1/clock.txt + +CTRL_MD += $(SRC)/ss/dc/v1/control.txt + +DIRS += $(OUT)/ss/dc/v1 + diff --git a/platform/ss/dc/v1/config.h b/platform/ss/dc/v1/config.h new file mode 100644 index 0000000..799d8b5 --- /dev/null +++ b/platform/ss/dc/v1/config.h @@ -0,0 +1,164 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the DC subsystem. + * + * @addtogroup DC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_DC_CONFIG_H +#define SC_SS_DC_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_DC 11U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_DC \ + void ss_trans_power_mode_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + sc_err_t ss_set_clock_rate_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_clock_enable_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); \ + sc_err_t ss_set_clock_parent_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t new_parent); \ + sc_err_t ss_get_clock_parent_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); \ + void ss_rdc_set_master_dc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_dump_dc(sc_sub_t ss, sc_bool_t xrdc, sc_bool_t dsc, sc_bool_t \ + clk); \ + void ss_prepost_clock_mode_dc(sc_sub_t ss, ss_clock_t clk, ss_prepost_t \ + type, sc_pm_clk_mode_t from_mode, sc_pm_clk_mode_t to_mode); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_DC \ + { \ + ss_init_base, \ + ss_trans_power_mode_dc, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_dc, \ + ss_get_clock_rate_base, \ + ss_clock_enable_dc, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_dc, \ + ss_get_clock_parent_dc, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_dc, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_dc, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_dc, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DC_0 \ + "DC_0", \ + "DC_0_BLIT_OUT", \ + "DC_0_BLIT2", \ + "DC_0_BLIT1", \ + "DC_0_BLIT0", \ + "DC_0_FRAC0", \ + "DC_0_VIDEO0", \ + "DC_0_VIDEO1", \ + "DC_0_WARP", \ + "DC_0_PLL_0", \ + "DC_0_PLL_1", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DC_1 \ + "DC_1", \ + "DC_1_BLIT_OUT", \ + "DC_1_BLIT2", \ + "DC_1_BLIT1", \ + "DC_1_BLIT0", \ + "DC_1_FRAC0", \ + "DC_1_VIDEO0", \ + "DC_1_VIDEO1", \ + "DC_1_WARP", \ + "DC_1_PLL_0", \ + "DC_1_PLL_1", \ + +#endif + +#endif /* SC_SS_DC_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/dc/v1/dsc.h b/platform/ss/dc/v1/dsc.h new file mode 100755 index 0000000..31486c8 --- /dev/null +++ b/platform/ss/dc/v1/dsc.h @@ -0,0 +1,122 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DC_DSC_H +#define SC_SS_DC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_DSP0 REGBIT(0, 2) +#define RST_DSP1 REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_OBS_SEL2 REGBIT(0, 10) +#define GPR_PXL_LINK_MST1_ADDR REGBIT(0, 24) +#define GPR_PXL_LINK_MST2_ADDR REGBIT(0, 26) +#define GPR_IRIS_MVP_PANIC REGBIT(0, 28) +#define GPR_PXL_LINK_MST1_ENB REGBIT(0, 30) +#define GPR_PXL_LINK_MST2_ENB REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_DC_SYNC_MODE REGBIT(1, 32) +#define GPR_PXL_LINK_MST1_VLD REGBIT(1, 33) +#define GPR_PXL_LINK_MST2_VLD REGBIT(1, 34) +#define GPR_DIV_LINK_CLK_BY_2 REGBIT(1, 35) +#define GPR_KACHUNK_FRAC0 REGBIT(1, 36) +#define GPR_KACHUNK_VID0 REGBIT(1, 37) +#define GPR_KACHUNK_VID1 REGBIT(1, 38) +#define GPR_KACHUNK_WRAP0 REGBIT(1, 39) +#define GPR_PL_SYNC_CTRL0 REGBIT(1, 40) +#define GPR_PL_SYNC_CTRL1 REGBIT(1, 41) +#define GPR_PRG0_SEL REGBIT(1, 42) +#define GPR_PL_DSP0_CLK REGBIT(1, 43) +#define GPR_PL_DSP1_CLK REGBIT(1, 44) +#define GPR_KACHUNK_CNT_NUM0 REGBIT(1, 48) +#define GPR_KACHUNK_CNT_NUM1 REGBIT(1, 49) +#define GPR_KACHUNK_CNT_NUM2 REGBIT(1, 50) +#define GPR_KACHUNK_CNT_NUM3 REGBIT(1, 51) +#define GPR_KACHUNK_CNT_NUM4 REGBIT(1, 52) +#define GPR_KACHUNK_CNT_NUM5 REGBIT(1, 53) +#define GPR_KACHUNK_CNT_NUM6 REGBIT(1, 54) +#define GPR_KACHUNK_CNT_NUM7 REGBIT(1, 55) +#define GPR_KACHUNK_CNT_NUM8 REGBIT(1, 56) +#define GPR_KACHUNK_CNT_NUM9 REGBIT(1, 57) +#define GPR_KACHUNK_CNT_NUM10 REGBIT(1, 58) +#define GPR_KACHUNK_CNT_NUM11 REGBIT(1, 59) +#define GPR_KACHUNK_CNT_NUM12 REGBIT(1, 60) +#define GPR_KACHUNK_CNT_NUM13 REGBIT(1, 61) +#define GPR_KACHUNK_CNT_NUM14 REGBIT(1, 62) +#define GPR_KACHUNK_CNT_NUM15 REGBIT(1, 63) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_GPRCTRL16 REGBIT(0, 16) +#define GPS_GPRCTRL17 REGBIT(0, 17) +/** @} */ + +#endif /* SC_SS_DC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/dc/v1/rsrc.h b/platform/ss/dc/v1/rsrc.h new file mode 100644 index 0000000..e4d2f06 --- /dev/null +++ b/platform/ss/dc/v1/rsrc.h @@ -0,0 +1,83 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the DC subsystem. + * + * @addtogroup DC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_DC_RSRC_H +#define SC_SS_DC_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_DC_0 0U +#define SS_R_DC_0_BLIT_OUT 1U +#define SS_R_DC_0_BLIT2 2U +#define SS_R_DC_0_BLIT1 3U +#define SS_R_DC_0_BLIT0 4U +#define SS_R_DC_0_FRAC0 5U +#define SS_R_DC_0_VIDEO0 6U +#define SS_R_DC_0_VIDEO1 7U +#define SS_R_DC_0_WARP 8U +#define SS_R_DC_0_PLL_0 9U +#define SS_R_DC_0_PLL_1 10U +#define SS_R_DC_1 0U +#define SS_R_DC_1_BLIT_OUT 1U +#define SS_R_DC_1_BLIT2 2U +#define SS_R_DC_1_BLIT1 3U +#define SS_R_DC_1_BLIT0 4U +#define SS_R_DC_1_FRAC0 5U +#define SS_R_DC_1_VIDEO0 6U +#define SS_R_DC_1_VIDEO1 7U +#define SS_R_DC_1_WARP 8U +#define SS_R_DC_1_PLL_0 9U +#define SS_R_DC_1_PLL_1 10U +/** @} */ + +#endif /* SC_SS_DC_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/dc/v1/ss.h b/platform/ss/dc/v1/ss.h new file mode 100755 index 0000000..db9a14c --- /dev/null +++ b/platform/ss/dc/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DC subsystem API. + * + * @addtogroup DC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DC_SS_H +#define SC_SS_DC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(dc) + +/* Functions */ + +SS_FUNC_PROTO_DC + +#endif /* SC_SS_DC_SS_H */ + +/** @} */ + diff --git a/platform/ss/dma/v1/Makefile b/platform/ss/dma/v1/Makefile new file mode 100755 index 0000000..9a81403 --- /dev/null +++ b/platform/ss/dma/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/dma/v1/ss.o + +CONFIGH += $(SRC)/ss/dma/v1/config.h $(SRC)/ss/dma/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/dma/v1/resource.txt + +CLK_MD += $(SRC)/ss/dma/v1/clock.txt + +CTRL_MD += $(SRC)/ss/dma/v1/control.txt + +DIRS += $(OUT)/ss/dma/v1 + diff --git a/platform/ss/dma/v1/config.h b/platform/ss/dma/v1/config.h new file mode 100644 index 0000000..f84a551 --- /dev/null +++ b/platform/ss/dma/v1/config.h @@ -0,0 +1,212 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the DMA subsystem. + * + * @addtogroup DMA_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_DMA_CONFIG_H +#define SC_SS_DMA_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_DMA 87U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_DMA \ + void ss_trans_power_mode_dma(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + sc_err_t ss_set_control_dma(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + void ss_updown_dma(sc_sub_t ss, sc_bool_t up); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_DMA \ + { \ + ss_init_base, \ + ss_trans_power_mode_dma, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_dma, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_dma, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DMA_0 \ + "SPI_0", \ + "SPI_1", \ + "SPI_2", \ + "SPI_3", \ + "UART_0", \ + "UART_1", \ + "UART_2", \ + "UART_3", \ + "UART_4", \ + "EMVSIM_0", \ + "EMVSIM_1", \ + "DMA_0_CH0", \ + "DMA_0_CH1", \ + "DMA_0_CH2", \ + "DMA_0_CH3", \ + "DMA_0_CH4", \ + "DMA_0_CH5", \ + "DMA_0_CH6", \ + "DMA_0_CH7", \ + "DMA_0_CH8", \ + "DMA_0_CH9", \ + "DMA_0_CH10", \ + "DMA_0_CH11", \ + "DMA_0_CH12", \ + "DMA_0_CH13", \ + "DMA_0_CH14", \ + "DMA_0_CH15", \ + "DMA_0_CH16", \ + "DMA_0_CH17", \ + "DMA_0_CH18", \ + "DMA_0_CH19", \ + "DMA_0_CH20", \ + "DMA_0_CH21", \ + "DMA_0_CH22", \ + "DMA_0_CH23", \ + "DMA_0_CH24", \ + "DMA_0_CH25", \ + "DMA_0_CH26", \ + "DMA_0_CH27", \ + "DMA_0_CH28", \ + "DMA_0_CH29", \ + "DMA_0_CH30", \ + "DMA_0_CH31", \ + "I2C_0", \ + "I2C_1", \ + "I2C_2", \ + "I2C_3", \ + "I2C_4", \ + "ADC_0", \ + "ADC_1", \ + "FTM_0", \ + "FTM_1", \ + "CAN_0", \ + "CAN_1", \ + "CAN_2", \ + "DMA_1_CH0", \ + "DMA_1_CH1", \ + "DMA_1_CH2", \ + "DMA_1_CH3", \ + "DMA_1_CH4", \ + "DMA_1_CH5", \ + "DMA_1_CH6", \ + "DMA_1_CH7", \ + "DMA_1_CH8", \ + "DMA_1_CH9", \ + "DMA_1_CH10", \ + "DMA_1_CH11", \ + "DMA_1_CH12", \ + "DMA_1_CH13", \ + "DMA_1_CH14", \ + "DMA_1_CH15", \ + "DMA_1_CH16", \ + "DMA_1_CH17", \ + "DMA_1_CH18", \ + "DMA_1_CH19", \ + "DMA_1_CH20", \ + "DMA_1_CH21", \ + "DMA_1_CH22", \ + "DMA_1_CH23", \ + "DMA_1_CH24", \ + "DMA_1_CH25", \ + "DMA_1_CH26", \ + "DMA_1_CH27", \ + "DMA_1_CH28", \ + "DMA_1_CH29", \ + "DMA_1_CH30", \ + "DMA_1_CH31", \ + +#endif + +#endif /* SC_SS_DMA_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/dma/v1/dsc.h b/platform/ss/dma/v1/dsc.h new file mode 100755 index 0000000..e1ed076 --- /dev/null +++ b/platform/ss/dma/v1/dsc.h @@ -0,0 +1,246 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DMA_DSC_H +#define SC_SS_DMA_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_OBS_SEL0 REGBIT(0, 8) +#define GPR_OBS_SEL1 REGBIT(0, 9) +#define GPR_OBS_SEL2 REGBIT(0, 10) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_EMVSIM0 REGBIT64(1, 0) +#define IRQ_EMVSIM1 REGBIT64(1, 1) +#define IRQ_LPI2C0 REGBIT64(1, 2) +#define IRQ_LPI2C1 REGBIT64(1, 3) +#define IRQ_LPI2C2 REGBIT64(1, 4) +#define IRQ_LPI2C3 REGBIT64(1, 5) +#define IRQ_LPI2C4 REGBIT64(1, 6) +#define IRQ_LPSPI0 REGBIT64(1, 7) +#define IRQ_LPSPI1 REGBIT64(1, 8) +#define IRQ_LPSPI2 REGBIT64(1, 9) +#define IRQ_LPSPI3 REGBIT64(1, 10) +#define IRQ_LPUART0 REGBIT64(1, 11) +#define IRQ_LPUART1 REGBIT64(1, 12) +#define IRQ_LPUART2 REGBIT64(1, 13) +#define IRQ_LPUART3 REGBIT64(1, 14) +#define IRQ_LPUART4 REGBIT64(1, 15) +#define IRQ_ADC0 REGBIT64(1, 16) +#define IRQ_ADC1 REGBIT64(1, 17) +/** @} */ + +/*! + * @name CSR3 0x00 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_DEBUG REGBIT(0x0, 0) +#define CSR3_EDMA1_IPG_DEBUG REGBIT(0x0, 1) +#define CSR3_SPI0_IPG_DEBUG REGBIT(0x0, 3) +#define CSR3_SPI1_IPG_DEBUG REGBIT(0x0, 4) +#define CSR3_SPI2_IPG_DEBUG REGBIT(0x0, 5) +#define CSR3_SPI3_IPG_DEBUG REGBIT(0x0, 6) +#define CSR3_UART0_IPG_DEBUG REGBIT(0x0, 8) +#define CSR3_UART1_IPG_DEBUG REGBIT(0x0, 9) +#define CSR3_UART2_IPG_DEBUG REGBIT(0x0, 10) +#define CSR3_UART3_IPG_DEBUG REGBIT(0x0, 11) +#define CSR3_UART4_IPG_DEBUG REGBIT(0x0, 12) +#define CSR3_SIM0_IPG_DEBUG REGBIT(0x0, 14) +#define CSR3_SIM1_IPG_DEBUG REGBIT(0x0, 15) +#define CSR3_I2C0_IPG_DEBUG REGBIT(0x0, 17) +#define CSR3_I2C1_IPG_DEBUG REGBIT(0x0, 18) +#define CSR3_I2C2_IPG_DEBUG REGBIT(0x0, 19) +#define CSR3_I2C3_IPG_DEBUG REGBIT(0x0, 20) +#define CSR3_I2C4_IPG_DEBUG REGBIT(0x0, 21) +#define CSR3_ADC0_IPG_DEBUG REGBIT(0x0, 23) +#define CSR3_ADC1_IPG_DEBUG REGBIT(0x0, 24) +#define CSR3_FTM0_IPG_DEBUG REGBIT(0x0, 26) +#define CSR3_FTM1_IPG_DEBUG REGBIT(0x0, 27) +#define CSR3_CAN0_IPG_DEBUG REGBIT(0x0, 29) +#define CSR3_CAN1_IPG_DEBUG REGBIT(0x0, 30) +#define CSR3_CAN2_IPG_DEBUG REGBIT(0x0, 31) +/** @} */ + +/*! + * @name CSR3 0x10 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_DOZE REGBIT(0x1, 0) +#define CSR3_EDMA1_IPG_DOZE REGBIT(0x1, 1) +#define CSR3_SPI0_IPG_DOZE REGBIT(0x1, 3) +#define CSR3_SPI1_IPG_DOZE REGBIT(0x1, 4) +#define CSR3_SPI2_IPG_DOZE REGBIT(0x1, 5) +#define CSR3_SPI3_IPG_DOZE REGBIT(0x1, 6) +#define CSR3_UART0_IPG_DOZE REGBIT(0x1, 8) +#define CSR3_UART1_IPG_DOZE REGBIT(0x1, 9) +#define CSR3_UART2_IPG_DOZE REGBIT(0x1, 10) +#define CSR3_UART3_IPG_DOZE REGBIT(0x1, 11) +#define CSR3_UART4_IPG_DOZE REGBIT(0x1, 12) +#define CSR3_SIM0_IPG_DOZE REGBIT(0x1, 14) +#define CSR3_SIM1_IPG_DOZE REGBIT(0x1, 15) +#define CSR3_I2C0_IPG_DOZE REGBIT(0x1, 17) +#define CSR3_I2C1_IPG_DOZE REGBIT(0x1, 18) +#define CSR3_I2C2_IPG_DOZE REGBIT(0x1, 19) +#define CSR3_I2C3_IPG_DOZE REGBIT(0x1, 20) +#define CSR3_I2C4_IPG_DOZE REGBIT(0x1, 21) +#define CSR3_ADC0_IPG_DOZE REGBIT(0x1, 23) +#define CSR3_ADC1_IPG_DOZE REGBIT(0x1, 24) +#define CSR3_FTM0_IPG_DOZE REGBIT(0x1, 26) +#define CSR3_FTM1_IPG_DOZE REGBIT(0x1, 27) +#define CSR3_CAN0_IPG_DOZE REGBIT(0x1, 29) +#define CSR3_CAN1_IPG_DOZE REGBIT(0x1, 30) +#define CSR3_CAN2_IPG_DOZE REGBIT(0x1, 31) +/** @} */ + +/*! + * @name CSR3 0x20 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP_MODE REGBIT(0x2, 0) +#define CSR3_EDMA1_IPG_STOP_MODE REGBIT(0x2, 1) +#define CSR3_SPI0_IPG_STOP_MODE REGBIT(0x2, 3) +#define CSR3_SPI1_IPG_STOP_MODE REGBIT(0x2, 4) +#define CSR3_SPI2_IPG_STOP_MODE REGBIT(0x2, 5) +#define CSR3_SPI3_IPG_STOP_MODE REGBIT(0x2, 6) +#define CSR3_UART0_IPG_STOP_MODE REGBIT(0x2, 8) +#define CSR3_UART1_IPG_STOP_MODE REGBIT(0x2, 9) +#define CSR3_UART2_IPG_STOP_MODE REGBIT(0x2, 10) +#define CSR3_UART3_IPG_STOP_MODE REGBIT(0x2, 11) +#define CSR3_UART4_IPG_STOP_MODE REGBIT(0x2, 12) +#define CSR3_SIM0_IPG_STOP_MODE REGBIT(0x2, 14) +#define CSR3_SIM1_IPG_STOP_MODE REGBIT(0x2, 15) +#define CSR3_I2C0_IPG_STOP_MODE REGBIT(0x2, 17) +#define CSR3_I2C1_IPG_STOP_MODE REGBIT(0x2, 18) +#define CSR3_I2C2_IPG_STOP_MODE REGBIT(0x2, 19) +#define CSR3_I2C3_IPG_STOP_MODE REGBIT(0x2, 20) +#define CSR3_I2C4_IPG_STOP_MODE REGBIT(0x2, 21) +#define CSR3_ADC0_IPG_STOP_MODE REGBIT(0x2, 23) +#define CSR3_ADC1_IPG_STOP_MODE REGBIT(0x2, 24) +#define CSR3_FTM0_IPG_STOP_MODE REGBIT(0x2, 26) +#define CSR3_FTM1_IPG_STOP_MODE REGBIT(0x2, 27) +#define CSR3_CAN0_IPG_STOP_MODE REGBIT(0x2, 29) +#define CSR3_CAN1_IPG_STOP_MODE REGBIT(0x2, 30) +#define CSR3_CAN2_IPG_STOP_MODE REGBIT(0x2, 31) +/** @} */ + +/*! + * @name CSR3 0x30 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP REGBIT(0x3, 0) +#define CSR3_EDMA1_IPG_STOP REGBIT(0x3, 1) +#define CSR3_SPI0_IPG_STOP REGBIT(0x3, 3) +#define CSR3_SPI1_IPG_STOP REGBIT(0x3, 4) +#define CSR3_SPI2_IPG_STOP REGBIT(0x3, 5) +#define CSR3_SPI3_IPG_STOP REGBIT(0x3, 6) +#define CSR3_UART0_IPG_STOP REGBIT(0x3, 8) +#define CSR3_UART1_IPG_STOP REGBIT(0x3, 9) +#define CSR3_UART2_IPG_STOP REGBIT(0x3, 10) +#define CSR3_UART3_IPG_STOP REGBIT(0x3, 11) +#define CSR3_UART4_IPG_STOP REGBIT(0x3, 12) +#define CSR3_SIM0_IPG_STOP REGBIT(0x3, 14) +#define CSR3_SIM1_IPG_STOP REGBIT(0x3, 15) +#define CSR3_I2C0_IPG_STOP REGBIT(0x3, 17) +#define CSR3_I2C1_IPG_STOP REGBIT(0x3, 18) +#define CSR3_I2C2_IPG_STOP REGBIT(0x3, 19) +#define CSR3_I2C3_IPG_STOP REGBIT(0x3, 20) +#define CSR3_I2C4_IPG_STOP REGBIT(0x3, 21) +#define CSR3_ADC0_IPG_STOP REGBIT(0x3, 23) +#define CSR3_ADC1_IPG_STOP REGBIT(0x3, 24) +#define CSR3_FTM0_IPG_STOP REGBIT(0x3, 26) +#define CSR3_FTM1_IPG_STOP REGBIT(0x3, 27) +#define CSR3_CAN0_IPG_STOP REGBIT(0x3, 29) +#define CSR3_CAN1_IPG_STOP REGBIT(0x3, 30) +#define CSR3_CAN2_IPG_STOP REGBIT(0x3, 31) + +/** @} */ + +/*! + * @name CSR3 0x40 Bit Definitions + */ +/** @{ */ +#define CSR3_EDMA0_IPG_STOP_ACK REGBIT(0x4, 0) +#define CSR3_EDMA1_IPG_STOP_ACK REGBIT(0x4, 1) +#define CSR3_SPI0_IPG_STOP_ACK REGBIT(0x4, 3) +#define CSR3_SPI1_IPG_STOP_ACK REGBIT(0x4, 4) +#define CSR3_SPI2_IPG_STOP_ACK REGBIT(0x4, 5) +#define CSR3_SPI3_IPG_STOP_ACK REGBIT(0x4, 6) +#define CSR3_UART0_IPG_STOP_ACK REGBIT(0x4, 8) +#define CSR3_UART1_IPG_STOP_ACK REGBIT(0x4, 9) +#define CSR3_UART2_IPG_STOP_ACK REGBIT(0x4, 10) +#define CSR3_UART3_IPG_STOP_ACK REGBIT(0x4, 11) +#define CSR3_UART4_IPG_STOP_ACK REGBIT(0x4, 12) +#define CSR3_SIM0_IPG_STOP_ACK REGBIT(0x4, 14) +#define CSR3_SIM1_IPG_STOP_ACK REGBIT(0x4, 15) +#define CSR3_I2C0_IPG_STOP_ACK REGBIT(0x4, 17) +#define CSR3_I2C1_IPG_STOP_ACK REGBIT(0x4, 18) +#define CSR3_I2C2_IPG_STOP_ACK REGBIT(0x4, 19) +#define CSR3_I2C3_IPG_STOP_ACK REGBIT(0x4, 20) +#define CSR3_I2C4_IPG_STOP_ACK REGBIT(0x4, 21) +#define CSR3_ADC0_IPG_STOP_ACK REGBIT(0x4, 23) +#define CSR3_ADC1_IPG_STOP_ACK REGBIT(0x4, 24) +#define CSR3_FTM0_IPG_STOP_ACK REGBIT(0x4, 26) +#define CSR3_FTM1_IPG_STOP_ACK REGBIT(0x4, 27) +#define CSR3_CAN0_IPG_STOP_ACK REGBIT(0x4, 29) +#define CSR3_CAN1_IPG_STOP_ACK REGBIT(0x4, 30) +#define CSR3_CAN2_IPG_STOP_ACK REGBIT(0x4, 31) +/** @} */ + +#endif /* SC_SS_DMA_DSC_H */ + +/** @} */ + diff --git a/platform/ss/dma/v1/rsrc.h b/platform/ss/dma/v1/rsrc.h new file mode 100644 index 0000000..d5a7e22 --- /dev/null +++ b/platform/ss/dma/v1/rsrc.h @@ -0,0 +1,148 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the DMA subsystem. + * + * @addtogroup DMA_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_DMA_RSRC_H +#define SC_SS_DMA_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_SPI_0 0U +#define SS_R_SPI_1 1U +#define SS_R_SPI_2 2U +#define SS_R_SPI_3 3U +#define SS_R_UART_0 4U +#define SS_R_UART_1 5U +#define SS_R_UART_2 6U +#define SS_R_UART_3 7U +#define SS_R_UART_4 8U +#define SS_R_EMVSIM_0 9U +#define SS_R_EMVSIM_1 10U +#define SS_R_DMA_0_CH0 11U +#define SS_R_DMA_0_CH1 12U +#define SS_R_DMA_0_CH2 13U +#define SS_R_DMA_0_CH3 14U +#define SS_R_DMA_0_CH4 15U +#define SS_R_DMA_0_CH5 16U +#define SS_R_DMA_0_CH6 17U +#define SS_R_DMA_0_CH7 18U +#define SS_R_DMA_0_CH8 19U +#define SS_R_DMA_0_CH9 20U +#define SS_R_DMA_0_CH10 21U +#define SS_R_DMA_0_CH11 22U +#define SS_R_DMA_0_CH12 23U +#define SS_R_DMA_0_CH13 24U +#define SS_R_DMA_0_CH14 25U +#define SS_R_DMA_0_CH15 26U +#define SS_R_DMA_0_CH16 27U +#define SS_R_DMA_0_CH17 28U +#define SS_R_DMA_0_CH18 29U +#define SS_R_DMA_0_CH19 30U +#define SS_R_DMA_0_CH20 31U +#define SS_R_DMA_0_CH21 32U +#define SS_R_DMA_0_CH22 33U +#define SS_R_DMA_0_CH23 34U +#define SS_R_DMA_0_CH24 35U +#define SS_R_DMA_0_CH25 36U +#define SS_R_DMA_0_CH26 37U +#define SS_R_DMA_0_CH27 38U +#define SS_R_DMA_0_CH28 39U +#define SS_R_DMA_0_CH29 40U +#define SS_R_DMA_0_CH30 41U +#define SS_R_DMA_0_CH31 42U +#define SS_R_I2C_0 43U +#define SS_R_I2C_1 44U +#define SS_R_I2C_2 45U +#define SS_R_I2C_3 46U +#define SS_R_I2C_4 47U +#define SS_R_ADC_0 48U +#define SS_R_ADC_1 49U +#define SS_R_FTM_0 50U +#define SS_R_FTM_1 51U +#define SS_R_CAN_0 52U +#define SS_R_CAN_1 53U +#define SS_R_CAN_2 54U +#define SS_R_DMA_1_CH0 55U +#define SS_R_DMA_1_CH1 56U +#define SS_R_DMA_1_CH2 57U +#define SS_R_DMA_1_CH3 58U +#define SS_R_DMA_1_CH4 59U +#define SS_R_DMA_1_CH5 60U +#define SS_R_DMA_1_CH6 61U +#define SS_R_DMA_1_CH7 62U +#define SS_R_DMA_1_CH8 63U +#define SS_R_DMA_1_CH9 64U +#define SS_R_DMA_1_CH10 65U +#define SS_R_DMA_1_CH11 66U +#define SS_R_DMA_1_CH12 67U +#define SS_R_DMA_1_CH13 68U +#define SS_R_DMA_1_CH14 69U +#define SS_R_DMA_1_CH15 70U +#define SS_R_DMA_1_CH16 71U +#define SS_R_DMA_1_CH17 72U +#define SS_R_DMA_1_CH18 73U +#define SS_R_DMA_1_CH19 74U +#define SS_R_DMA_1_CH20 75U +#define SS_R_DMA_1_CH21 76U +#define SS_R_DMA_1_CH22 77U +#define SS_R_DMA_1_CH23 78U +#define SS_R_DMA_1_CH24 79U +#define SS_R_DMA_1_CH25 80U +#define SS_R_DMA_1_CH26 81U +#define SS_R_DMA_1_CH27 82U +#define SS_R_DMA_1_CH28 83U +#define SS_R_DMA_1_CH29 84U +#define SS_R_DMA_1_CH30 85U +#define SS_R_DMA_1_CH31 86U +/** @} */ + +#endif /* SC_SS_DMA_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/dma/v1/ss.h b/platform/ss/dma/v1/ss.h new file mode 100755 index 0000000..bc56e97 --- /dev/null +++ b/platform/ss/dma/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DMA subsystem API. + * + * @addtogroup DMA_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DMA_SS_H +#define SC_SS_DMA_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(dma) + +/* Functions */ + +SS_FUNC_PROTO_DMA + +#endif /* SC_SS_DMA_SS_H */ + +/** @} */ + diff --git a/platform/ss/drc/v1/Makefile b/platform/ss/drc/v1/Makefile new file mode 100755 index 0000000..fd088d8 --- /dev/null +++ b/platform/ss/drc/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/drc/v1/ss.o + +CONFIGH += $(SRC)/ss/drc/v1/config.h $(SRC)/ss/drc/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/drc/v1/resource.txt + +CLK_MD += $(SRC)/ss/drc/v1/clock.txt + +CTRL_MD += $(SRC)/ss/drc/v1/control.txt + +DIRS += $(OUT)/ss/drc/v1 + diff --git a/platform/ss/drc/v1/config.h b/platform/ss/drc/v1/config.h new file mode 100644 index 0000000..dbb5599 --- /dev/null +++ b/platform/ss/drc/v1/config.h @@ -0,0 +1,134 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the DRC subsystem. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_DRC_CONFIG_H +#define SC_SS_DRC_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_DRC 1U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_DRC \ + void ss_init_drc(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_set_clock_rate_drc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_set_control_drc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + void ss_prepost_power_mode_drc(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_DRC \ + { \ + ss_init_drc, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_drc, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_drc, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_drc, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DRC_0 \ + "DRC_0", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_DRC_1 \ + "DRC_1", \ + +#endif + +#endif /* SC_SS_DRC_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/drc/v1/dsc.h b/platform/ss/drc/v1/dsc.h new file mode 100755 index 0000000..958931d --- /dev/null +++ b/platform/ss/drc/v1/dsc.h @@ -0,0 +1,107 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_DSC_H +#define SC_SS_DRC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_DDR_CRESETN REGBIT(0, 2) +#define RST_PHY_RSTN REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PRF1_AXI_ID REGBIT(0, 4) +#define GPR_SSI_IDLE_STRAP_DRC REGBIT(0, 9) +#define GPR_QCHAN_QEN REGBIT(0, 10) +#define GPR_PRF1_AXI_ID_MASK REGBIT(0, 11) +#define GPR_PRF2_AXI_ID REGBIT(0, 16) +#define GPR_PHY_MODE_0 REGBIT(0, 22) +#define GPR_PHY_MODE_1 REGBIT(0, 23) +#define GPR_RET_EN_I REGBIT(0, 27) +#define GPR_EXT_EN_I REGBIT(0, 28) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_PRF2_AXI_ID_MASK REGBIT(1, 16) +#define GPR_PRF3_AXI_ID REGBIT(1, 21) +#define GPR_PRF3_AXI_ID_MASK REGBIT(1, 26) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_DFI_INIT_COMP REGBIT(0, 17) +#define GPS_CSYSACK_0 REGBIT(0, 19) +#define GPS_CSYSACK_DDRC REGBIT(0, 21) +#define GPS_PHY_BYP_MODE REGBIT(0, 22) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CSYSACK_0 REGBIT64(1, 0) +#define IRQ_CSYSACK_DDRC REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_DRC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/drc/v1/rsrc.h b/platform/ss/drc/v1/rsrc.h new file mode 100644 index 0000000..b90a81e --- /dev/null +++ b/platform/ss/drc/v1/rsrc.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the DRC subsystem. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_DRC_RSRC_H +#define SC_SS_DRC_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_DRC_0 0U +#define SS_R_DRC_1 0U +/** @} */ + +#endif /* SC_SS_DRC_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/drc/v1/ss.h b/platform/ss/drc/v1/ss.h new file mode 100755 index 0000000..a6f7094 --- /dev/null +++ b/platform/ss/drc/v1/ss.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DRC subsystem API. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_SS_H +#define SC_SS_DRC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(drc) + +/* Functions */ + +SS_FUNC_PROTO_DRC + +void ss_drc_enable(sc_sub_t ss, sc_bool_t enable); +uint32_t ss_drc_get_config(sc_sub_t ss); + +#endif /* SC_SS_DRC_SS_H */ + +/** @} */ + diff --git a/platform/ss/drc/v2/Makefile b/platform/ss/drc/v2/Makefile new file mode 100755 index 0000000..da6f45d --- /dev/null +++ b/platform/ss/drc/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/drc/v2/ss.o + +CONFIGH += $(SRC)/ss/drc/v2/config.h $(SRC)/ss/drc/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/drc/v2/resource.txt + +CLK_MD += $(SRC)/ss/drc/v2/clock.txt + +CTRL_MD += $(SRC)/ss/drc/v2/control.txt + +DIRS += $(OUT)/ss/drc/v2 + diff --git a/platform/ss/drc/v2/dsc.h b/platform/ss/drc/v2/dsc.h new file mode 100755 index 0000000..ebb7bd9 --- /dev/null +++ b/platform/ss/drc/v2/dsc.h @@ -0,0 +1,109 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_DSC_H +#define SC_SS_DRC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_DDR_CRESETN REGBIT(0, 2) +#define RST_PHY_RSTN REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PRF1_AXI_ID REGBIT(0, 4) +#define GPR_SSI_IDLE_STRAP_DRC REGBIT(0, 9) +#define GPR_QCHAN_QEN REGBIT(0, 10) +#define GPR_PRF1_AXI_ID_MASK REGBIT(0, 11) +#define GPR_PRF2_AXI_ID REGBIT(0, 16) +#define GPR_PHY_MODE_0 REGBIT(0, 22) +#define GPR_PHY_MODE_1 REGBIT(0, 23) +#define GPR_RET_EN_I REGBIT(0, 27) +#define GPR_EXT_EN_I REGBIT(0, 28) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_SBR_START_MASK REGBIT(1, 0) +#define GPR_SBR_RANGE_MASK REGBIT(1, 8) +#define GPR_PRF2_AXI_ID_MASK REGBIT(1, 16) +#define GPR_PRF3_AXI_ID REGBIT(1, 21) +#define GPR_PRF3_AXI_ID_MASK REGBIT(1, 26) +#define GPR_ANAMIX_SPARE0 REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_CSYSACK_0 REGBIT(0, 19) +#define GPS_CSYSACK_DDRC REGBIT(0, 21) +#define GPS_PHY_BYP_MODE REGBIT(0, 22) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CSYSACK_0 REGBIT64(1, 0) +#define IRQ_CSYSACK_DDRC REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_DRC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/drc/v2/ss.h b/platform/ss/drc/v2/ss.h new file mode 100755 index 0000000..a6f7094 --- /dev/null +++ b/platform/ss/drc/v2/ss.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DRC subsystem API. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_SS_H +#define SC_SS_DRC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(drc) + +/* Functions */ + +SS_FUNC_PROTO_DRC + +void ss_drc_enable(sc_sub_t ss, sc_bool_t enable); +uint32_t ss_drc_get_config(sc_sub_t ss); + +#endif /* SC_SS_DRC_SS_H */ + +/** @} */ + diff --git a/platform/ss/drc/v3/Makefile b/platform/ss/drc/v3/Makefile new file mode 100755 index 0000000..0d60e89 --- /dev/null +++ b/platform/ss/drc/v3/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/drc/v3/ss.o + +CONFIGH += $(SRC)/ss/drc/v3/config.h $(SRC)/ss/drc/v3/rsrc.h + +RSRC_MD += $(SRC)/ss/drc/v3/resource.txt + +CLK_MD += $(SRC)/ss/drc/v3/clock.txt + +CTRL_MD += $(SRC)/ss/drc/v3/control.txt + +DIRS += $(OUT)/ss/drc/v3 + diff --git a/platform/ss/drc/v3/dsc.h b/platform/ss/drc/v3/dsc.h new file mode 100755 index 0000000..ebb7bd9 --- /dev/null +++ b/platform/ss/drc/v3/dsc.h @@ -0,0 +1,109 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_DSC_H +#define SC_SS_DRC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_DDR_CRESETN REGBIT(0, 2) +#define RST_PHY_RSTN REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PRF1_AXI_ID REGBIT(0, 4) +#define GPR_SSI_IDLE_STRAP_DRC REGBIT(0, 9) +#define GPR_QCHAN_QEN REGBIT(0, 10) +#define GPR_PRF1_AXI_ID_MASK REGBIT(0, 11) +#define GPR_PRF2_AXI_ID REGBIT(0, 16) +#define GPR_PHY_MODE_0 REGBIT(0, 22) +#define GPR_PHY_MODE_1 REGBIT(0, 23) +#define GPR_RET_EN_I REGBIT(0, 27) +#define GPR_EXT_EN_I REGBIT(0, 28) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_SBR_START_MASK REGBIT(1, 0) +#define GPR_SBR_RANGE_MASK REGBIT(1, 8) +#define GPR_PRF2_AXI_ID_MASK REGBIT(1, 16) +#define GPR_PRF3_AXI_ID REGBIT(1, 21) +#define GPR_PRF3_AXI_ID_MASK REGBIT(1, 26) +#define GPR_ANAMIX_SPARE0 REGBIT(1, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_CSYSACK_0 REGBIT(0, 19) +#define GPS_CSYSACK_DDRC REGBIT(0, 21) +#define GPS_PHY_BYP_MODE REGBIT(0, 22) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CSYSACK_0 REGBIT64(1, 0) +#define IRQ_CSYSACK_DDRC REGBIT64(1, 1) +/** @} */ + +#endif /* SC_SS_DRC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/drc/v3/ss.h b/platform/ss/drc/v3/ss.h new file mode 100755 index 0000000..e965648 --- /dev/null +++ b/platform/ss/drc/v3/ss.h @@ -0,0 +1,65 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the DRC subsystem API. + * + * @addtogroup DRC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_DRC_SS_H +#define SC_SS_DRC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(drc) + +/* Functions */ + +SS_FUNC_PROTO_DRC + +void ss_drc_enable(sc_sub_t ss, sc_bool_t enable); +uint32_t ss_drc_get_config(sc_sub_t ss); + +#endif /* SC_SS_DRC_SS_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v1/Makefile b/platform/ss/gpu/v1/Makefile new file mode 100755 index 0000000..b12ce29 --- /dev/null +++ b/platform/ss/gpu/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/gpu/v1/ss.o + +CONFIGH += $(SRC)/ss/gpu/v1/config.h $(SRC)/ss/gpu/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/gpu/v1/resource.txt + +CLK_MD += $(SRC)/ss/gpu/v1/clock.txt + +CTRL_MD += $(SRC)/ss/gpu/v1/control.txt + +DIRS += $(OUT)/ss/gpu/v1 + diff --git a/platform/ss/gpu/v1/config.h b/platform/ss/gpu/v1/config.h new file mode 100644 index 0000000..b424487 --- /dev/null +++ b/platform/ss/gpu/v1/config.h @@ -0,0 +1,138 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the GPU subsystem. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_GPU_CONFIG_H +#define SC_SS_GPU_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_GPU 4U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_GPU \ + void ss_init_gpu(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_set_clock_rate_gpu(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + void ss_prepost_power_mode_gpu(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_GPU \ + { \ + ss_init_gpu, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_gpu, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_gpu, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_GPU_0 \ + "GPU_0_PID0", \ + "GPU_0_PID1", \ + "GPU_0_PID2", \ + "GPU_0_PID3", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_GPU_1 \ + "GPU_1_PID0", \ + "GPU_1_PID1", \ + "GPU_1_PID2", \ + "GPU_1_PID3", \ + +#endif + +#endif /* SC_SS_GPU_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v1/dsc.h b/platform/ss/gpu/v1/dsc.h new file mode 100755 index 0000000..1fee76e --- /dev/null +++ b/platform/ss/gpu/v1/dsc.h @@ -0,0 +1,73 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_GPU_DSC_H +#define SC_SS_GPU_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_ID REGBIT(0, 4) +#define GPR_SINGLE_MODE REGBIT(0, 8) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_CLOCK_WAKE_GLITCH REGBIT(0, 2) +#define GPS_PM_DATA_PEND REGBIT(0, 4) +/** @} */ + +#endif /* SC_SS_GPU_DSC_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v1/rsrc.h b/platform/ss/gpu/v1/rsrc.h new file mode 100644 index 0000000..97bd53e --- /dev/null +++ b/platform/ss/gpu/v1/rsrc.h @@ -0,0 +1,69 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the GPU subsystem. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_GPU_RSRC_H +#define SC_SS_GPU_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_GPU_0_PID0 0U +#define SS_R_GPU_0_PID1 1U +#define SS_R_GPU_0_PID2 2U +#define SS_R_GPU_0_PID3 3U +#define SS_R_GPU_1_PID0 0U +#define SS_R_GPU_1_PID1 1U +#define SS_R_GPU_1_PID2 2U +#define SS_R_GPU_1_PID3 3U +/** @} */ + +#endif /* SC_SS_GPU_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v1/ss.h b/platform/ss/gpu/v1/ss.h new file mode 100755 index 0000000..be6421c --- /dev/null +++ b/platform/ss/gpu/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the GPU subsystem API. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_GPU_SS_H +#define SC_SS_GPU_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(gpu) + +/* Functions */ + +SS_FUNC_PROTO_GPU + +#endif /* SC_SS_GPU_SS_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v2/Makefile b/platform/ss/gpu/v2/Makefile new file mode 100755 index 0000000..dea666c --- /dev/null +++ b/platform/ss/gpu/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/gpu/v2/ss.o + +CONFIGH += $(SRC)/ss/gpu/v2/config.h $(SRC)/ss/gpu/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/gpu/v2/resource.txt + +CLK_MD += $(SRC)/ss/gpu/v2/clock.txt + +CTRL_MD += $(SRC)/ss/gpu/v2/control.txt + +DIRS += $(OUT)/ss/gpu/v2 + diff --git a/platform/ss/gpu/v2/dsc.h b/platform/ss/gpu/v2/dsc.h new file mode 100755 index 0000000..1641c3e --- /dev/null +++ b/platform/ss/gpu/v2/dsc.h @@ -0,0 +1,71 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_GPU_DSC_H +#define SC_SS_GPU_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_ID REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_CLOCK_WAKE_GLITCH REGBIT(0, 2) +/** @} */ + +#endif /* SC_SS_GPU_DSC_H */ + +/** @} */ + diff --git a/platform/ss/gpu/v2/ss.h b/platform/ss/gpu/v2/ss.h new file mode 100755 index 0000000..be6421c --- /dev/null +++ b/platform/ss/gpu/v2/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the GPU subsystem API. + * + * @addtogroup GPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_GPU_SS_H +#define SC_SS_GPU_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(gpu) + +/* Functions */ + +SS_FUNC_PROTO_GPU + +#endif /* SC_SS_GPU_SS_H */ + +/** @} */ + diff --git a/platform/ss/hdmi/v1/Makefile b/platform/ss/hdmi/v1/Makefile new file mode 100755 index 0000000..23ee868 --- /dev/null +++ b/platform/ss/hdmi/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/hdmi/v1/ss.o + +CONFIGH += $(SRC)/ss/hdmi/v1/config.h $(SRC)/ss/hdmi/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/hdmi/v1/resource.txt + +CLK_MD += $(SRC)/ss/hdmi/v1/clock.txt + +CTRL_MD += $(SRC)/ss/hdmi/v1/control.txt + +DIRS += $(OUT)/ss/hdmi/v1 + diff --git a/platform/ss/hdmi/v1/config.h b/platform/ss/hdmi/v1/config.h new file mode 100644 index 0000000..6802bc9 --- /dev/null +++ b/platform/ss/hdmi/v1/config.h @@ -0,0 +1,139 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the HDMI subsystem. + * + * @addtogroup HDMI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_HDMI_CONFIG_H +#define SC_SS_HDMI_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_HDMI 5U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_HDMI \ + void ss_trans_power_mode_hdmi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + sc_err_t ss_set_clock_rate_hdmi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_set_clock_parent_hdmi(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t \ + new_parent); \ + sc_err_t ss_set_control_hdmi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + sc_err_t ss_get_control_hdmi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t *val); \ + void ss_prepost_power_mode_hdmi(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_HDMI \ + { \ + ss_init_base, \ + ss_trans_power_mode_hdmi, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_hdmi, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_hdmi, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_hdmi, \ + ss_get_control_hdmi, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_hdmi, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_HDMI_0 \ + "HDMI", \ + "HDMI_I2S", \ + "HDMI_I2C_0", \ + "HDMI_PLL_0", \ + "HDMI_PLL_1", \ + +#endif + +#endif /* SC_SS_HDMI_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/hdmi/v1/dsc.h b/platform/ss/hdmi/v1/dsc.h new file mode 100755 index 0000000..cbd7981 --- /dev/null +++ b/platform/ss/hdmi/v1/dsc.h @@ -0,0 +1,104 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup HDMI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HDMI_DSC_H +#define SC_SS_HDMI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_PHY REGBIT(0, 2) +#define RST_HPD_FILTER REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 8) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 9) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 10) +#define GPR_PWM0_IPG_STOP REGBIT(0, 11) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 12) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 13) +#define GPR_I2C0_IPG_STOP REGBIT(0, 14) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 15) +#define GPR_PHY_ISO_ENABLE REGBIT(0, 17) +#define GPR_PLL_REF_CLK_SELECT REGBIT(0, 18) +#define GPR_PD_PAD REGBIT(0, 24) +#define GPR_LNK_BID6 REGBIT(0, 25) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 4) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO0 REGBIT64(1, 0) +#define IRQ_GPIO1 REGBIT64(1, 1) +#define IRQ_GPIO2 REGBIT64(1, 2) +#define IRQ_GPIO3 REGBIT64(1, 3) +#define IRQ_GPIO4 REGBIT64(1, 4) +#define IRQ_GPIO5 REGBIT64(1, 5) +#define IRQ_GPIO6 REGBIT64(1, 6) +#define IRQ_GPIO7 REGBIT64(1, 7) +/** @} */ + +#endif /* SC_SS_HDMI_DSC_H */ + +/** @} */ + diff --git a/platform/ss/hdmi/v1/rsrc.h b/platform/ss/hdmi/v1/rsrc.h new file mode 100644 index 0000000..dad387d --- /dev/null +++ b/platform/ss/hdmi/v1/rsrc.h @@ -0,0 +1,66 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the HDMI subsystem. + * + * @addtogroup HDMI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_HDMI_RSRC_H +#define SC_SS_HDMI_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_HDMI 0U +#define SS_R_HDMI_I2S 1U +#define SS_R_HDMI_I2C_0 2U +#define SS_R_HDMI_PLL_0 3U +#define SS_R_HDMI_PLL_1 4U +/** @} */ + +#endif /* SC_SS_HDMI_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/hdmi/v1/ss.h b/platform/ss/hdmi/v1/ss.h new file mode 100755 index 0000000..e5f1473 --- /dev/null +++ b/platform/ss/hdmi/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the HDMI subsystem API. + * + * @addtogroup HDMI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HDMI_SS_H +#define SC_SS_HDMI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(hdmi) + +/* Functions */ + +SS_FUNC_PROTO_HDMI + +#endif /* SC_SS_HDMI_SS_H */ + +/** @} */ + diff --git a/platform/ss/hdmi_rx/v1/Makefile b/platform/ss/hdmi_rx/v1/Makefile new file mode 100755 index 0000000..43d2d73 --- /dev/null +++ b/platform/ss/hdmi_rx/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/hdmi_rx/v1/ss.o + +CONFIGH += $(SRC)/ss/hdmi_rx/v1/config.h $(SRC)/ss/hdmi_rx/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/hdmi_rx/v1/resource.txt + +CLK_MD += $(SRC)/ss/hdmi_rx/v1/clock.txt + +CTRL_MD += $(SRC)/ss/hdmi_rx/v1/control.txt + +DIRS += $(OUT)/ss/hdmi_rx/v1 + diff --git a/platform/ss/hdmi_rx/v1/config.h b/platform/ss/hdmi_rx/v1/config.h new file mode 100644 index 0000000..b51a52c --- /dev/null +++ b/platform/ss/hdmi_rx/v1/config.h @@ -0,0 +1,129 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the HDMI_RX subsystem. + * + * @addtogroup HDMI_RX_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_HDMI_RX_CONFIG_H +#define SC_SS_HDMI_RX_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_HDMI_RX 4U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_HDMI_RX \ + void ss_trans_power_mode_hdmi_rx(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t from_mode, \ + sc_pm_power_mode_t to_mode); \ + void ss_prepost_power_mode_hdmi_rx(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_HDMI_RX \ + { \ + ss_init_base, \ + ss_trans_power_mode_hdmi_rx, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_hdmi_rx, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_HDMI_RX_0 \ + "HDMI_RX", \ + "HDMI_RX_BYPASS", \ + "HDMI_RX_I2C_0", \ + "HDMI_RX_PWM_0", \ + +#endif + +#endif /* SC_SS_HDMI_RX_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/hdmi_rx/v1/dsc.h b/platform/ss/hdmi_rx/v1/dsc.h new file mode 100755 index 0000000..076d666 --- /dev/null +++ b/platform/ss/hdmi_rx/v1/dsc.h @@ -0,0 +1,87 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup HDMI_RX_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HDMI_RX_DSC_H +#define SC_SS_HDMI_RX_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_PHY REGBIT(0, 2) +#define RST_HPD_FILTER REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 8) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 9) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 10) +#define GPR_PWM0_IPG_STOP REGBIT(0, 11) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 12) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 13) +#define GPR_I2C0_IPG_STOP REGBIT(0, 14) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 15) +#define GPR_HDP_PHY_ISO REGBIT(0, 16) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 4) +/** @} */ + +#endif /* SC_SS_HDMI_RX_DSC_H */ + +/** @} */ + diff --git a/platform/ss/hdmi_rx/v1/rsrc.h b/platform/ss/hdmi_rx/v1/rsrc.h new file mode 100644 index 0000000..432963e --- /dev/null +++ b/platform/ss/hdmi_rx/v1/rsrc.h @@ -0,0 +1,65 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the HDMI_RX subsystem. + * + * @addtogroup HDMI_RX_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_HDMI_RX_RSRC_H +#define SC_SS_HDMI_RX_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_HDMI_RX 0U +#define SS_R_HDMI_RX_BYPASS 1U +#define SS_R_HDMI_RX_I2C_0 2U +#define SS_R_HDMI_RX_PWM_0 3U +/** @} */ + +#endif /* SC_SS_HDMI_RX_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/hdmi_rx/v1/ss.h b/platform/ss/hdmi_rx/v1/ss.h new file mode 100755 index 0000000..33dc1dc --- /dev/null +++ b/platform/ss/hdmi_rx/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the HDMI_RX subsystem API. + * + * @addtogroup HDMI_RX_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HDMI_RX_SS_H +#define SC_SS_HDMI_RX_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(hdmi_rx) + +/* Functions */ + +SS_FUNC_PROTO_HDMI_RX + +#endif /* SC_SS_HDMI_RX_SS_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v1/Makefile b/platform/ss/hsio/v1/Makefile new file mode 100755 index 0000000..af2f54d --- /dev/null +++ b/platform/ss/hsio/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/hsio/v1/ss.o + +CONFIGH += $(SRC)/ss/hsio/v1/config.h $(SRC)/ss/hsio/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/hsio/v1/resource.txt + +CLK_MD += $(SRC)/ss/hsio/v1/clock.txt + +CTRL_MD += $(SRC)/ss/hsio/v1/control.txt + +DIRS += $(OUT)/ss/hsio/v1 + diff --git a/platform/ss/hsio/v1/config.h b/platform/ss/hsio/v1/config.h new file mode 100644 index 0000000..4d0f7d8 --- /dev/null +++ b/platform/ss/hsio/v1/config.h @@ -0,0 +1,164 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the HSIO subsystem. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_HSIO_CONFIG_H +#define SC_SS_HSIO_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_HSIO 35U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_HSIO \ + void ss_init_hsio(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_rdc_enable_hsio(sc_sub_t ss, sc_bool_t master); \ + void ss_rdc_set_master_hsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + sc_err_t ss_set_control_hsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + void ss_prepost_power_mode_hsio(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_HSIO \ + { \ + ss_init_hsio, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_hsio, \ + ss_rdc_set_master_hsio, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_hsio, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_hsio, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_HSIO_0 \ + "PCIE_A", \ + "PCIE_B", \ + "SATA_0", \ + "SERDES_0", \ + "SERDES_1", \ + "HSIO_GPIO", \ + "MATCH_0", \ + "MATCH_1", \ + "MATCH_2", \ + "MATCH_3", \ + "MATCH_4", \ + "MATCH_5", \ + "MATCH_6", \ + "MATCH_7", \ + "MATCH_8", \ + "MATCH_9", \ + "MATCH_10", \ + "MATCH_11", \ + "MATCH_12", \ + "MATCH_13", \ + "MATCH_14", \ + "MATCH_15", \ + "MATCH_16", \ + "MATCH_17", \ + "MATCH_18", \ + "MATCH_19", \ + "MATCH_20", \ + "MATCH_21", \ + "MATCH_22", \ + "MATCH_23", \ + "MATCH_24", \ + "MATCH_25", \ + "MATCH_26", \ + "MATCH_27", \ + "MATCH_28", \ + +#endif + +#endif /* SC_SS_HSIO_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v1/dsc.h b/platform/ss/hsio/v1/dsc.h new file mode 100755 index 0000000..26e281f --- /dev/null +++ b/platform/ss/hsio/v1/dsc.h @@ -0,0 +1,95 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HSIO_DSC_H +#define SC_SS_HSIO_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_PCIE_A REGBIT(0, 2) +#define RST_SS_PCIE_B REGBIT(0, 3) +#define RST_SS_SATA REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_DBG_SEL0 REGBIT(0, 8) +#define GPR_DBG_SEL1 REGBIT(0, 9) +#define GPR_DBG_SEL2 REGBIT(0, 10) +#define GPR_DBG_SEL3 REGBIT(0, 11) +#define GPR_DBG_SEL4 REGBIT(0, 12) +#define GPR_DBG_SEL5 REGBIT(0, 13) +#define GPR_DBG_SATA_SEL0 REGBIT(0, 14) +#define GPR_DBG_SATA_SEL1 REGBIT(0, 15) +#define GPR_DBG_SATA_SEL2 REGBIT(0, 16) +#define GPR_ISO_EN_PHY_LDO REGBIT(0, 17) +#define GPR_ISO_POWER_GOOD REGBIT(0, 18) +#define GPR_ISO_EN_HPLL_IOB REGBIT(0, 19) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_PCIE_A REGBIT64(1, 0) +#define IRQ_PCIE_B REGBIT64(1, 1) +#define IRQ_GPIO_0_2 REGBIT64(1, 2) +#define IRQ_GPIO_3_5 REGBIT64(1, 3) +#define IRQ_SATA_0 REGBIT64(1, 4) +/** @} */ + +#endif /* SC_SS_HSIO_DSC_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v1/rsrc.h b/platform/ss/hsio/v1/rsrc.h new file mode 100644 index 0000000..a815738 --- /dev/null +++ b/platform/ss/hsio/v1/rsrc.h @@ -0,0 +1,96 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the HSIO subsystem. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_HSIO_RSRC_H +#define SC_SS_HSIO_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_PCIE_A 0U +#define SS_R_PCIE_B 1U +#define SS_R_SATA_0 2U +#define SS_R_SERDES_0 3U +#define SS_R_SERDES_1 4U +#define SS_R_HSIO_GPIO 5U +#define SS_R_MATCH_0 6U +#define SS_R_MATCH_1 7U +#define SS_R_MATCH_2 8U +#define SS_R_MATCH_3 9U +#define SS_R_MATCH_4 10U +#define SS_R_MATCH_5 11U +#define SS_R_MATCH_6 12U +#define SS_R_MATCH_7 13U +#define SS_R_MATCH_8 14U +#define SS_R_MATCH_9 15U +#define SS_R_MATCH_10 16U +#define SS_R_MATCH_11 17U +#define SS_R_MATCH_12 18U +#define SS_R_MATCH_13 19U +#define SS_R_MATCH_14 20U +#define SS_R_MATCH_15 21U +#define SS_R_MATCH_16 22U +#define SS_R_MATCH_17 23U +#define SS_R_MATCH_18 24U +#define SS_R_MATCH_19 25U +#define SS_R_MATCH_20 26U +#define SS_R_MATCH_21 27U +#define SS_R_MATCH_22 28U +#define SS_R_MATCH_23 29U +#define SS_R_MATCH_24 30U +#define SS_R_MATCH_25 31U +#define SS_R_MATCH_26 32U +#define SS_R_MATCH_27 33U +#define SS_R_MATCH_28 34U +/** @} */ + +#endif /* SC_SS_HSIO_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v1/ss.h b/platform/ss/hsio/v1/ss.h new file mode 100755 index 0000000..afdb840 --- /dev/null +++ b/platform/ss/hsio/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the HSIO subsystem API. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HSIO_SS_H +#define SC_SS_HSIO_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(hsio) + +/* Functions */ + +SS_FUNC_PROTO_HSIO + +#endif /* SC_SS_HSIO_SS_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v2/Makefile b/platform/ss/hsio/v2/Makefile new file mode 100755 index 0000000..aeb569b --- /dev/null +++ b/platform/ss/hsio/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/hsio/v2/ss.o + +CONFIGH += $(SRC)/ss/hsio/v2/config.h $(SRC)/ss/hsio/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/hsio/v2/resource.txt + +CLK_MD += $(SRC)/ss/hsio/v2/clock.txt + +CTRL_MD += $(SRC)/ss/hsio/v2/control.txt + +DIRS += $(OUT)/ss/hsio/v2 + diff --git a/platform/ss/hsio/v2/dsc.h b/platform/ss/hsio/v2/dsc.h new file mode 100755 index 0000000..960e8aa --- /dev/null +++ b/platform/ss/hsio/v2/dsc.h @@ -0,0 +1,93 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HSIO_DSC_H +#define SC_SS_HSIO_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_PCIE_A REGBIT(0, 2) +#define RST_SS_PCIE_B REGBIT(0, 3) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_DBG_SEL0 REGBIT(0, 8) +#define GPR_DBG_SEL1 REGBIT(0, 9) +#define GPR_DBG_SEL2 REGBIT(0, 10) +#define GPR_DBG_SEL3 REGBIT(0, 11) +#define GPR_DBG_SEL4 REGBIT(0, 12) +#define GPR_DBG_SEL5 REGBIT(0, 13) +#define GPR_ISO_EN_PHY_LDO REGBIT(0, 17) +#define GPR_ISO_POWER_GOOD REGBIT(0, 18) +#define GPR_ISO_EN_HPLL_IOB REGBIT(0, 19) +#define GPR_PIPE_RATE_DSC0 REGBIT(0, 29) +#define GPR_PIPE_RATE_DSC1 REGBIT(0, 30) +#define GPR_PIPE_RATE_OVR REGBIT(0, 31) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_PCIE_A REGBIT64(1, 1) +#define IRQ_GPIO_0_2 REGBIT64(1, 2) +#define IRQ_GPIO_3_5 REGBIT64(1, 3) +#define IRQ_DMA REGBIT64(1, 7) +/** @} */ + +#endif /* SC_SS_HSIO_DSC_H */ + +/** @} */ + diff --git a/platform/ss/hsio/v2/ss.h b/platform/ss/hsio/v2/ss.h new file mode 100755 index 0000000..afdb840 --- /dev/null +++ b/platform/ss/hsio/v2/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the HSIO subsystem API. + * + * @addtogroup HSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_HSIO_SS_H +#define SC_SS_HSIO_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(hsio) + +/* Functions */ + +SS_FUNC_PROTO_HSIO + +#endif /* SC_SS_HSIO_SS_H */ + +/** @} */ + diff --git a/platform/ss/img/v1/Makefile b/platform/ss/img/v1/Makefile new file mode 100755 index 0000000..0eccf03 --- /dev/null +++ b/platform/ss/img/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/img/v1/ss.o + +CONFIGH += $(SRC)/ss/img/v1/config.h $(SRC)/ss/img/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/img/v1/resource.txt + +CLK_MD += $(SRC)/ss/img/v1/clock.txt + +CTRL_MD += $(SRC)/ss/img/v1/control.txt + +DIRS += $(OUT)/ss/img/v1 + diff --git a/platform/ss/img/v1/config.h b/platform/ss/img/v1/config.h new file mode 100644 index 0000000..4c891ba --- /dev/null +++ b/platform/ss/img/v1/config.h @@ -0,0 +1,143 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the IMG subsystem. + * + * @addtogroup IMG_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_IMG_CONFIG_H +#define SC_SS_IMG_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_IMG 18U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_IMG \ + void ss_trans_power_mode_img(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + void ss_prepost_power_mode_img(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_IMG \ + { \ + ss_init_base, \ + ss_trans_power_mode_img, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_img, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_IMG_0 \ + "ISI_CH0", \ + "ISI_CH1", \ + "ISI_CH2", \ + "ISI_CH3", \ + "ISI_CH4", \ + "ISI_CH5", \ + "ISI_CH6", \ + "ISI_CH7", \ + "MJPEG_DEC_MP", \ + "MJPEG_DEC_S0", \ + "MJPEG_DEC_S1", \ + "MJPEG_DEC_S2", \ + "MJPEG_DEC_S3", \ + "MJPEG_ENC_MP", \ + "MJPEG_ENC_S0", \ + "MJPEG_ENC_S1", \ + "MJPEG_ENC_S2", \ + "MJPEG_ENC_S3", \ + +#endif + +#endif /* SC_SS_IMG_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/img/v1/dsc.h b/platform/ss/img/v1/dsc.h new file mode 100755 index 0000000..1d0b84a --- /dev/null +++ b/platform/ss/img/v1/dsc.h @@ -0,0 +1,64 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup IMG_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_IMG_DSC_H +#define SC_SS_IMG_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_ISI REGBIT(0, 2) +/** @} */ + +#endif /* SC_SS_IMG_DSC_H */ + +/** @} */ + diff --git a/platform/ss/img/v1/rsrc.h b/platform/ss/img/v1/rsrc.h new file mode 100644 index 0000000..ccee3c8 --- /dev/null +++ b/platform/ss/img/v1/rsrc.h @@ -0,0 +1,79 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the IMG subsystem. + * + * @addtogroup IMG_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_IMG_RSRC_H +#define SC_SS_IMG_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_ISI_CH0 0U +#define SS_R_ISI_CH1 1U +#define SS_R_ISI_CH2 2U +#define SS_R_ISI_CH3 3U +#define SS_R_ISI_CH4 4U +#define SS_R_ISI_CH5 5U +#define SS_R_ISI_CH6 6U +#define SS_R_ISI_CH7 7U +#define SS_R_MJPEG_DEC_MP 8U +#define SS_R_MJPEG_DEC_S0 9U +#define SS_R_MJPEG_DEC_S1 10U +#define SS_R_MJPEG_DEC_S2 11U +#define SS_R_MJPEG_DEC_S3 12U +#define SS_R_MJPEG_ENC_MP 13U +#define SS_R_MJPEG_ENC_S0 14U +#define SS_R_MJPEG_ENC_S1 15U +#define SS_R_MJPEG_ENC_S2 16U +#define SS_R_MJPEG_ENC_S3 17U +/** @} */ + +#endif /* SC_SS_IMG_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/img/v1/ss.h b/platform/ss/img/v1/ss.h new file mode 100755 index 0000000..67921b9 --- /dev/null +++ b/platform/ss/img/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the IMG subsystem API. + * + * @addtogroup IMG_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_IMG_SS_H +#define SC_SS_IMG_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(img) + +/* Functions */ + +SS_FUNC_PROTO_IMG + +#endif /* SC_SS_IMG_SS_H */ + +/** @} */ + diff --git a/platform/ss/inf/Makefile b/platform/ss/inf/Makefile new file mode 100755 index 0000000..ae33184 --- /dev/null +++ b/platform/ss/inf/Makefile @@ -0,0 +1,6 @@ + +OBJS += $(OUT)/ss/inf/inf.o + +INFH += $(SRC)/ss/inf/inf_ss.h + +DIRS += $(OUT)/ss/inf diff --git a/platform/ss/inf/inf.h b/platform/ss/inf/inf.h new file mode 100755 index 0000000..f0ff4c6 --- /dev/null +++ b/platform/ss/inf/inf.h @@ -0,0 +1,1078 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Common functions for interfacing with the subsystems. + * + * @addtogroup INF_SS INF: Subsystem Interface + * + * @brief Module for common subsystem access. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_INF_H +#define SC_SS_INF_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/svc.h" +#include "svc/pm/svc.h" +#include "svc/irq/svc.h" +#include "drivers/dsc/fsl_dsc.h" +#include "drivers/xrdc2/fsl_xrdc2.h" + +/* Defines */ + +#define SS_CLK_W 6U //!< Width of ss_clock_t +#define SS_PLL_W 2U //!< Width of ss_pll_t +#define SS_IO_W 4U //!< Width of ss_io_type_t +#define SS_XEXP_W 8U //!< Width of ss_xexp_idx_t +#define SS_FIELD_POS_W 16U //!< Width of I/O field position +#define SS_FIELD_WID_W 6U //!< Width of I/O field width +#define SS_CID_W 4U //!< Width of CPU ID +#define SS_IDX_W 8U //!< Width of SS index +#define SS_NUM_SSI_W 2U //!< Width of num SSIs + +#define SS_MAX_CLK 35U //!< Max number of clocks per subsystem +#define SS_MAX_PLL 3U //!< Max number of PLLs per subsystem + +#define SS_MAX_PM_CLKS 5U + +/*! Define to indicate invalid power domains and clocks */ +#define NV ((uint8_t) UINT8_MAX) + +/*! Define to fill in a sc_rsrc_map_t variable */ +#define RSRC(R, I, X) \ +{ \ + .resource = U16(SC_R_##R), \ + .inst = U8(I), \ + .ss_idx = U8(X) \ +} + +#define SS_I1 0x8001U + +#define XNFO_DL {0U, 0U} + +#ifdef DISABLE_LPCG_AT_PD_PUP +#define LPCG_INFO \ + .num_lpcg = SS_NUM_LPCG, \ + .lpcg_info = SS_LPCG_ADDR_INFO +#else +#define LPCG_INFO +#endif + +#ifdef XRDC_SUPPORT + /*! Define to fill in a ss_base_info_t variable (with XRDC) */ + #define BASE_INFO(XEXP_INFO, MDAC_INFO, PAC_INFO, MSC_INFO, MRC_INFO, CTRL_INFO) \ + .num_rsrc = SS_NUM_RSRC, \ + .num_srsrc = SS_NUM_SRSRC, \ + .num_prsrc = SS_NUM_PRSRC, \ + .num_prsrc2 = SS_NUM_PRSRC2, \ + .rsrc = ss_rsrc_info, \ + .rsrc_map = rsrc_map, \ + .num_pd = SS_NUM_PD, \ + .pd_info = ss_pd_info, \ + .pd_reboot_info = SS_PD_REBOOT_INFO,\ + .num_ctrl = SS_NUM_CTRL, \ + .ctrl_info = (CTRL_INFO), \ + .dsc_aon_reset_mask = SS_AON_RESET, \ + .irq_enb = SS_IRQ_ENB, \ + .pd_dsc = SS_PD_DSC, \ + .pd_ssi = SS_PD_SSI, \ + .num_clks = SS_NUM_CLK, \ + .clk_info = ss_clk_info, \ + .ss_iso_info = ss_iso_info, \ + .num_pll = SS_NUM_PLL, \ + .mu_irq = SS_MU_IRQ, \ + .dscmix = SS_DSCMIX, \ + .ai_type = SS_AI_TYPE, \ + .ss_phy_iso = SS_PHY_ISO, \ + .ss_num_ssi = SS_NUM_SSI, \ + .mtr_clk_idx = MTR_CLK_IDX, \ + .pd_mgr = SS_PD_MGR, \ + .xexp_info = (XEXP_INFO), \ + .num_mdac = SS_NUM_MDAC, \ + .mdac_info = (MDAC_INFO), \ + .mdac_match = SS_MDAC_MATCH, \ + .mdac_cache = SS_MDAC_CACHE, \ + .num_pac = SS_NUM_PAC, \ + .pac_info = (PAC_INFO), \ + .num_msc = SS_NUM_MSC, \ + .msc_info = (MSC_INFO), \ + .num_mrc = SS_NUM_MRC, \ + .mrc_info = (MRC_INFO), \ + .mrc_mask = SS_MRC_MASK, \ + .mrc_cache = SS_MRC_CACHE, \ + LPCG_INFO +#else + /*! Define to fill in a ss_base_info_t variable (without XRDC) */ + #define BASE_INFO(XEXP_INFO, MDAC_INFO, PAC_INFO, MSC_INFO, MRC_INFO, CTRL_INFO) \ + .num_rsrc = SS_NUM_RSRC, \ + .num_srsrc = SS_NUM_SRSRC, \ + .num_prsrc = SS_NUM_PRSRC, \ + .num_prsrc2 = SS_NUM_PRSRC2, \ + .rsrc = ss_rsrc_info, \ + .rsrc_map = rsrc_map, \ + .num_pd = SS_NUM_PD, \ + .pd_info = ss_pd_info, \ + .pd_reboot_info = SS_PD_REBOOT_INFO,\ + .num_ctrl = SS_NUM_CTRL, \ + .ctrl_info = (CTRL_INFO), \ + .dsc_aon_reset_mask = SS_AON_RESET, \ + .irq_enb = SS_IRQ_ENB, \ + .pd_dsc = SS_PD_DSC, \ + .pd_ssi = SS_PD_SSI, \ + .num_clks = SS_NUM_CLK, \ + .clk_info = ss_clk_info, \ + .ss_iso_info = ss_iso_info, \ + .num_pll = SS_NUM_PLL, \ + .mu_irq = SS_MU_IRQ, \ + .dscmix = SS_DSCMIX, \ + .ai_type = SS_AI_TYPE, \ + .ss_phy_iso = SS_PHY_ISO, \ + .ss_num_ssi = SS_NUM_SSI, \ + .mtr_clk_idx = MTR_CLK_IDX, \ + LPCG_INFO +#endif /* XRDC_SUPPORT */ + +#ifdef XRDC_SUPPORT + /*! Define to fill in a ss_rsrc_info_t variable (with XRDC) */ + #define RNFO(PWD, C1 ,C2 ,C3 ,C4, C5, M, P, X, MI, PI, MATCHF, MASKF) \ + { \ + .master = U2B(M), \ + .peripheral = U2B(P), \ + .pd = U8(PWD), \ + .clk = {U8(C1), U8(C2), U8(C3), U8(C4), U8(C5)}, \ + .xexp_idx = U8(X), \ + .xrdc_master_idx = U16(MI), \ + .xrdc_peripheral_idx = U16(PI), \ + .xrdc_mda_match = U16(MATCHF), \ + .xrdc_mda_mask = U16(MASKF) \ + } +#else + /*! Define to fill in a ss_rsrc_info_t variable (without XRDC) */ + #define RNFO(PWD, C1 ,C2 ,C3 ,C4, C5, M, P, X, MI, PI, MATCHF, MASKF) \ + { \ + .master = U2B(M), \ + .peripheral = U2B(P), \ + .pd = U8(PWD), \ + .clk = {U8(C1), U8(C2), U8(C3), U8(C4), U8(C5)} \ + } +#endif /* XRDC_SUPPORT */ + +/*! Define to fill in a ss_xexp_info_t variable */ +#define XNFO(S, N) \ +{ \ + .start = U16(S), \ + .num = U8(N), \ +} + +/*! Define to fill in a ss_ctrl_info_t variable */ +#define TNFO(R, C, IO, B, W) \ +{ \ + .ss_idx = U8(SS_R_##R), \ + .ctrl = U8(SC_C_##C), \ + .io = (SS_IO_##IO), \ + .bit = U16(B), \ + .width = U8(W) \ +} + +/*! Define to fill in a ss_mrc_info_t variable */ +#define MNFO(P, ST, EN, AJ, M, I, SL, PWD, SB, C) \ +{ \ + .present = U2B(P), \ + .start = U64(ST), \ + .end = U64(EN), \ + .adjust = U64(AJ), \ + .mrc = U16(M), \ + .idx = U16(I), \ + .num_slots = U16(SL), \ + .pd = U8(PWD), \ + .sub = U8(SB), \ + .cache = (uint32_t*) (C) \ +} + +/* Types */ + +/*! + * This type is used to indicate pre- or post-amble function calls. + */ +typedef enum +{ + SS_PREAMBLE, //!< Preamble function call + SS_POSTAMBLE //!< Postamble function call +} ss_prepost_t; + +/*! + * This type is used to indicate type of DSC I/O. + */ +typedef enum +{ + SS_IO_GPR_CTRL, //!< GPR Control + SS_IO_GPR_STAT, //!< GPR Status + SS_IO_CSR, //!< CSR + SS_IO_CSR2, //!< CSR2 + SS_IO_CSR3, //!< CSR3 + SS_IO_AI_RW, //!< Analog Interface (RW) + SS_IO_AI_RO, //!< Analog Interface (RO) + SS_IO_RST_CTRL, //!< Reset control + SS_IO_BRD_CTRL, //!< Board control + SS_IO_SW_CTRL //!< Software control +} ss_io_type_t; + +/*! Type for a ss resource index */ +typedef uint8_t ss_idx_t; + +/*! Type for a resource index */ +typedef sc_rm_idx_t ss_ridx_t; + +/*! Type for a clock index */ +typedef uint8_t ss_clock_t; + +/*! Type for a PLL index */ +typedef uint8_t ss_pll_t; + +/*! Type for an XRDC expansion info index */ +typedef uint8_t ss_xexp_idx_t; + +/*! + * This type is used to store static constant info about the PACs in a + * subsystem. + */ +typedef xrdc_pac_info_t ss_pac_info_t; + +/*! + * This type is used store static constant info to map resources + * to the containing subsystem. + */ +typedef struct +{ + sc_rsrc_t resource : SC_RSRC_W; + ss_idx_t ss_idx : SS_IDX_W; + sc_ss_inst_t inst : SC_SS_INST_W; +} sc_rsrc_map_t; + +/*! + * This type is used store static constant info about resources in a + * subsystem. A pointer to this structure can be found in the + * ss_base_info_t type. + */ +typedef struct +{ + #ifdef XRDC_SUPPORT + sc_rm_idx_t xrdc_master_idx : SC_RM_IDX_W; //!< XRDC MDAC MDA index + sc_rm_idx_t xrdc_peripheral_idx : SC_RM_IDX_W; //!< XRDC PAC PDAC index + sc_rm_match_t xrdc_mda_match : SC_RM_MATCH_W;//!< XRDC MDAC match + sc_rm_match_t xrdc_mda_mask : SC_RM_MATCH_W;//!< XRDC MDAC mask + ss_xexp_idx_t xexp_idx : SS_XEXP_W; //!< XRDC expansion index + #endif /* XRDC_SUPPORT */ + ss_clock_t clk[SS_MAX_PM_CLKS]; //!< Clocks + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain + sc_bool_t master : SC_BOOL_W; //!< Master flag + sc_bool_t peripheral : SC_BOOL_W; //!< Slave flag +} ss_rsrc_info_t; + +/*! + * This type is used store static constant info about controls in a + * subsystem. A pointer to this structure can be found in the + * ss_base_info_t type. + */ +typedef struct +{ + uint16_t bit : SS_FIELD_POS_W; //!< Field position + ss_idx_t ss_idx : SS_IDX_W; //!< SS resource index + uint8_t width : SS_FIELD_WID_W; //!< Field width + sc_ctrl_t ctrl : SC_CTRL_W; //!< Control + ss_io_type_t io : SS_IO_W; //!< I/O type +} ss_ctrl_info_t; + +#ifdef DISABLE_LPCG_AT_PD_PUP +typedef struct +{ + volatile uint32_t * lpcg_addr; //!< LPCG offset + xrdc_idx_t pac_idx; + uint8_t num_cont_addr; + dsc_pdom_t pd; +} ss_lpcg_info_t; +#endif + +/*! + * This type is used to store static constant info about the power domains + * in the subsystem. + */ +typedef struct +{ + uint32_t reset_mask; //!< Resets associated with the PD +} ss_pd_info_t; + +/*! + * This type is used to store static constant info about resources to + * keep assigned to the SCU or associated with another resource. + */ +typedef struct +{ + xrdc_idx_t start; //!< Start slot + uint8_t num; //!< Number of slots +} ss_xexp_info_t; + +/*! + * This type is used to store static constant info about the MDACs in a + * subsystem. + */ +typedef struct +{ + xrdc_idx_t num_slots : XRDC_NUM_W; //!< Number of slots + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain + uint8_t cid : SS_CID_W; //!< CPU ID + sc_bool_t present : SC_BOOL_W; //!< Present + uint32_t *cache; //!< Cache pointer +} ss_mdac_info_t; + +/*! + * This type is used to store static constant info about the MSCs in a + * subsystem. + */ +typedef struct +{ + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain + sc_bool_t present : SC_BOOL_W; //!< Present +} ss_msc_info_t; + +/*! + * This type is used to store static constant info about the MRCs in a + * subsystem. Start->end address range indicates memory space covered + * by an MRC. + */ +typedef struct +{ + sc_faddr_t start; //!< Start address + sc_faddr_t end; //!< End address + sc_faddr_t adjust; //!< Sub/mask for this MRC + uint32_t *cache; //!< Cache pointer + xrdc_idx_t mrc : XRDC_NUM_W; //!< MRC index + xrdc_idx_t idx : XRDC_NUM_W; //!< index of first entry + xrdc_idx_t num_slots : XRDC_NUM_W; //!< Number of slots + dsc_pdom_t pd : DSC_PDOM_W; //!< Power domain + dsc_pdom_t sub : SC_BOOL_W; //!< Adjust by subtraction + sc_bool_t present : SC_BOOL_W; //!< Present +} ss_mrc_info_t; + +/*! + * This type is used to store static constant info about a subsystem. An + * array for all subsytems is declared in inf.c called ss_base_info. From + * this array info for subsystems inc. resources, XRDC components, power + * domains, etc. can be accessed. + */ +typedef struct +{ + uint64_t irq_enb; //!< Initial DSC IRQ enables + #ifdef XRDC_SUPPORT + const sc_faddr_t mrc_mask; //!< Range of MRCs in subsystem + #endif /* XRDC_SUPPORT */ + const ss_rsrc_info_t *rsrc; //!< Pointer to resource info + const sc_rsrc_map_t *rsrc_map; //!< Pointer to resource map + const ss_pd_info_t *pd_info; //!< Pointer to power domain info + const ss_pd_info_t *pd_reboot_info; //!< Pointer to power domain info + const ss_ctrl_info_t *ctrl_info; //!< Pointer to control info + const dsc_clk_info_t *clk_info; //!< Pointer to clock info + #ifdef DISABLE_LPCG_AT_PD_PUP + const ss_lpcg_info_t *lpcg_info; //!< Pointer to LPCG info + #endif + const uint8_t *ss_iso_info; //!< SS Isolation info + uint32_t dsc_aon_reset_mask; //!< Resets associated with DSC AON + uint32_t ss_phy_iso; //!< Additional ISO control (usually phy) + #ifdef XRDC_SUPPORT + const ss_xexp_info_t *xexp_info; //!< Pointer to xexp info + const ss_mdac_info_t *mdac_info; //!< Pointer to MDAC info + const ss_pac_info_t *pac_info; //!< Pointer to PAC info + const ss_msc_info_t *msc_info; //!< Pointer to MSC info + const ss_mrc_info_t *mrc_info; //!< Pointer to MRC info + uint32_t mdac_match; //!< MDAC match flags + uint16_t mdac_cache; //!< Size of MDAC cache (per inst) + uint16_t mrc_cache; //!< Size of MRC cache (per inst) + #endif /* XRDC_SUPPORT */ + sc_rm_idx_t num_rsrc : SC_RM_IDX_W; //!< Number of resources + sc_rm_idx_t num_srsrc : SC_RM_IDX_W; //!< Number of resources with children + #ifdef XRDC_SUPPORT + xrdc_idx_t num_mdac : XRDC_NUM_W; //!< Number of XRDC MDACs + xrdc_idx_t num_pac : XRDC_NUM_W; //!< Number of XRDC PACs + xrdc_idx_t num_msc : XRDC_NUM_W; //!< Number of XRDC MSCs + xrdc_idx_t num_mrc : XRDC_NUM_W; //!< Number of XRDC MRCs + #endif /* XRDC_SUPPORT */ + sc_rms_idx_t num_prsrc : SC_RMS_IDX_W; //!< Number of resources with parent + sc_rms_idx_t num_prsrc2 : SC_RMS_IDX_W; //!< Number of resources with second parent + #ifdef DISABLE_LPCG_AT_PD_PUP + uint8_t num_lpcg : DSC_NUM_LPCG_W; //!< Number of lpcg in the ss + #endif + ss_clock_t num_clks : SS_CLK_W+1; //!< Number of clocks + sc_ctrl_t num_ctrl : SC_CTRL_W; //!< Number of controls + dsc_pdom_t num_pd : DSC_PDOM_W+1; //!< Number of power domains + dsc_pdom_t pd_dsc : DSC_PDOM_W; //!< Power domain of the gated DSC logic + dsc_pdom_t pd_ssi : DSC_PDOM_W; //!< Power domain of the SSI + #ifdef XRDC_SUPPORT + dsc_pdom_t pd_mgr : DSC_PDOM_W; //!< Power domain of XRDC manager + #endif /* XRDC_SUPPORT */ + ss_pll_t num_pll : SS_PLL_W+1; //!< Number of PLLs + dsc_ai_type_t ai_type : DSC_AI_TYPE_W; //!< Type of AI for this SS + uint8_t ss_num_ssi : SS_NUM_SSI_W; //!< Number of standard SSI + ss_clock_t mtr_clk_idx : SS_CLK_W; //! < Clock index of the MTR clock + sc_bool_t mu_irq : SC_BOOL_W; //!< SS has interrupt trigger MU + sc_bool_t dscmix : SC_BOOL_W; //!< DSCMIX clock present +} ss_base_info_t; + +/*! + * This type is used to store dynamic data about the clocks/PLLs in + * the subsystem. + */ +typedef struct +{ + uint16_t usecount; //!< Count of peripherals using clock + sc_pm_clk_mode_t cur_mode : SC_PM_CLOCK_MODE_W; //!< Current mode of the clock + sc_pm_clk_parent_t parent; //!< Current parent of the clock + union { + uint32_t rate_div; //!< Current rate divider for the clock + uint32_t parent_rate; //!< store rate for parent clocks (pll, byp, xtal) + }; +} ss_clk_data_t; + +/*! + * This type is used to store dynamic data about a subsystem. + */ +typedef struct +{ + ss_clk_data_t clk_data[SS_MAX_CLK]; //!< Clock/PLL data + ss_pll_t num_pll; //!< number of PLLs in the SS + uint16_t usecount[DSC_MAX_PD][SC_PM_PW_MODE_ON];//!< PD use counts + sc_pm_power_mode_t power_mode[DSC_MAX_PD]; //!< Power mode of each power domain + #ifdef XRDC_SUPPORT + uint8_t master_did[SC_RM_NUM_DOMAIN]; //!< Count of masters in each resource domain + #endif /* XRDC_SUPPORT */ +} ss_base_data_t; + +/*! Type for IRQ handler */ +typedef sc_bool_t (*ss_dsc_l2irq_handler)(sc_dsc_t dsc, uint32_t irqIndex); + +/* Include auto generated interface info */ +#include "inf_ss.h" + +/*! + * @name Interface Functions + * @{ + */ + +/*! + * This function initalizes a subsystem. + * + * @param[in] ss subsystem to initialize + * @param[in] api_phase flag indicating phase + * + * There are two phases to subsystem intialization. The fist phase is + * the API phase (\a api_phase = SC_TRUE) and initializes all of the subsystem + * interface data structures. The second phase is the HW phase and this + * initializes the SS hardware. Both are called from main() only. + */ +/* IDL: SS_INIT() */ +void ss_init(sc_sub_t ss, sc_bool_t api_phase); + +/*! + * This function transitions a resource from one power mode to another. + * + * @param[in] rsrc_idx unified resource index + * @param[in] from_mode current resource power mode + * @param[in] to_mode requested new resource power mode + * + * This function will be dispatched to the subsystem containing + * \a rsrc_idx. If required, the subsystem power domains will change + * (dsc, ssi, and that containing \a rsrc_idx). + */ +/* IDL: SS_TRANS_POWER_MODE() */ +void ss_trans_power_mode(ss_ridx_t rsrc_idx, + sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); + +/*! + * This function requests a resource be reset. + * + * @param[in] rsrc_idx unified resource index + * @param[in] pt partition + * @param[in] pre pre-power off reset + * + * If pt equals SC_PT_ALL then reset all resources belonging + * to that partition. Otherwise, reset rsrc_idx only. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_RSRC_RESET() */ +sc_err_t ss_rsrc_reset(ss_ridx_t rsrc_idx, sc_rm_pt_t pt, + sc_bool_t pre); + +/*! + * This function requests the power power mode to be entered + * for some resources under certain circumstances. + * + * @param[in] rsrc_idx unified resource index + * @param[in] mode requested low-power mode + * @param[in] wake_src low-power mode wake source + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * This function will be dispatched to the subsystem containing + * \a rsrc_idx. If required, the subsystem power domains will change + * (dsc, ssi, and that containing \a rsrc_idx). + */ +/* IDL: SS_SET_CPU_POWER_MODE() */ +sc_err_t ss_set_cpu_power_mode(ss_ridx_t rsrc_idx, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src); + +/*! + * This function sets the resume address of a CPU. + * + * @param[in] rsrc_idx unified resource index of CPU + * @param[in] isPrimary set SC_TRUE if primary wake CPU + * @param[in] addr boot address for CPU + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_SET_CPU_RESUME() */ +sc_err_t ss_set_cpu_resume(ss_ridx_t rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); + +/*! + * This function requests the power mode for system-level interfaces + * including messaging units, interconnect, and memories. + * + * @param[in] rsrc_idx unified resource index + * @param[in] sys_if system-level interface to be configured + * @param[in] hpm high-power mode for the system interface + * @param[in] lpm low-power mode for the system interface + * + * @return Returns an error code (SC_ERR_NONE = success). + * + */ +/* IDL: SS_REQ_SYS_IF_POWER_MODE() */ +sc_err_t ss_req_sys_if_power_mode(ss_ridx_t rsrc_idx, + sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm); + +/*! + * This function sets a clock rate. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clk to set + * @param[in,out] rate pointer to rate to set (Hz) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Will return actual rate that could be achieved in \a rate. + */ +/* IDL: SS_SET_CLOCK_RATE() */ +sc_err_t ss_set_clock_rate(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); + +/*! + * This function gets a clock rate. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clk to get + * @param[out] rate pointer to return rate (Hz) + * + * @return Returns the rate of the clock in Hz. + */ +/* IDL: SS_GET_CLOCK_RATE() */ +sc_err_t ss_get_clock_rate(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); + +/*! + * This function enables a clock. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clk to enable/disable + * @param[in,out] enable flag indicating state (SC_TRUE = enable) + * @param[in,out] autog flag indicating HW autogate mode + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_CLOCK_ENABLE() */ +sc_err_t ss_clock_enable(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_bool_t enable, sc_bool_t autog); + +/*! + * This function enables a clock. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clk to enable/disable + * @param[in,out] enable flag indicating state (SC_TRUE = enable) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * This function forces the clock to the desired state regardless of + * any other gating input (hardware, etc.). + */ +/* IDL: SS_FORCE_CLOCK_ENABLE() */ +sc_err_t ss_force_clock_enable(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_bool_t enable); + +/*! + * This function sets the parent of a resource's clock. + * This function should only be called when the clock is disabled. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clock to affect + * @param[in] new_parent New parent of the clock. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner, + * - SC_ERR_UNAVAILABLE if clock not applicable to this resource + * - SC_ERR_BUSY if clock is currently enabled. + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +/* IDL: SS_SET_CLOCK_PARENT() */ +sc_err_t ss_set_clock_parent(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_pm_clk_parent_t new_parent); + +/*! + * This function gets the parent of a resource's clock. + * + * @param[in] rsrc_idx unified resource index + * @param[in] clk clock to affect + * @param[out] parent pointer to return parent of clock. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner, + * - SC_ERR_UNAVAILABLE if clock not applicable to this resource + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +/* IDL: SS_GET_CLOCK_PARENT() */ +sc_err_t ss_get_clock_parent(ss_ridx_t rsrc_idx, sc_pm_clk_t clk, + sc_pm_clk_parent_t *parent); + +/*! + * This function returns the functional state of a resource. + * + * @param[in] rsrc_idx unified resource index + * + * @return Returns a boolean (SC_TRUE if resource functional). + * + * This checks to see if the power and clocks for a resource + * (inc. required bus clocks) are enabled. + */ +/* IDL: SS_IS_RSRC_ACCESSIBLE() */ +sc_bool_t ss_is_rsrc_accessible(ss_ridx_t rsrc_idx); + +/*! + * This function triggers an interrupt on an MU. + * + * @param[in] rsrc_idx unified resource index of MU + * @param[in] mask MU interrupt to trigger + */ +/* IDL: SS_MU_IRQ() */ +void ss_mu_irq(ss_ridx_t rsrc_idx, uint32_t mask); + +/*! + * This function starts or stops a subsystem CPU. + * + * @param[in] rsrc_idx unified resource index of CPU + * @param[in] enable enable/disable flag (SC_TRUE = enable) + * @param[in] addr boot address for CPU + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_CPU_START() */ +sc_err_t ss_cpu_start(ss_ridx_t rsrc_idx, sc_bool_t enable, sc_faddr_t addr); + +#ifdef XRDC_SUPPORT +/*! + * This function enables the subsystem hardware resource manager. + * + * @param[in] ss subsystem to affect + * @param[in] master master only + */ +/* IDL: SS_RDC_ENABLE() */ +void ss_rdc_enable(sc_sub_t ss, sc_bool_t master); + +/*! + * This function configures a subsystem master. + * + * @param[in] rsrc_idx unified resource index of master + * @param[in] valid valid flag (SC_TRUE = valid) + * @param[in] lock lock flag (SC_TRUE = lock) + * @param[in] sa security attribute + * @param[in] pa privilege attribute + * @param[in] did domain ID + * @param[in] sid StreamID + * @param[in] cid CPU ID + */ +/* IDL: SS_RDC_SET_MASTER() */ +void ss_rdc_set_master(ss_ridx_t rsrc_idx, sc_bool_t valid, sc_bool_t lock, + sc_rm_spa_t sa, sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, + uint8_t cid); + +/*! + * This function configures a subsystem peripheral. + * + * @param[in] rsrc_idx unified resource index of peripheral + * @param[in] valid valid flag (SC_TRUE = valid) + * @param[in] lock lock flag (SC_TRUE = lock) + * @param[in] perms array of permisions + * @param[in] no_update if true, don't update if already valid + */ +/* IDL: SS_RDC_SET_PERIPHERAL() */ +void ss_rdc_set_peripheral(ss_ridx_t rsrc_idx, sc_bool_t valid, sc_bool_t lock, + const sc_rm_perm_t *perms, sc_bool_t no_update); + +/*! + * This function configures a memory region. + * + * @param[in] start 64-bit start address + * @param[in] end 64-bit end address + * @param[in] valid valid flag (SC_TRUE = valid) + * @param[in] perms array of permisions + * @param[in] det detour transaction to IEE + * @param[in] rmsg IEE config + * @param[in] new_start new 64-bit start address + * @param[in] new_end new 64-bit end address + */ +/* IDL: SS_RDC_SET_MEMORY() */ +sc_err_t ss_rdc_set_memory(sc_faddr_t start, sc_faddr_t end, sc_bool_t valid, + const sc_rm_perm_t *perms, sc_rm_det_t det, sc_rm_rmsg_t rmsg, + sc_faddr_t new_start, sc_faddr_t new_end); + +#endif /* XRDC_SUPPORT */ + +/*! + * This function sets a miscellaneous control value. + * + * @param[in] rsrc_idx unified resource index + * @param[in] ctrl control to write + * @param[in] val value to write + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_SET_CONTROL() */ +sc_err_t ss_set_control(ss_ridx_t rsrc_idx, uint32_t ctrl, uint32_t val); + +/*! + * This function gets a miscellaneous control value. + * + * @param[in] rsrc_idx unified resource index + * @param[in] ctrl control to read + * @param[out] val pointer to return value + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: SS_GET_CONTROL() */ +sc_err_t ss_get_control(ss_ridx_t rsrc_idx, uint32_t ctrl, uint32_t *val); + +/*! + * This function enables/disables interrupts. + * + * @param[in] rsrc_idx unified resource index + * @param[in] group group the interrupts are in + * @param[in] mask mask of interrupts to affect + * @param[in] enable state to change interrupts to + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if group invalid + */ +/* IDL: SS_IRQ_ENABLE() */ +sc_err_t ss_irq_enable(ss_ridx_t rsrc_idx, sc_irq_group_t group, + uint32_t mask, sc_bool_t enable); + +/*! + * This function returns the current interrupt status. Automatically + * clears pending interrupts. + * + * @param[in] rsrc_idx unified resource index + * @param[in] group groups the interrupts are in + * @param[in] status status of interrupts + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if group invalid + */ +/* IDL: SS_IRQ_STATUS() */ +sc_err_t ss_irq_status(ss_ridx_t rsrc_idx, sc_irq_group_t group, + uint32_t *status); + +/*! + * This function triggers an interrupt. + * + * @param[in] group group the interrupt is in + * @param[in] irq interrupt to trigger + * @param[in] pt partition to trigger + * + * This function results in an interrupt being triggered on all SCFW MUs + * owned by the specified partition that have the interrupt enabled. Use + * SC_PT_ALL to trigger for all partitions. + * + * See the [RPC protocol section](@ref PROTOCOL) for more information. + */ +/* IDL: SS_IRQ_TRIGGER() */ +void ss_irq_trigger(sc_irq_group_t group, uint32_t irq, sc_rm_pt_t pt); + +/*! + * This function dumps the state of a subsystem. + */ +/* IDL: SS_DUMP() */ +void ss_dump(sc_sub_t ss, sc_bool_t xrdc, sc_bool_t dsc, sc_bool_t clk); + +/** @} */ + +/*! + * @name Helper Functions + * @{ + */ + +/*! + * This function runs manual memory repair on a subsystem. + * + * @param[in] ss subsystem to repair + * @param[in] pd power domain to repair + * @param[in] enable reset state of MTR HW + * + * This function does memory repair manually to work around HW issues. + */ +/* IDL: SS_DO_MEM_REPAIR() */ +void ss_do_mem_repair(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); + +/*! + * This function is used to configure SS features after a SS is + * fully powered up (SSI link enabled) or before powering down. + * + * @param[in] ss subsystem transitioning + * @param[in] up SC_TRUE if powered up, SC_FALSE if powering down + * + * This function is used to customize subsystem power transitions. + * It can be used to control the subsystem or wait for subsystem + * status before/after power mode transitions. + */ +/* IDL: SS_UPDOWN() */ +void ss_updown(sc_sub_t ss, sc_bool_t up); + +/*! + * This function is a pre- and post-amble for power domain power + * mode transitions. + * + * @param[in] ss subsystem transitioning + * @param[in] pd power domain transitioning + * @param[in] type type of notification + * @param[in] from_mode current power domain mode + * @param[in] to_mode new power domain mode + * @param[in] rom_boot SC_TRUE if ROM has powered up SS + * + * This function is used to customize subsystem power transitions. + * It can be used to control the subsystem or wait for subsystem + * status before/after power mode transitions. + */ +/* IDL: SS_PREPOST_POWER_MODE() */ +void ss_prepost_power_mode(sc_sub_t ss, dsc_pdom_t pd, + ss_prepost_t type, sc_pm_power_mode_t from_mode, + sc_pm_power_mode_t to_mode, sc_bool_t rom_boot); + +/*! + * This function enables/disables the isolation in a subsystem. + * + * @param[in] ss subsystem to affect + * @param[in] pd power domain to affect + * @param[in] enable flag indicating new state (SC_TRUE = enable) + */ +/* IDL: ss_iso_disable() */ +void ss_iso_disable(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); + +/*! + * This function enables/disables the interfaces in a subsystem. + * + * @param[in] ss subsystem to affect + * @param[in] pd power domain to affect + * @param[in] enable flag indicating new state (SC_TRUE = enable) + */ +/* IDL: ss_link_enable() */ +void ss_link_enable(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); + +/*! + * This function enables/disables a subsystems's SSI ports. + * + * @param[in] ss subsystem to affect + * @param[in] enable flag indicating new state (SC_TRUE = on) + */ +/* IDL: SS_SSI_POWER() */ +void ss_ssi_power(sc_sub_t ss, sc_bool_t enable); + +/*! + * This function enables/disables black hole mode of an SSI. + * + * @param[in] ss subsystem to affect + * @param[in] remote affect SSI to this subsystem + * @param[in] port affect this instance of the SSI + * @param[in] enable flag indicating new state (SC_TRUE = enable) + */ +/* IDL: SS_SSI_BHOLE_MODE() */ +void ss_ssi_bhole_mode(sc_sub_t ss, sc_sub_t remote, uint8_t port, + sc_bool_t enable); + +/*! + * This function enables/disables pause mode of an SSI. + * + * @param[in] ss subsystem to affect + * @param[in] remote affect SSI to this subsystem + * @param[in] port affect this instance of the SSI + * @param[in] enable flag indicating new state (SC_TRUE = enable) + */ +/* IDL: SS_SSI_PAUSE_MODE() */ +void ss_ssi_pause_mode(sc_sub_t ss, sc_sub_t remote, uint8_t port, + sc_bool_t enable); + +/*! + * This function waits for an SSI to become idle. + * + * @param[in] ss subsystem to affect + * @param[in] remote affect SSI to this subsystem + * @param[in] port affect this instance of the SSI + */ +/* IDL: SS_SSI_WAIT_IDLE() */ +void ss_ssi_wait_idle(sc_sub_t ss, sc_sub_t remote, uint8_t port); + +/*! + * This function setups an ADB interface between two ss. + * + * @param[in] ss local subsystem + * @param[in] remote remote subsystem + * @param[in] enable powerup/powerdown the ADB link + */ +/* IDL: SS_ADB_ENABLE() */ +void ss_adb_enable(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); + +/*! + * This function waits for the ADB to be powered up. + * + * @param[in] ss local subsystem + * @param[in] remote remote subsystem + * @param[in] enable powerup/powerdown the ADB link + */ +/* IDL: SS_ADB_WAIT() */ +void ss_adb_wait(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); + +/*! + * This function is a pre- and post-amble for clock mode transitions. + * + * @param[in] ss subsystem transitioning + * @param[in] clk clock transitioning + * @param[in] type type of notification + * @param[in] from_mode current clock mode + * @param[in] to_mode new clock mode + * + * This function is used to customize subsystem clock transitions. + * It can be used to control the subsystem or wait for subsystem + * status before/after clock transitions. + */ +/* IDL: SS_PREPOST_CLOCK_MODE() */ +void ss_prepost_clock_mode(sc_sub_t ss, ss_clock_t clk, ss_prepost_t type, + sc_pm_clk_mode_t from_mode, sc_pm_clk_mode_t to_mode); + +#ifdef XRDC_SUPPORT +/*! + * This function checks if a subsystem generates transactions matching + * domains. + * + * @param[in] ss subsystem to check + * @param[in] perms array of permisions + * + * @return Returns SC_TRUE if the subsystem has masters in domains which + * have access in \a perms. + */ +/* IDL: SS_RDC_IS_DID_VLD() */ +sc_bool_t ss_rdc_is_did_vld(sc_sub_t ss, const sc_rm_perm_t *perms); +#endif /* XRDC_SUPPORT */ + +/*! + * This function returns a system-wide resource from a subsystem + * and subsystem relative resource index. + * + * @param[in] ss subsystem containing resource + * @param[in] ss_idx subsystem index of resource + * + * @return Returns the system-wide resource. + */ +sc_rsrc_t ss_get_resource(sc_sub_t ss, ss_idx_t ss_idx); + +/*! + * This function determines if two memory regions overlap. + * + * @param[in] start1 start address for region 1 + * @param[in] end1 end address for region 1 + * @param[in] start2 start address for region 2 + * @param[in] end2 end address for region 2 + * + * @return Returns SC_TRUE if the memory regions overlap. + */ +sc_bool_t ss_overlap(sc_faddr_t start1, sc_faddr_t end1, sc_faddr_t start2, + sc_faddr_t end2); + +/*! + * This function gets temp sensor availability of a subsystem. + * + * @param[in] rsrc_idx any resource in the subsystem + * + * @return Returns SC_TRUE if the associated subsystem has a temp sensor. + */ +sc_bool_t ss_temp_sensor(ss_ridx_t rsrc_idx); + +/** @} */ + +/* Externs */ + +extern const sc_ss_ep_t sc_ss_ep[SC_SUBSYS_LAST + 1U]; +extern ss_base_data_t sc_ss_data[SC_SUBSYS_LAST + 1U]; + +#endif /* SC_SS_INF_H */ + +/** @} */ + diff --git a/platform/ss/inf/inf_ss.h b/platform/ss/inf/inf_ss.h new file mode 100644 index 0000000..4c69590 --- /dev/null +++ b/platform/ss/inf/inf_ss.h @@ -0,0 +1,276 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Subsystem side functions for interfacing with the subsystems. + * + * @addtogroup INF_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/inf_ss_h.pl */ + +#ifndef SC_SS_INF_SS_H +#define SC_SS_INF_SS_H + +/* Includes */ + +/* Defines */ + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO(X) \ + void ss_init_##X(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_trans_power_mode_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + sc_err_t ss_rsrc_reset_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_rm_pt_t pt, sc_bool_t pre); \ + sc_err_t ss_set_cpu_power_mode_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t \ + wake_src); \ + sc_err_t ss_set_cpu_resume_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); \ + sc_err_t ss_req_sys_if_power_mode_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, \ + sc_pm_power_mode_t lpm); \ + sc_err_t ss_set_clock_rate_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_get_clock_rate_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + sc_err_t ss_clock_enable_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); \ + sc_err_t ss_force_clock_enable_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable); \ + sc_err_t ss_set_clock_parent_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t \ + new_parent); \ + sc_err_t ss_get_clock_parent_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); \ + sc_bool_t ss_is_rsrc_accessible_##X(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx); \ + void ss_mu_irq_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t rsrc_idx, \ + uint32_t mask); \ + sc_err_t ss_cpu_start_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_rdc_enable_##X(sc_sub_t ss, sc_bool_t master); \ + void ss_rdc_set_master_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_rdc_set_peripheral_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, const sc_rm_perm_t \ + *perms, sc_bool_t no_update); \ + sc_err_t ss_rdc_set_memory_##X(sc_sub_t ss, sc_faddr_t start, \ + sc_faddr_t end, sc_bool_t valid, const sc_rm_perm_t *perms, \ + sc_rm_det_t det, sc_rm_rmsg_t rmsg, sc_faddr_t new_start, \ + sc_faddr_t new_end); \ + sc_err_t ss_set_control_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t val); \ + sc_err_t ss_get_control_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t *val); \ + sc_err_t ss_irq_enable_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t mask, sc_bool_t enable); \ + sc_err_t ss_irq_status_##X(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t *status); \ + void ss_irq_trigger_##X(sc_sub_t ss, sc_irq_group_t group, uint32_t \ + irq, sc_rm_pt_t pt); \ + void ss_dump_##X(sc_sub_t ss, sc_bool_t xrdc, sc_bool_t dsc, sc_bool_t \ + clk); \ + void ss_do_mem_repair_##X(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t \ + enable); \ + void ss_updown_##X(sc_sub_t ss, sc_bool_t up); \ + void ss_prepost_power_mode_##X(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + void ss_iso_disable_##X(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_link_enable_##X(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t enable); \ + void ss_ssi_power_##X(sc_sub_t ss, sc_bool_t enable); \ + void ss_ssi_bhole_mode_##X(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_pause_mode_##X(sc_sub_t ss, sc_sub_t remote, uint8_t port, \ + sc_bool_t enable); \ + void ss_ssi_wait_idle_##X(sc_sub_t ss, sc_sub_t remote, uint8_t port); \ + void ss_adb_enable_##X(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_adb_wait_##X(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); \ + void ss_prepost_clock_mode_##X(sc_sub_t ss, ss_clock_t clk, \ + ss_prepost_t type, sc_pm_clk_mode_t from_mode, sc_pm_clk_mode_t \ + to_mode); \ + sc_bool_t ss_rdc_is_did_vld_##X(sc_sub_t ss, const sc_rm_perm_t \ + *perms); \ + + +/*! Define used to make subsystem info external */ +#define SS_BASE_INFO_PROTO(X) extern const ss_base_info_t ss_base_info_##X; + +/* Types */ + +/*! + * @name Type defines for SS entry point pointers + */ +/** @{ */ +typedef void ss_init_t(sc_sub_t ss, sc_bool_t api_phase); +typedef void ss_trans_power_mode_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode); +typedef sc_err_t ss_rsrc_reset_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_rm_pt_t pt, sc_bool_t pre); +typedef sc_err_t ss_set_cpu_power_mode_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_power_mode_t mode, sc_pm_wake_src_t + wake_src); +typedef sc_err_t ss_set_cpu_resume_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); +typedef sc_err_t ss_req_sys_if_power_mode_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, + sc_pm_power_mode_t lpm); +typedef sc_err_t ss_set_clock_rate_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); +typedef sc_err_t ss_get_clock_rate_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); +typedef sc_err_t ss_clock_enable_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); +typedef sc_err_t ss_force_clock_enable_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_bool_t enable); +typedef sc_err_t ss_set_clock_parent_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t new_parent); +typedef sc_err_t ss_get_clock_parent_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); +typedef sc_bool_t ss_is_rsrc_accessible_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx); +typedef void ss_mu_irq_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t rsrc_idx, + uint32_t mask); +typedef sc_err_t ss_cpu_start_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); +typedef void ss_rdc_enable_t(sc_sub_t ss, sc_bool_t master); +typedef void ss_rdc_set_master_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, sc_rm_spa_t + pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); +typedef void ss_rdc_set_peripheral_t(sc_sub_t ss, ss_idx_t ss_idx, + ss_ridx_t rsrc_idx, sc_bool_t valid, sc_bool_t lock, const sc_rm_perm_t + *perms, sc_bool_t no_update); +typedef sc_err_t ss_rdc_set_memory_t(sc_sub_t ss, sc_faddr_t start, + sc_faddr_t end, sc_bool_t valid, const sc_rm_perm_t *perms, sc_rm_det_t + det, sc_rm_rmsg_t rmsg, sc_faddr_t new_start, sc_faddr_t new_end); +typedef sc_err_t ss_set_control_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, uint32_t ctrl, uint32_t val); +typedef sc_err_t ss_get_control_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, uint32_t ctrl, uint32_t *val); +typedef sc_err_t ss_irq_enable_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_irq_group_t group, uint32_t mask, sc_bool_t enable); +typedef sc_err_t ss_irq_status_t(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t + rsrc_idx, sc_irq_group_t group, uint32_t *status); +typedef void ss_irq_trigger_t(sc_sub_t ss, sc_irq_group_t group, uint32_t + irq, sc_rm_pt_t pt); +typedef void ss_dump_t(sc_sub_t ss, sc_bool_t xrdc, sc_bool_t dsc, + sc_bool_t clk); +typedef void ss_do_mem_repair_t(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t + enable); +typedef void ss_updown_t(sc_sub_t ss, sc_bool_t up); +typedef void ss_prepost_power_mode_t(sc_sub_t ss, dsc_pdom_t pd, + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t + to_mode, sc_bool_t rom_boot); +typedef void ss_iso_disable_t(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t + enable); +typedef void ss_link_enable_t(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t + enable); +typedef void ss_ssi_power_t(sc_sub_t ss, sc_bool_t enable); +typedef void ss_ssi_bhole_mode_t(sc_sub_t ss, sc_sub_t remote, uint8_t + port, sc_bool_t enable); +typedef void ss_ssi_pause_mode_t(sc_sub_t ss, sc_sub_t remote, uint8_t + port, sc_bool_t enable); +typedef void ss_ssi_wait_idle_t(sc_sub_t ss, sc_sub_t remote, uint8_t + port); +typedef void ss_adb_enable_t(sc_sub_t ss, sc_sub_t remote, sc_bool_t + enable); +typedef void ss_adb_wait_t(sc_sub_t ss, sc_sub_t remote, sc_bool_t enable); +typedef void ss_prepost_clock_mode_t(sc_sub_t ss, ss_clock_t clk, + ss_prepost_t type, sc_pm_clk_mode_t from_mode, sc_pm_clk_mode_t + to_mode); +typedef sc_bool_t ss_rdc_is_did_vld_t(sc_sub_t ss, const sc_rm_perm_t + *perms); +/** @} */ + +/*! + * This type is used to store static constant function pointers for a + * subsystem. An array for all subsytems is declared in inf.c called + * sc_ss_ep. From this array direct calls can be made to subsystems. + */ +typedef struct +{ + ss_init_t * const ep_ss_init; + ss_trans_power_mode_t * const ep_ss_trans_power_mode; + ss_rsrc_reset_t * const ep_ss_rsrc_reset; + ss_set_cpu_power_mode_t * const ep_ss_set_cpu_power_mode; + ss_set_cpu_resume_t * const ep_ss_set_cpu_resume; + ss_req_sys_if_power_mode_t * const ep_ss_req_sys_if_power_mode; + ss_set_clock_rate_t * const ep_ss_set_clock_rate; + ss_get_clock_rate_t * const ep_ss_get_clock_rate; + ss_clock_enable_t * const ep_ss_clock_enable; + ss_force_clock_enable_t * const ep_ss_force_clock_enable; + ss_set_clock_parent_t * const ep_ss_set_clock_parent; + ss_get_clock_parent_t * const ep_ss_get_clock_parent; + ss_is_rsrc_accessible_t * const ep_ss_is_rsrc_accessible; + ss_mu_irq_t * const ep_ss_mu_irq; + ss_cpu_start_t * const ep_ss_cpu_start; + ss_rdc_enable_t * const ep_ss_rdc_enable; + ss_rdc_set_master_t * const ep_ss_rdc_set_master; + ss_rdc_set_peripheral_t * const ep_ss_rdc_set_peripheral; + ss_rdc_set_memory_t * const ep_ss_rdc_set_memory; + ss_set_control_t * const ep_ss_set_control; + ss_get_control_t * const ep_ss_get_control; + ss_irq_enable_t * const ep_ss_irq_enable; + ss_irq_status_t * const ep_ss_irq_status; + ss_irq_trigger_t * const ep_ss_irq_trigger; + ss_dump_t * const ep_ss_dump; + ss_do_mem_repair_t * const ep_ss_do_mem_repair; + ss_updown_t * const ep_ss_updown; + ss_prepost_power_mode_t * const ep_ss_prepost_power_mode; + ss_iso_disable_t * const ep_ss_iso_disable; + ss_link_enable_t * const ep_ss_link_enable; + ss_ssi_power_t * const ep_ss_ssi_power; + ss_ssi_bhole_mode_t * const ep_ss_ssi_bhole_mode; + ss_ssi_pause_mode_t * const ep_ss_ssi_pause_mode; + ss_ssi_wait_idle_t * const ep_ss_ssi_wait_idle; + ss_adb_enable_t * const ep_ss_adb_enable; + ss_adb_wait_t * const ep_ss_adb_wait; + ss_prepost_clock_mode_t * const ep_ss_prepost_clock_mode; + ss_rdc_is_did_vld_t * const ep_ss_rdc_is_did_vld; +} sc_ss_ep_t; + +#endif /* SC_SS_INF_SS_H */ + +/** @} */ + diff --git a/platform/ss/inf/inf_ss_def.h b/platform/ss/inf/inf_ss_def.h new file mode 100755 index 0000000..c545258 --- /dev/null +++ b/platform/ss/inf/inf_ss_def.h @@ -0,0 +1,160 @@ +/* +** ################################################################### +** +** Copyright 2017-2019 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Default SS interface config. + * + * @addtogroup INF_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_INF_DEF_H +#define SC_SS_INF_DEF_H + +/* Defines */ + +/*! + * @name SS Configuration + */ +/** @{ */ +#ifndef SS_NUM_INST + #define SS_NUM_INST 1U +#endif +#ifndef SS_NUM_SRSRC + #define SS_NUM_SRSRC 0U +#endif +#ifndef SS_NUM_PRSRC + #define SS_NUM_PRSRC 0U + #define SS_NUM_PRSRC2 0U +#else +#ifndef SS_NUM_PRSRC2 + #define SS_NUM_PRSRC2 (SS_NUM_PRSRC) +#endif +#endif +#ifndef SS_NUM_RSRC_MAP + #define SS_NUM_RSRC_MAP (SS_NUM_RSRC * SS_NUM_INST) +#endif +#ifndef SS_NUM_PD + #define SS_NUM_PD 2U +#endif +#ifndef SS_PD_REBOOT_INFO + #define SS_PD_REBOOT_INFO NULL +#endif +#ifndef SS_LPCG_ADDR_INFO + #define SS_LPCG_ADDR_INFO NULL + #define SS_NUM_LPCG 0U +#endif +#ifndef SS_AON_RESET + #define SS_AON_RESET BIT(RST_DSCMIX) +#endif +#ifndef SS_PD_DSC + #define SS_PD_DSC 0U +#endif +#ifndef SS_PD_SSI + #define SS_PD_SSI 1U +#endif +#ifndef SS_NUM_SSI + #define SS_NUM_SSI 1U +#endif +#ifndef SS_IRQ_ENB + #define SS_IRQ_ENB 0U +#endif +#ifndef SS_MU_IRQ + #define SS_MU_IRQ SC_FALSE +#endif +#ifndef SS_AI_TYPE + #define SS_AI_TYPE AI_COMMON +#endif +#ifndef SS_PHY_ISO + #define SS_PHY_ISO 0U +#endif +#ifndef MTR_CLK_IDX + #define MTR_CLK_IDX 0U +#endif +#ifndef SS_DSCMIX + #define SS_DSCMIX SC_TRUE +#endif +/** @} */ + +/*! + * @name XRDC Configuration + */ +/** @{ */ +#ifndef SS_PD_MGR + #define SS_PD_MGR 0U +#endif +#ifndef SS_NUM_MDAC + #define SS_NUM_MDAC 0U +#endif +#ifndef SS_MDAC_MATCH + #define SS_MDAC_MATCH 0x00000000U +#endif +#ifndef SS_MDAC_CACHE + #define SS_MDAC_CACHE 0U +#endif +#ifndef SS_NUM_PAC + #define SS_NUM_PAC 0U +#endif +#ifndef SS_NUM_MSC + #define SS_NUM_MSC 0U +#endif +#ifndef SS_NUM_MRC + #define SS_NUM_MRC 0U +#endif +#ifndef SS_NUM_MRC_SLOTS + #define SS_NUM_MRC_SLOTS 0U +#endif +#ifndef SS_MRC_MASK + #define SS_MRC_MASK 0x000000000U +#endif +#ifndef SS_MRC_CACHE + #define SS_MRC_CACHE 0U +#endif +/** @} */ + +/* Define Checks */ + +#if (SS_NUM_CLK > SS_MAX_CLK) + #error "SS_NUM_CLK > SS_MAX_CLK" +#endif + +#endif /* SC_SS_INF_DEF_H */ + +/** @} */ + + diff --git a/platform/ss/lsio/v2/Makefile b/platform/ss/lsio/v2/Makefile new file mode 100755 index 0000000..b62b4f9 --- /dev/null +++ b/platform/ss/lsio/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/lsio/v2/ss.o + +CONFIGH += $(SRC)/ss/lsio/v2/config.h $(SRC)/ss/lsio/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/lsio/v2/resource.txt + +CLK_MD += $(SRC)/ss/lsio/v2/clock.txt + +CTRL_MD += $(SRC)/ss/lsio/v2/control.txt + +DIRS += $(OUT)/ss/lsio/v2 + diff --git a/platform/ss/lsio/v2/config.h b/platform/ss/lsio/v2/config.h new file mode 100644 index 0000000..d0a49ce --- /dev/null +++ b/platform/ss/lsio/v2/config.h @@ -0,0 +1,190 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the LSIO subsystem. + * + * @addtogroup LSIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_LSIO_CONFIG_H +#define SC_SS_LSIO_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_LSIO 57U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_LSIO \ + void ss_init_lsio(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_rsrc_reset_lsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_rm_pt_t pt, sc_bool_t pre); \ + void ss_mu_irq_lsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t rsrc_idx, \ + uint32_t mask); \ + sc_err_t ss_irq_enable_lsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t mask, sc_bool_t enable); \ + sc_err_t ss_irq_status_lsio(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t *status); \ + void ss_irq_trigger_lsio(sc_sub_t ss, sc_irq_group_t group, uint32_t \ + irq, sc_rm_pt_t pt); \ + void ss_prepost_power_mode_lsio(sc_sub_t ss, dsc_pdom_t pd, \ + ss_prepost_t type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode, sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_LSIO \ + { \ + ss_init_lsio, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_lsio, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_lsio, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_lsio, \ + ss_irq_status_lsio, \ + ss_irq_trigger_lsio, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_lsio, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_LSIO_0 \ + "PWM_0", \ + "PWM_1", \ + "PWM_2", \ + "PWM_3", \ + "PWM_4", \ + "PWM_5", \ + "PWM_6", \ + "PWM_7", \ + "GPIO_0", \ + "GPIO_1", \ + "GPIO_2", \ + "GPIO_3", \ + "GPIO_4", \ + "GPIO_5", \ + "GPIO_6", \ + "GPIO_7", \ + "FSPI_0", \ + "FSPI_1", \ + "GPT_0", \ + "GPT_1", \ + "GPT_2", \ + "GPT_3", \ + "GPT_4", \ + "KPP", \ + "MU_0A", \ + "MU_1A", \ + "MU_2A", \ + "MU_3A", \ + "MU_4A", \ + "MU_5A", \ + "MU_6A", \ + "MU_7A", \ + "MU_8A", \ + "MU_9A", \ + "MU_10A", \ + "MU_11A", \ + "MU_12A", \ + "MU_13A", \ + "MU_5B", \ + "MU_6B", \ + "MU_7B", \ + "MU_8B", \ + "MU_9B", \ + "MU_10B", \ + "MU_11B", \ + "MU_12B", \ + "MU_13B", \ + "IEE", \ + "IEE_R0", \ + "IEE_R1", \ + "IEE_R2", \ + "IEE_R3", \ + "IEE_R4", \ + "IEE_R5", \ + "IEE_R6", \ + "IEE_R7", \ + "OCRAM", \ + +#endif + +#endif /* SC_SS_LSIO_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/lsio/v2/dsc.h b/platform/ss/lsio/v2/dsc.h new file mode 100755 index 0000000..ea79dc1 --- /dev/null +++ b/platform/ss/lsio/v2/dsc.h @@ -0,0 +1,346 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup LSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_LSIO_DSC_H +#define SC_SS_LSIO_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SWAP REGBIT(0, 14) +#define GPR_SWAP_MASK REGBIT(0, 23) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO0 REGBIT64(1, 0) +#define IRQ_GPIO1 REGBIT64(1, 1) +#define IRQ_GPIO2 REGBIT64(1, 2) +#define IRQ_GPIO3 REGBIT64(1, 3) +#define IRQ_GPIO4 REGBIT64(1, 4) +#define IRQ_GPIO5 REGBIT64(1, 5) +#define IRQ_GPIO6 REGBIT64(1, 6) +#define IRQ_GPIO7 REGBIT64(1, 7) +#define IRQ_GPT0 REGBIT64(1, 8) +#define IRQ_GPT1 REGBIT64(1, 9) +#define IRQ_GPT2 REGBIT64(1, 10) +#define IRQ_GPT3 REGBIT64(1, 11) +#define IRQ_GPT4 REGBIT64(1, 12) +#define IRQ_KPP REGBIT64(1, 13) +#define IRQ_PWM0 REGBIT64(1, 14) +#define IRQ_PWM1 REGBIT64(1, 15) +#define IRQ_PWM2 REGBIT64(1, 16) +#define IRQ_PWM3 REGBIT64(1, 17) +#define IRQ_PWM4 REGBIT64(1, 18) +#define IRQ_PWM5 REGBIT64(1, 19) +#define IRQ_PWM6 REGBIT64(1, 20) +#define IRQ_PWM7 REGBIT64(1, 21) +#define IRQ_MU_SIDEB REGBIT64(1, 27) +/** @} */ + +/*! + * @name CSR 0x00 Bit Definitions + */ +/** @{ */ +#define CSR_GPT0_IPG_STOP REGBIT(0x0, 0) +#define CSR_GPT1_IPG_STOP REGBIT(0x0, 1) +#define CSR_GPT2_IPG_STOP REGBIT(0x0, 2) +#define CSR_GPT3_IPG_STOP REGBIT(0x0, 3) +#define CSR_GPT4_IPG_STOP REGBIT(0x0, 4) +#define CSR_PWM0_IPG_STOP REGBIT(0x0, 5) +#define CSR_PWM1_IPG_STOP REGBIT(0x0, 6) +#define CSR_PWM2_IPG_STOP REGBIT(0x0, 7) +#define CSR_PWM3_IPG_STOP REGBIT(0x0, 8) +#define CSR_PWM4_IPG_STOP REGBIT(0x0, 9) +#define CSR_PWM5_IPG_STOP REGBIT(0x0, 10) +#define CSR_PWM6_IPG_STOP REGBIT(0x0, 11) +#define CSR_PWM7_IPG_STOP REGBIT(0x0, 12) +/** @} */ + + +/*! + * @name CSR 0x10 Bit Definitions + */ +/** @{ */ +#define CSR_FSPI0_IPG_STOP REGBIT(0x1, 0) +#define CSR_FSPI1_IPG_STOP REGBIT(0x1, 1) +#define CSR_MU5A_IPG_STOP REGBIT(0x1, 2) +#define CSR_MU6A_IPG_STOP REGBIT(0x1, 3) +#define CSR_MU7A_IPG_STOP REGBIT(0x1, 4) +#define CSR_MU8A_IPG_STOP REGBIT(0x1, 5) +#define CSR_MU9A_IPG_STOP REGBIT(0x1, 6) +#define CSR_MU10A_IPG_STOP REGBIT(0x1, 7) +#define CSR_MU11A_IPG_STOP REGBIT(0x1, 8) +#define CSR_MU12A_IPG_STOP REGBIT(0x1, 9) +#define CSR_MU13A_IPG_STOP REGBIT(0x1, 10) +#define CSR_MU5B_IPG_STOP REGBIT(0x1, 11) +#define CSR_MU6B_IPG_STOP REGBIT(0x1, 12) +#define CSR_MU7B_IPG_STOP REGBIT(0x1, 13) +#define CSR_MU8B_IPG_STOP REGBIT(0x1, 14) +#define CSR_MU9B_IPG_STOP REGBIT(0x1, 15) +#define CSR_MU10B_IPG_STOP REGBIT(0x1, 16) +#define CSR_MU11B_IPG_STOP REGBIT(0x1, 17) +#define CSR_MU12B_IPG_STOP REGBIT(0x1, 18) +#define CSR_MU13B_IPG_STOP REGBIT(0x1, 19) +/** @} */ + +/*! + * @name CSR 0x20 Bit Definitions + */ +/** @{ */ +#define CSR_GPT0_IPG_WAIT REGBIT(0x2, 0) +#define CSR_GPT1_IPG_WAIT REGBIT(0x2, 1) +#define CSR_GPT2_IPG_WAIT REGBIT(0x2, 2) +#define CSR_GPT3_IPG_WAIT REGBIT(0x2, 3) +#define CSR_GPT4_IPG_WAIT REGBIT(0x2, 4) +#define CSR_PWM0_IPG_WAIT REGBIT(0x2, 5) +#define CSR_PWM1_IPG_WAIT REGBIT(0x2, 6) +#define CSR_PWM2_IPG_WAIT REGBIT(0x2, 7) +#define CSR_PWM3_IPG_WAIT REGBIT(0x2, 8) +#define CSR_PWM4_IPG_WAIT REGBIT(0x2, 9) +#define CSR_PWM5_IPG_WAIT REGBIT(0x2, 10) +#define CSR_PWM6_IPG_WAIT REGBIT(0x2, 11) +#define CSR_PWM7_IPG_WAIT REGBIT(0x2, 12) +/** @} */ + +/*! + * @name CSR 0x30 Bit Definitions + */ +/** @{ */ +#define CSR_MU5A_IPG_WAIT REGBIT(0x3, 2) +#define CSR_MU6A_IPG_WAIT REGBIT(0x3, 3) +#define CSR_MU7A_IPG_WAIT REGBIT(0x3, 4) +#define CSR_MU8A_IPG_WAIT REGBIT(0x3, 5) +#define CSR_MU9A_IPG_WAIT REGBIT(0x3, 6) +#define CSR_MU10A_IPG_WAIT REGBIT(0x3, 7) +#define CSR_MU11A_IPG_WAIT REGBIT(0x3, 8) +#define CSR_MU12A_IPG_WAIT REGBIT(0x3, 9) +#define CSR_MU13A_IPG_WAIT REGBIT(0x3, 10) +#define CSR_MU5B_IPG_WAIT REGBIT(0x3, 11) +#define CSR_MU6B_IPG_WAIT REGBIT(0x3, 12) +#define CSR_MU7B_IPG_WAIT REGBIT(0x3, 13) +#define CSR_MU8B_IPG_WAIT REGBIT(0x3, 14) +#define CSR_MU9B_IPG_WAIT REGBIT(0x3, 15) +#define CSR_MU10B_IPG_WAIT REGBIT(0x3, 16) +#define CSR_MU11B_IPG_WAIT REGBIT(0x3, 17) +#define CSR_MU12B_IPG_WAIT REGBIT(0x3, 18) +#define CSR_MU13B_IPG_WAIT REGBIT(0x3, 19) +/** @} */ + +/*! + * @name CSR 0x40 Bit Definitions + */ +/** @{ */ +#define CSR_GPT0_IPG_DOZE REGBIT(0x4, 0) +#define CSR_GPT1_IPG_DOZE REGBIT(0x4, 1) +#define CSR_GPT2_IPG_DOZE REGBIT(0x4, 2) +#define CSR_GPT3_IPG_DOZE REGBIT(0x4, 3) +#define CSR_GPT4_IPG_DOZE REGBIT(0x4, 4) +#define CSR_PWM0_IPG_DOZE REGBIT(0x4, 5) +#define CSR_PWM1_IPG_DOZE REGBIT(0x4, 6) +#define CSR_PWM2_IPG_DOZE REGBIT(0x4, 7) +#define CSR_PWM3_IPG_DOZE REGBIT(0x4, 8) +#define CSR_PWM4_IPG_DOZE REGBIT(0x4, 9) +#define CSR_PWM5_IPG_DOZE REGBIT(0x4, 10) +#define CSR_PWM6_IPG_DOZE REGBIT(0x4, 11) +#define CSR_PWM7_IPG_DOZE REGBIT(0x4, 12) +/** @} */ + +/*! + * @name CSR 0x50 Bit Definitions + */ +/** @{ */ +#define CSR_FSPI0_IPG_DOZE REGBIT(0x5, 0) +#define CSR_FSPI1_IPG_DOZE REGBIT(0x5, 1) +/** @} */ + +/*! + * @name CSR 0x70 Definitions + */ +/** @{ */ +#define CSR_MU5A_IPG_DSM REGBIT(0x7, 2) +#define CSR_MU6A_IPG_DSM REGBIT(0x7, 3) +#define CSR_MU7A_IPG_DSM REGBIT(0x7, 4) +#define CSR_MU8A_IPG_DSM REGBIT(0x7, 5) +#define CSR_MU9A_IPG_DSM REGBIT(0x7, 6) +#define CSR_MU10A_IPG_DSM REGBIT(0x7, 7) +#define CSR_MU11A_IPG_DSM REGBIT(0x7, 8) +#define CSR_MU12A_IPG_DSM REGBIT(0x7, 9) +#define CSR_MU13A_IPG_DSM REGBIT(0x7, 10) +#define CSR_MU5B_IPG_DSM REGBIT(0x7, 11) +#define CSR_MU6B_IPG_DSM REGBIT(0x7, 12) +#define CSR_MU7B_IPG_DSM REGBIT(0x7, 13) +#define CSR_MU8B_IPG_DSM REGBIT(0x7, 14) +#define CSR_MU9B_IPG_DSM REGBIT(0x7, 15) +#define CSR_MU10B_IPG_DSM REGBIT(0x7, 16) +#define CSR_MU11B_IPG_DSM REGBIT(0x7, 17) +#define CSR_MU12B_IPG_DSM REGBIT(0x7, 18) +#define CSR_MU13B_IPG_DSM REGBIT(0x7, 19) +/** @} */ + +/*! + * @name CSR 0x80 Bit Definitions + */ +/** @{ */ +#define CSR_GPT0_IPG_DEBUG REGBIT(0x8, 0) +#define CSR_GPT1_IPG_DEBUG REGBIT(0x8, 1) +#define CSR_GPT2_IPG_DEBUG REGBIT(0x8, 2) +#define CSR_GPT3_IPG_DEBUG REGBIT(0x8, 3) +#define CSR_GPT4_IPG_DEBUG REGBIT(0x8, 4) +#define CSR_PWM0_IPG_DEBUG REGBIT(0x8, 5) +#define CSR_PWM1_IPG_DEBUG REGBIT(0x8, 6) +#define CSR_PWM2_IPG_DEBUG REGBIT(0x8, 7) +#define CSR_PWM3_IPG_DEBUG REGBIT(0x8, 8) +#define CSR_PWM4_IPG_DEBUG REGBIT(0x8, 9) +#define CSR_PWM5_IPG_DEBUG REGBIT(0x8, 10) +#define CSR_PWM6_IPG_DEBUG REGBIT(0x8, 11) +#define CSR_PWM7_IPG_DEBUG REGBIT(0x8, 12) +/** @} */ + +/*! + * @name CSR 0xB0 Bit Definitions + */ +/** @{ */ +#define CSR_FSPI0_IPG_STOP_ACK REGBIT(0xB, 0) +#define CSR_FSPI1_IPG_STOP_ACK REGBIT(0xB, 1) +/** @} */ + +/*! + * @name CSR 0xC0 Bit Definitions + */ +/** @{ */ +#define CSR_GPT0_32K_SYNC REGBIT(0xC, 0) +#define CSR_GPT1_32K_SYNC REGBIT(0xC, 1) +#define CSR_GPT2_32K_SYNC REGBIT(0xC, 2) +#define CSR_GPT3_32K_SYNC REGBIT(0xC, 3) +#define CSR_GPT4_32K_SYNC REGBIT(0xC, 4) +#define CSR_PWM0_32K_SYNC REGBIT(0xC, 5) +#define CSR_PWM1_32K_SYNC REGBIT(0xC, 6) +#define CSR_PWM2_32K_SYNC REGBIT(0xC, 7) +#define CSR_PWM3_32K_SYNC REGBIT(0xC, 8) +#define CSR_PWM4_32K_SYNC REGBIT(0xC, 9) +#define CSR_PWM5_32K_SYNC REGBIT(0xC, 10) +#define CSR_PWM6_32K_SYNC REGBIT(0xC, 11) +#define CSR_PWM7_32K_SYNC REGBIT(0xC, 12) +/** @} */ + +/*! + * @name CSR 0xD0 Bit Definitions + */ +/** @{ */ +#define CSR_OCRAM_RD_ADDR_PIPE REGBIT(0xD, 0) +#define CSR_OCRAM_RD_DATA_WAIT REGBIT(0xD, 1) +#define CSR_OCRAM_WR_ADDR_PIPE REGBIT(0xD, 2) +#define CSR_OCRAM_WR_DATA_PIPE REGBIT(0xD, 3) +/** @} */ + +/*! + * @name CSR 0xE0 Bit Definitions + */ +/** @{ */ +#define CSR_OCRAM_RD_ADDR_PIPE_PEND REGBIT(0xE, 0) +#define CSR_OCRAM_RD_DATA_WAIT_PEND REGBIT(0xE, 1) +#define CSR_OCRAM_WR_ADDR_PIPE_PEND REGBIT(0xE, 2) +#define CSR_OCRAM_WR_DATA_PIPE_PEND REGBIT(0xE, 3) +/** @} */ + +#if (defined(FSL_FEATURE_DSC_HAS_PER_RESET) && FSL_FEATURE_DSC_HAS_PER_RESET) +/*! + * @name ECSR 0x00 Reset Bit Definitions + */ +/** @{ */ +#define CSR_PWM0_RESET REGBIT8(0x0, 0) +#define CSR_PWM1_RESET REGBIT8(0x0, 1) +#define CSR_PWM2_RESET REGBIT8(0x0, 2) +#define CSR_PWM3_RESET REGBIT8(0x0, 3) +#define CSR_PWM4_RESET REGBIT8(0x0, 4) +#define CSR_PWM5_RESET REGBIT8(0x0, 5) +#define CSR_PWM6_RESET REGBIT8(0x0, 6) +#define CSR_PWM7_RESET REGBIT8(0x0, 7) +#define CSR_GPIO0_RESET REGBIT8(0x0, 8) +#define CSR_GPIO1_RESET REGBIT8(0x0, 9) +#define CSR_GPIO2_RESET REGBIT8(0x0, 10) +#define CSR_GPIO3_RESET REGBIT8(0x0, 11) +#define CSR_GPIO4_RESET REGBIT8(0x0, 12) +#define CSR_GPIO5_RESET REGBIT8(0x0, 13) +#define CSR_GPIO6_RESET REGBIT8(0x0, 14) +#define CSR_GPIO7_RESET REGBIT8(0x0, 15) +#define CSR_GPT0_RESET REGBIT8(0x0, 16) +#define CSR_GPT1_RESET REGBIT8(0x0, 17) +#define CSR_GPT2_RESET REGBIT8(0x0, 18) +#define CSR_GPT3_RESET REGBIT8(0x0, 19) +#define CSR_GPT4_RESET REGBIT8(0x0, 20) +/** @} */ + +/*! + * @name ECSR 0x01 Reset Bit Definitions + */ +/** @{ */ +#define CSR_MU5_RESET REGBIT8(0x1, 0) +#define CSR_MU6_RESET REGBIT8(0x1, 1) +#define CSR_MU7_RESET REGBIT8(0x1, 2) +#define CSR_MU8_RESET REGBIT8(0x1, 3) +#define CSR_MU9_RESET REGBIT8(0x1, 4) +#define CSR_MU10_RESET REGBIT8(0x1, 5) +#define CSR_MU11_RESET REGBIT8(0x1, 6) +#define CSR_MU12_RESET REGBIT8(0x1, 7) +#define CSR_MU13_RESET REGBIT8(0x1, 8) +#define CSR_FSPI0_RESET REGBIT8(0x1, 9) +#define CSR_IEE_RESET REGBIT8(0x1, 10) +/** @} */ +#endif + +#endif /* SC_SS_LSIO_DSC_H */ + +/** @} */ + diff --git a/platform/ss/lsio/v2/rsrc.h b/platform/ss/lsio/v2/rsrc.h new file mode 100644 index 0000000..a2851a9 --- /dev/null +++ b/platform/ss/lsio/v2/rsrc.h @@ -0,0 +1,118 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the LSIO subsystem. + * + * @addtogroup LSIO_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_LSIO_RSRC_H +#define SC_SS_LSIO_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_PWM_0 0U +#define SS_R_PWM_1 1U +#define SS_R_PWM_2 2U +#define SS_R_PWM_3 3U +#define SS_R_PWM_4 4U +#define SS_R_PWM_5 5U +#define SS_R_PWM_6 6U +#define SS_R_PWM_7 7U +#define SS_R_GPIO_0 8U +#define SS_R_GPIO_1 9U +#define SS_R_GPIO_2 10U +#define SS_R_GPIO_3 11U +#define SS_R_GPIO_4 12U +#define SS_R_GPIO_5 13U +#define SS_R_GPIO_6 14U +#define SS_R_GPIO_7 15U +#define SS_R_FSPI_0 16U +#define SS_R_FSPI_1 17U +#define SS_R_GPT_0 18U +#define SS_R_GPT_1 19U +#define SS_R_GPT_2 20U +#define SS_R_GPT_3 21U +#define SS_R_GPT_4 22U +#define SS_R_KPP 23U +#define SS_R_MU_0A 24U +#define SS_R_MU_1A 25U +#define SS_R_MU_2A 26U +#define SS_R_MU_3A 27U +#define SS_R_MU_4A 28U +#define SS_R_MU_5A 29U +#define SS_R_MU_6A 30U +#define SS_R_MU_7A 31U +#define SS_R_MU_8A 32U +#define SS_R_MU_9A 33U +#define SS_R_MU_10A 34U +#define SS_R_MU_11A 35U +#define SS_R_MU_12A 36U +#define SS_R_MU_13A 37U +#define SS_R_MU_5B 38U +#define SS_R_MU_6B 39U +#define SS_R_MU_7B 40U +#define SS_R_MU_8B 41U +#define SS_R_MU_9B 42U +#define SS_R_MU_10B 43U +#define SS_R_MU_11B 44U +#define SS_R_MU_12B 45U +#define SS_R_MU_13B 46U +#define SS_R_IEE 47U +#define SS_R_IEE_R0 48U +#define SS_R_IEE_R1 49U +#define SS_R_IEE_R2 50U +#define SS_R_IEE_R3 51U +#define SS_R_IEE_R4 52U +#define SS_R_IEE_R5 53U +#define SS_R_IEE_R6 54U +#define SS_R_IEE_R7 55U +#define SS_R_OCRAM 56U +/** @} */ + +#endif /* SC_SS_LSIO_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/lsio/v2/ss.h b/platform/ss/lsio/v2/ss.h new file mode 100755 index 0000000..3976742 --- /dev/null +++ b/platform/ss/lsio/v2/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the LSIO subsystem API. + * + * @addtogroup LSIO_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_LSIO_SS_H +#define SC_SS_LSIO_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(lsio) + +/* Functions */ + +SS_FUNC_PROTO_LSIO + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_lsio[]; + +#endif /* SC_SS_LSIO_SS_H */ + +/** @} */ + diff --git a/platform/ss/lvds/v1/Makefile b/platform/ss/lvds/v1/Makefile new file mode 100755 index 0000000..6e82aea --- /dev/null +++ b/platform/ss/lvds/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/lvds/v1/ss.o + +CONFIGH += $(SRC)/ss/lvds/v1/config.h $(SRC)/ss/lvds/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/lvds/v1/resource.txt + +CLK_MD += $(SRC)/ss/lvds/v1/clock.txt + +CTRL_MD += $(SRC)/ss/lvds/v1/control.txt + +DIRS += $(OUT)/ss/lvds/v1 + diff --git a/platform/ss/lvds/v1/config.h b/platform/ss/lvds/v1/config.h new file mode 100644 index 0000000..08b20f3 --- /dev/null +++ b/platform/ss/lvds/v1/config.h @@ -0,0 +1,133 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the LVDS subsystem. + * + * @addtogroup LVDS_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_LVDS_CONFIG_H +#define SC_SS_LVDS_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_LVDS 3U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_LVDS \ + void ss_trans_power_mode_lvds(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_LVDS \ + { \ + ss_init_base, \ + ss_trans_power_mode_lvds, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_LVDS_0 \ + "LVDS_0", \ + "LVDS_0_PWM_0", \ + "LVDS_0_I2C_0", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_LVDS_1 \ + "LVDS_1", \ + "LVDS_1_PWM_0", \ + "LVDS_1_I2C_0", \ + +#endif + +#endif /* SC_SS_LVDS_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/lvds/v1/dsc.h b/platform/ss/lvds/v1/dsc.h new file mode 100755 index 0000000..265c266 --- /dev/null +++ b/platform/ss/lvds/v1/dsc.h @@ -0,0 +1,98 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup LVDS_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_LVDS_DSC_H +#define SC_SS_LVDS_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 10) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 11) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 12) +#define GPR_PWM0_IPG_STOP REGBIT(0, 13) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 14) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 15) +#define GPR_I2C0_IPG_STOP REGBIT(0, 16) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 17) +#define GPR_I2C1_IPG_DEBUG REGBIT(0, 18) +#define GPR_I2C1_IPG_DOZE REGBIT(0, 19) +#define GPR_I2C1_IPG_STOP REGBIT(0, 20) +#define GPR_I2C1_IPG_STOP_MODE REGBIT(0, 21) +#define GPR_PXL_LINK_RATE_CORRECT REGBIT(0, 22) +#define GPR_CKIL_SYNC_REQ REGBIT(0, 23) +#define GPR_PHY_ISO REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 4) +#define GPS_I2C1_STOP_ACK REGBIT(0, 5) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO0 REGBIT64(1, 0) +#define IRQ_GPIO1 REGBIT64(1, 1) +#define IRQ_GPIO2 REGBIT64(1, 2) +#define IRQ_GPIO3 REGBIT64(1, 3) +#define IRQ_LPI2C0_HREQ REGBIT64(1, 4) +#define IRQ_LPI2C1_HREQ REGBIT64(1, 5) +#define IRQ_WAKE_CTI REGBIT64(1, 6) +/** @} */ + +#endif /* SC_SS_LVDS_DSC_H */ + +/** @} */ diff --git a/platform/ss/lvds/v1/rsrc.h b/platform/ss/lvds/v1/rsrc.h new file mode 100644 index 0000000..a725716 --- /dev/null +++ b/platform/ss/lvds/v1/rsrc.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the LVDS subsystem. + * + * @addtogroup LVDS_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_LVDS_RSRC_H +#define SC_SS_LVDS_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_LVDS_0 0U +#define SS_R_LVDS_0_PWM_0 1U +#define SS_R_LVDS_0_I2C_0 2U +#define SS_R_LVDS_1 0U +#define SS_R_LVDS_1_PWM_0 1U +#define SS_R_LVDS_1_I2C_0 2U +/** @} */ + +#endif /* SC_SS_LVDS_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/lvds/v1/ss.h b/platform/ss/lvds/v1/ss.h new file mode 100755 index 0000000..805563a --- /dev/null +++ b/platform/ss/lvds/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the LVDS subsystem API. + * + * @addtogroup LVDS_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_LVDS_SS_H +#define SC_SS_LVDS_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(lvds) + +/* Functions */ + +SS_FUNC_PROTO_LVDS + +#endif /* SC_SS_LVDS_SS_H */ + +/** @} */ + diff --git a/platform/ss/m4/v1/Makefile b/platform/ss/m4/v1/Makefile new file mode 100755 index 0000000..48a551d --- /dev/null +++ b/platform/ss/m4/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/m4/v1/ss.o + +CONFIGH += $(SRC)/ss/m4/v1/config.h $(SRC)/ss/m4/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/m4/v1/resource.txt + +CLK_MD += $(SRC)/ss/m4/v1/clock.txt + +CTRL_MD += $(SRC)/ss/m4/v1/control.txt + +DIRS += $(OUT)/ss/m4/v1 + diff --git a/platform/ss/m4/v1/config.h b/platform/ss/m4/v1/config.h new file mode 100644 index 0000000..4ae7233 --- /dev/null +++ b/platform/ss/m4/v1/config.h @@ -0,0 +1,186 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the M4 subsystem. + * + * @addtogroup M4_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_M4_CONFIG_H +#define SC_SS_M4_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_M4 18U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_M4 \ + void ss_init_m4(sc_sub_t ss, sc_bool_t api_phase); \ + sc_err_t ss_rsrc_reset_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_rm_pt_t pt, sc_bool_t pre); \ + sc_err_t ss_set_cpu_resume_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t isPrimary, sc_faddr_t addr); \ + sc_err_t ss_req_sys_if_power_mode_m4(sc_sub_t ss, ss_idx_t ss_idx, \ + ss_ridx_t rsrc_idx, sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, \ + sc_pm_power_mode_t lpm); \ + sc_err_t ss_set_clock_rate_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); \ + void ss_mu_irq_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t rsrc_idx, \ + uint32_t mask); \ + sc_err_t ss_cpu_start_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_rdc_set_master_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + sc_err_t ss_irq_enable_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t mask, sc_bool_t enable); \ + sc_err_t ss_irq_status_m4(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_irq_group_t group, uint32_t *status); \ + void ss_irq_trigger_m4(sc_sub_t ss, sc_irq_group_t group, uint32_t irq, \ + sc_rm_pt_t pt); \ + void ss_prepost_power_mode_m4(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_M4 \ + { \ + ss_init_m4, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_m4, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_m4, \ + ss_req_sys_if_power_mode_m4, \ + ss_set_clock_rate_m4, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_m4, \ + ss_cpu_start_m4, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_m4, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_m4, \ + ss_irq_status_m4, \ + ss_irq_trigger_m4, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_m4, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_M4_0 \ + "M4_0_PID0", \ + "M4_0_PID1", \ + "M4_0_PID2", \ + "M4_0_PID3", \ + "M4_0_PID4", \ + "M4_0_RGPIO", \ + "M4_0_SEMA42", \ + "M4_0_TPM", \ + "M4_0_PIT", \ + "M4_0_UART", \ + "M4_0_I2C", \ + "M4_0_INTMUX", \ + "M4_0_MU_0B", \ + "M4_0_MU_0A0", \ + "M4_0_MU_0A1", \ + "M4_0_MU_0A2", \ + "M4_0_MU_0A3", \ + "M4_0_MU_1A", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_M4_1 \ + "M4_1_PID0", \ + "M4_1_PID1", \ + "M4_1_PID2", \ + "M4_1_PID3", \ + "M4_1_PID4", \ + "M4_1_RGPIO", \ + "M4_1_SEMA42", \ + "M4_1_TPM", \ + "M4_1_PIT", \ + "M4_1_UART", \ + "M4_1_I2C", \ + "M4_1_INTMUX", \ + "M4_1_MU_0B", \ + "M4_1_MU_0A0", \ + "M4_1_MU_0A1", \ + "M4_1_MU_0A2", \ + "M4_1_MU_0A3", \ + "M4_1_MU_1A", \ + +#endif + +#endif /* SC_SS_M4_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/m4/v1/dsc.h b/platform/ss/m4/v1/dsc.h new file mode 100755 index 0000000..18aa5f9 --- /dev/null +++ b/platform/ss/m4/v1/dsc.h @@ -0,0 +1,133 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup M4_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_M4_DSC_H +#define SC_SS_M4_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_SS_POR REGBIT(0, 2) +#define RST_CORE REGBIT(0, 3) +#define RST_DEBUG REGBIT(0, 4) +/** @} */ + +/*! + * @name SS GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_CM4_HCLK_MUX_SEL REGBIT(0, 8) +#define GPR_CM4_HCLK_MUX_IN0 REGBIT(0, 9) +#define GPR_CM4_AXBS_STALL_REQUEST REGBIT(0, 10) +#define GPR_CM4_REF_CLK_GATE REGBIT(0, 11) +#define GPR_CM4_DBG_REQ REGBIT(0, 12) +#define GPR_CM4_TX_EVENT_ENB REGBIT(0, 13) +#define GPR_CM4_HCLK_ENB REGBIT(0, 14) +#define GPR_SIM_BBS_LP_RUN_ACK_3V REGBIT(0, 24) +#define GPR_SIM_BBS_HS_RUN_ACK_3V REGBIT(0, 25) +#define GPR_SIM_SYS_RST_SRSL_WDOG REGBIT(0, 26) +#define GPR_SIM_SYS_RST_SRSH_LOCKUP REGBIT(0, 27) +#define GPR_SIM_SYS_RST_SRSH_SW REGBIT(0, 28) +#define GPR_SIM_SYS_RST_SRSH_UECC REGBIT(0, 29) +#define GPR_SIM_RCM_VLLS_DETECT REGBIT(0, 30) +#define GPR_SLEEP_HOLD_REQ REGBIT(0, 31) +/** @} */ + +/*! + * @name SS GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_DBGPWRUPREQ REGBIT(1, 45) +#define GPR_SYSPWRUPREQ REGBIT(1, 46) +#define GPR_LPI2C1_IPG_STOP REGBIT(1, 50) +#define GPR_LPI2C1_IPG_STOP_MODE REGBIT(1, 51) +#define GPR_WDOG1_IPG_STOP REGBIT(1, 53) +#define GPR_TPM1_IPG_STOP REGBIT(1, 57) +#define GPR_LPUART1_IPG_STOP REGBIT(1, 59) +#define GPR_LPUART1_IPG_STOP_MODE REGBIT(1, 60) +/** @} */ + +/*! + * @name SS GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_LP_STOP_MODE_LOWV_BBS0 REGBIT(0, 24) +#define GPS_LP_STOP_MODE_LOWV_BBS1 REGBIT(0, 25) +#define GPS_LP_STOP_MODE_LOWV_BBS2 REGBIT(0, 26) +#define GPS_LP_STOP_OPTION_BBS0 REGBIT(0, 28) +#define GPS_LP_STOP_OPTION_BBS1 REGBIT(0, 29) +#define GPS_CPU_SLEEP_DEEP_HOLD_ACK REGBIT(0, 31) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CM4_CPU_SLEEPING REGBIT64(1, 4) +#define IRQ_CM4_CPU_SLEEP_DEEP REGBIT64(1, 5) +#define IRQ_CM4_AXBS_STALL_ACK REGBIT64(1, 6) +#define IRQ_CM4_CPU_SYS_RESET_REQ REGBIT64(1, 7) +#define IRQ_WDOG1_WDG_RSTO REGBIT64(1, 8) +#define IRQ_CM4_CPU_LOCKUP REGBIT64(1, 9) +#define IRQ_AWIC_REQ REGBIT64(1, 10) +#define IRQ_CM4_UECC_ERR REGBIT64(1, 11) +#define IRQ_BBS_SIM_BBS_LP_RUN_REQ REGBIT64(1, 12) +#define IRQ_BBS_SIM_BBS_HS_RUN_REQ REGBIT64(1, 13) +#define IRQ_LPI2C1_IPG_STOP_ACK REGBIT64(1, 20) +#define IRQ_LPUART1_IPG_STOP_ACK REGBIT64(1, 21) +#define IRQ_INTMUX_INT_OUT_ASYNC REGBIT64(1, 24) +#define IRQ_MU_SIDEB REGBIT64(1, 27) +/** @} */ + +#endif /* SC_SS_M4_DSC_H */ + +/** @} */ + diff --git a/platform/ss/m4/v1/rsrc.h b/platform/ss/m4/v1/rsrc.h new file mode 100644 index 0000000..d943978 --- /dev/null +++ b/platform/ss/m4/v1/rsrc.h @@ -0,0 +1,97 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the M4 subsystem. + * + * @addtogroup M4_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_M4_RSRC_H +#define SC_SS_M4_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_M4_0_PID0 0U +#define SS_R_M4_0_PID1 1U +#define SS_R_M4_0_PID2 2U +#define SS_R_M4_0_PID3 3U +#define SS_R_M4_0_PID4 4U +#define SS_R_M4_0_RGPIO 5U +#define SS_R_M4_0_SEMA42 6U +#define SS_R_M4_0_TPM 7U +#define SS_R_M4_0_PIT 8U +#define SS_R_M4_0_UART 9U +#define SS_R_M4_0_I2C 10U +#define SS_R_M4_0_INTMUX 11U +#define SS_R_M4_0_MU_0B 12U +#define SS_R_M4_0_MU_0A0 13U +#define SS_R_M4_0_MU_0A1 14U +#define SS_R_M4_0_MU_0A2 15U +#define SS_R_M4_0_MU_0A3 16U +#define SS_R_M4_0_MU_1A 17U +#define SS_R_M4_1_PID0 0U +#define SS_R_M4_1_PID1 1U +#define SS_R_M4_1_PID2 2U +#define SS_R_M4_1_PID3 3U +#define SS_R_M4_1_PID4 4U +#define SS_R_M4_1_RGPIO 5U +#define SS_R_M4_1_SEMA42 6U +#define SS_R_M4_1_TPM 7U +#define SS_R_M4_1_PIT 8U +#define SS_R_M4_1_UART 9U +#define SS_R_M4_1_I2C 10U +#define SS_R_M4_1_INTMUX 11U +#define SS_R_M4_1_MU_0B 12U +#define SS_R_M4_1_MU_0A0 13U +#define SS_R_M4_1_MU_0A1 14U +#define SS_R_M4_1_MU_0A2 15U +#define SS_R_M4_1_MU_0A3 16U +#define SS_R_M4_1_MU_1A 17U +/** @} */ + +#endif /* SC_SS_M4_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/m4/v1/ss.h b/platform/ss/m4/v1/ss.h new file mode 100755 index 0000000..80d3781 --- /dev/null +++ b/platform/ss/m4/v1/ss.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the M4 subsystem API. + * + * @addtogroup M4_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_M4_SS_H +#define SC_SS_M4_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(m4) + +/* Functions */ + +SS_FUNC_PROTO_M4 + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_mcu[]; + +#endif /* SC_SS_M4_SS_H */ + +/** @} */ + diff --git a/platform/ss/mipi/v1/Makefile b/platform/ss/mipi/v1/Makefile new file mode 100755 index 0000000..1f0f8d3 --- /dev/null +++ b/platform/ss/mipi/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/mipi/v1/ss.o + +CONFIGH += $(SRC)/ss/mipi/v1/config.h $(SRC)/ss/mipi/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/mipi/v1/resource.txt + +CLK_MD += $(SRC)/ss/mipi/v1/clock.txt + +CTRL_MD += $(SRC)/ss/mipi/v1/control.txt + +DIRS += $(OUT)/ss/mipi/v1 + diff --git a/platform/ss/mipi/v1/config.h b/platform/ss/mipi/v1/config.h new file mode 100644 index 0000000..ecde9a0 --- /dev/null +++ b/platform/ss/mipi/v1/config.h @@ -0,0 +1,136 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the MIPI subsystem. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_MIPI_CONFIG_H +#define SC_SS_MIPI_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_MIPI 4U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_MIPI \ + void ss_init_mipi(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_trans_power_mode_mipi(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t \ + to_mode); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_MIPI \ + { \ + ss_init_mipi, \ + ss_trans_power_mode_mipi, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_base, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_MIPI_0 \ + "MIPI_0", \ + "MIPI_0_PWM_0", \ + "MIPI_0_I2C_0", \ + "MIPI_0_I2C_1", \ + + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_MIPI_1 \ + "MIPI_1", \ + "MIPI_1_PWM_0", \ + "MIPI_1_I2C_0", \ + "MIPI_1_I2C_1", \ + +#endif + +#endif /* SC_SS_MIPI_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/mipi/v1/dsc.h b/platform/ss/mipi/v1/dsc.h new file mode 100755 index 0000000..aade67c --- /dev/null +++ b/platform/ss/mipi/v1/dsc.h @@ -0,0 +1,119 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_MIPI_DSC_H +#define SC_SS_MIPI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_MIPI_BYTE REGBIT(0, 2) +#define RST_MIPI_DPI REGBIT(0, 3) +#define RST_MIPI_ESC REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ + +#define GPR_D3_0_TM REGBIT(0, 0) +#define GPR_CLK_0_TM REGBIT(0, 1) +#define GPR_CLK_1_TM REGBIT(0, 2) +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 3) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 4) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 5) +#define GPR_PWM0_IPG_STOP REGBIT(0, 6) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 7) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 8) +#define GPR_I2C0_IPG_STOP REGBIT(0, 9) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 10) +#define GPR_I2C1_IPG_DEBUG REGBIT(0, 11) +#define GPR_I2C1_IPG_DOZE REGBIT(0, 12) +#define GPR_I2C1_IPG_STOP REGBIT(0, 13) +#define GPR_I2C1_IPG_STOP_MODE REGBIT(0, 14) +#define GPR_CLK_2_TM REGBIT(0, 15) +#define GPR_PHY_ISO REGBIT(0, 16) +#define GPR_D3_1_TM REGBIT(0, 17) +#define GPR_D3_2_TM REGBIT(0, 18) +#define GPR_D2_TM REGBIT(0, 19) +#define GPR_D1_0_TM REGBIT(0, 22) +#define GPR_D1_1_TM REGBIT(0, 23) +#define GPR_TX_RCAL REGBIT(0, 26) +#define GPR_D1_2_TM REGBIT(0, 28) +#define GPR_D0_TM REGBIT(0, 29) + +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 0) +#define GPS_I2C1_STOP_ACK REGBIT(0, 1) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO_0 REGBIT64(1, 0) +#define IRQ_GPIO_1 REGBIT64(1, 1) +#define IRQ_GPIO_2 REGBIT64(1, 2) +#define IRQ_GPIO_3 REGBIT64(1, 3) +#define IRQ_LPI2C0_HREQ REGBIT64(1, 4) +#define IRQ_LPI2C1_HREQ REGBIT64(1, 5) +#define IRQ_WAKE_CTI REGBIT64(1, 6) +/** @} */ + +#endif /* SC_SS_MIPI_DSC_H */ + +/** @} */ diff --git a/platform/ss/mipi/v1/rsrc.h b/platform/ss/mipi/v1/rsrc.h new file mode 100644 index 0000000..c55047e --- /dev/null +++ b/platform/ss/mipi/v1/rsrc.h @@ -0,0 +1,69 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the MIPI subsystem. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_MIPI_RSRC_H +#define SC_SS_MIPI_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_MIPI_0 0U +#define SS_R_MIPI_0_PWM_0 1U +#define SS_R_MIPI_0_I2C_0 2U +#define SS_R_MIPI_0_I2C_1 3U +#define SS_R_MIPI_1 0U +#define SS_R_MIPI_1_PWM_0 1U +#define SS_R_MIPI_1_I2C_0 2U +#define SS_R_MIPI_1_I2C_1 3U +/** @} */ + +#endif /* SC_SS_MIPI_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/mipi/v1/ss.h b/platform/ss/mipi/v1/ss.h new file mode 100755 index 0000000..66f4217 --- /dev/null +++ b/platform/ss/mipi/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the MIPI subsystem API. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_MIPI_SS_H +#define SC_SS_MIPI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(mipi) + +/* Functions */ + +SS_FUNC_PROTO_MIPI + +#endif /* SC_SS_MIPI_SS_H */ + +/** @} */ + diff --git a/platform/ss/mipi/v2/Makefile b/platform/ss/mipi/v2/Makefile new file mode 100755 index 0000000..6707cda --- /dev/null +++ b/platform/ss/mipi/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/mipi/v2/ss.o + +CONFIGH += $(SRC)/ss/mipi/v2/config.h $(SRC)/ss/mipi/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/mipi/v2/resource.txt + +CLK_MD += $(SRC)/ss/mipi/v2/clock.txt + +CTRL_MD += $(SRC)/ss/mipi/v2/control.txt + +DIRS += $(OUT)/ss/mipi/v2 + diff --git a/platform/ss/mipi/v2/dsc.h b/platform/ss/mipi/v2/dsc.h new file mode 100755 index 0000000..cc9334a --- /dev/null +++ b/platform/ss/mipi/v2/dsc.h @@ -0,0 +1,123 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_MIPI_DSC_H +#define SC_SS_MIPI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_MIPI_BYTE REGBIT(0, 2) +#define RST_MIPI_DPI REGBIT(0, 3) +#define RST_MIPI_ESC REGBIT(0, 4) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 10) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 11) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 12) +#define GPR_PWM0_IPG_STOP REGBIT(0, 13) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 14) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 15) +#define GPR_I2C0_IPG_STOP REGBIT(0, 16) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 17) +#define GPR_I2C1_IPG_DEBUG REGBIT(0, 18) +#define GPR_I2C1_IPG_DOZE REGBIT(0, 19) +#define GPR_I2C1_IPG_STOP REGBIT(0, 20) +#define GPR_I2C1_IPG_STOP_MODE REGBIT(0, 21) +#define GPR_PXL_LINK_RATE_CORRECT REGBIT(0, 22) +#define GPR_CKIL_SYNC_REQ REGBIT(0, 23) +#define GPR_MIPI_DSI_CTRL_MODE REGBIT(0, 24) +#define GPR_CTRL_LINK_SLV1_ADDR REGBIT(0, 25) +#define GPR_MIPI_DSI_CTRL_MODE8 REGBIT(0, 28) +#define GPR_PXL_LINK_SELECT REGBIT(0, 29) +#define GPR_MIPI_DSI_CTRL_TX_RCAL REGBIT(0, 30) +/** @} */ + +/*! + * @name GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_PHY_ISO REGBIT(1, 33) +#define GPR_D0_TM REGBIT(1, 34) +#define GPR_D1_TM REGBIT(1, 37) +#define GPR_D2_TM REGBIT(1, 40) +#define GPR_D3_TM REGBIT(1, 43) +#define GPR_CLK_TM REGBIT(1, 46) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 8) +#define GPS_I2C1_STOP_ACK REGBIT(0, 9) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO_0_4 REGBIT64(1, 0) +#define IRQ_GPIO_1_5 REGBIT64(1, 1) +#define IRQ_GPIO_2_6 REGBIT64(1, 2) +#define IRQ_GPIO_3_7 REGBIT64(1, 3) +#define IRQ_LPI2C0_HREQ REGBIT64(1, 4) +#define IRQ_LPI2C1_HREQ REGBIT64(1, 5) +#define IRQ_WAKE_CTI REGBIT64(1, 6) +/** @} */ + +#endif /* SC_SS_MIPI_DSC_H */ + +/** @} */ diff --git a/platform/ss/mipi/v2/ss.h b/platform/ss/mipi/v2/ss.h new file mode 100755 index 0000000..0c59669 --- /dev/null +++ b/platform/ss/mipi/v2/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the MIPI/LVDS subsystem API. + * + * @addtogroup MIPI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_MIPI_SS_H +#define SC_SS_MIPI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(mipi) + +/* Functions */ + +SS_FUNC_PROTO_MIPI + +#endif /* SC_SS_MIPI_SS_H */ + +/** @} */ + diff --git a/platform/ss/pi/v1/Makefile b/platform/ss/pi/v1/Makefile new file mode 100755 index 0000000..43578db --- /dev/null +++ b/platform/ss/pi/v1/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/pi/v1/ss.o + +CONFIGH += $(SRC)/ss/pi/v1/config.h $(SRC)/ss/pi/v1/rsrc.h + +RSRC_MD += $(SRC)/ss/pi/v1/resource.txt + +CLK_MD += $(SRC)/ss/pi/v1/clock.txt + +CTRL_MD += $(SRC)/ss/pi/v1/control.txt + +DIRS += $(OUT)/ss/pi/v1 + diff --git a/platform/ss/pi/v1/dsc.h b/platform/ss/pi/v1/dsc.h new file mode 100755 index 0000000..a1b5708 --- /dev/null +++ b/platform/ss/pi/v1/dsc.h @@ -0,0 +1,92 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup PI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_PI_DSC_H +#define SC_SS_PI_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_PWM0_IPG_DEBUG REGBIT(0, 10) +#define GPR_PWM0_IPG_DOZE REGBIT(0, 11) +#define GPR_PWM0_IPG_WAIT REGBIT(0, 12) +#define GPR_PWM0_IPG_STOP REGBIT(0, 13) +#define GPR_I2C0_IPG_DEBUG REGBIT(0, 14) +#define GPR_I2C0_IPG_DOZE REGBIT(0, 15) +#define GPR_I2C0_IPG_STOP REGBIT(0, 16) +#define GPR_I2C0_IPG_STOP_MODE REGBIT(0, 17) +#define GPR_CKIL_SYNC_REQ REGBIT(0, 23) +#define GPR_CTRL_LINK_SLV1_ADDR REGBIT(0, 25) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_I2C0_STOP_ACK REGBIT(0, 4) +/** @} */ + +/*! + * @name IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_GPIO0_4 REGBIT(1, 0) +#define IRQ_GPIO1_5 REGBIT(1, 1) +#define IRQ_GPIO2_6 REGBIT(1, 2) +#define IRQ_GPIO3_7 REGBIT(1, 3) +#define IRQ_LPI2C_HREQ REGBIT(1, 4) +#define IRQ_IRQSTR_CTI0 REGBIT(1, 6) +/** @} */ + +#endif /* SC_SS_PI_DSC_H */ + +/** @} */ + diff --git a/platform/ss/pi/v1/ss.h b/platform/ss/pi/v1/ss.h new file mode 100755 index 0000000..ac59eb3 --- /dev/null +++ b/platform/ss/pi/v1/ss.h @@ -0,0 +1,63 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the PI subsystem API. + * + * @addtogroup PI_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_PI_SS_H +#define SC_SS_PI_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(pi) + +/* Functions */ + +SS_FUNC_PROTO_PI + +#endif /* SC_SS_PI_SS_H */ + +/** @} */ + diff --git a/platform/ss/sc/v2/Makefile b/platform/ss/sc/v2/Makefile new file mode 100755 index 0000000..3180b02 --- /dev/null +++ b/platform/ss/sc/v2/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/sc/v2/ss.o + +CONFIGH += $(SRC)/ss/sc/v2/config.h $(SRC)/ss/sc/v2/rsrc.h + +RSRC_MD += $(SRC)/ss/sc/v2/resource.txt + +CLK_MD += $(SRC)/ss/sc/v2/clock.txt + +CTRL_MD += $(SRC)/ss/sc/v2/control.txt + +DIRS += $(OUT)/ss/sc/v2 + diff --git a/platform/ss/sc/v2/config.h b/platform/ss/sc/v2/config.h new file mode 100644 index 0000000..c7749c4 --- /dev/null +++ b/platform/ss/sc/v2/config.h @@ -0,0 +1,165 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the SC subsystem. + * + * @addtogroup SC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_SC_CONFIG_H +#define SC_SS_SC_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_SC 33U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_SC \ + void ss_init_sc(sc_sub_t ss, sc_bool_t api_phase); \ + void ss_rdc_enable_sc(sc_sub_t ss, sc_bool_t master); \ + void ss_rdc_set_master_sc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, sc_rm_spa_t sa, \ + sc_rm_spa_t pa, sc_rm_did_t did, sc_rm_sid_t sid, uint8_t cid); \ + void ss_rdc_set_peripheral_sc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t valid, sc_bool_t lock, const sc_rm_perm_t \ + *perms, sc_bool_t no_update); \ + sc_err_t ss_get_control_sc(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, uint32_t ctrl, uint32_t *val); \ + void ss_prepost_power_mode_sc(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_SC \ + { \ + ss_init_sc, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_base, \ + ss_rdc_enable_sc, \ + ss_rdc_set_master_sc, \ + ss_rdc_set_peripheral_sc, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_sc, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_base, \ + ss_updown_base, \ + ss_prepost_power_mode_sc, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_SC_0 \ + "SC_PID0", \ + "SC_PID1", \ + "SC_PID2", \ + "SC_PID3", \ + "SC_PID4", \ + "SC_SEMA42", \ + "SC_TPM", \ + "SC_PIT", \ + "SC_UART", \ + "SC_I2C", \ + "SC_MU_0B", \ + "SC_MU_0A0", \ + "SC_MU_0A1", \ + "SC_MU_0A2", \ + "SC_MU_0A3", \ + "SC_MU_1A", \ + "SYSCNT_RD", \ + "SYSCNT_CMP", \ + "DEBUG", \ + "SYSTEM", \ + "SECO", \ + "CAAM_JR1", \ + "CAAM_JR1_OUT", \ + "CAAM_JR2", \ + "CAAM_JR2_OUT", \ + "CAAM_JR3", \ + "CAAM_JR3_OUT", \ + "SECO_MU_2", \ + "SECO_MU_3", \ + "SECO_MU_4", \ + "OTP", \ + "ATTESTATION", \ + "SECVIO", \ + +#endif + +#endif /* SC_SS_SC_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/sc/v2/dsc.h b/platform/ss/sc/v2/dsc.h new file mode 100755 index 0000000..7b8a59c --- /dev/null +++ b/platform/ss/sc/v2/dsc.h @@ -0,0 +1,214 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup SC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_SC_DSC_H +#define SC_SS_SC_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name SS GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_CM4_HCLK_MUX_SEL REGBIT(0, 8) +#define GPR_CM4_PANIC_MODE_SEL REGBIT(0, 9) +#define GPR_CM4_AXBS_STALL_REQUEST REGBIT(0, 10) +#define GPR_ROSC_STOP_EN_AON REGBIT(0, 11) +#define GPR_CM4_DBG_REQ REGBIT(0, 12) +#define GPR_CM4_TX_EVENT_ENB REGBIT(0, 13) +#define GPR_CM4_HCLK_ENB REGBIT(0, 14) +#define GPR_CXCTI0 REGBIT(0, 15) +#define GPR_CSYSREQ_DBLOG REGBIT(0, 16) +#define GPR_CSYSREQ_SCU REGBIT(0, 17) +#define GPR_CSYSREQ_CM4_0 REGBIT(0, 18) +#define GPR_CSYSREQ_CM4_1 REGBIT(0, 19) +#define GPR_CSYSREQ_A53 REGBIT(0, 20) +#define GPR_CSYSREQ_A72 REGBIT(0, 21) +#define GPR_CSYSREQ_VPU REGBIT(0, 22) +#define GPR_SIM_BBS_LP_RUN_ACK_3V REGBIT(0, 24) +#define GPR_SIM_BBS_HS_RUN_ACK_3V REGBIT(0, 25) +#define GPR_SIM_SYS_RST_SRSL_WDOG REGBIT(0, 26) +#define GPR_SIM_SYS_RST_SRSH_LOCKUP REGBIT(0, 27) +#define GPR_SIM_SYS_RST_SRSH_SW REGBIT(0, 28) +#define GPR_SIM_SYS_RST_SRSH_UECC REGBIT(0, 29) +#define GPR_SIM_RCM_VLLS_DETECT REGBIT(0, 30) +#define GPR_SLEEP_HOLD_REQ REGBIT(0, 31) +/** @} */ + +/*! + * @name SS GPR Control 1 Bit Definitions + */ +/** @{ */ +#define GPR_CPWRUPACK1 REGBIT(1, 33) +#define GPR_CPWRUPACK2 REGBIT(1, 34) +#define GPR_CPWRUPACK3 REGBIT(1, 35) +#define GPR_CPWRUPACK4 REGBIT(1, 36) +#define GPR_CPWRUPACK5 REGBIT(1, 37) +#define GPR_CPWRUPACK6 REGBIT(1, 38) +#define GPR_CPWRUPACK7 REGBIT(1, 39) +#define GPR_CPWRUPACK8 REGBIT(1, 40) +#define GPR_CPWRUPACK9 REGBIT(1, 41) +#define GPR_CPWRUPACK10 REGBIT(1, 42) +#define GPR_CPWRUPACK11 REGBIT(1, 43) +#define GPR_CPWRUPACK12 REGBIT(1, 44) +#define GPR_CDBGPWRUPACK REGBIT(1, 45) +#define GPR_CSYSPWRUPACK REGBIT(1, 46) +#define GPR_CDBGRSTACK REGBIT(1, 47) +#define GPR_SEC_SLEEP_HOLD_REQ REGBIT(1, 48) +#define GPR_SEC_AXBS_STALL_REQ REGBIT(1, 49) +#define GPR_LPI2C1_IPG_STOP REGBIT(1, 50) +#define GPR_LPI2C1_IPG_STOP_MODE REGBIT(1, 51) +#define GPR_WDOG1_IPG_STOP REGBIT(1, 53) +#define GPR_CAAM_CLK_EN REGBIT(1, 54) +#define GPR_CAAM_IPG_STOP REGBIT(1, 55) +#define GPR_SNVS_IPG_STOP REGBIT(1, 56) +#define GPR_TPM1_IPG_STOP REGBIT(1, 57) +#define GPR_EWR_CONFIG REGBIT(1, 58) +#define GPR_LPUART1_IPG_STOP REGBIT(1, 59) +#define GPR_LPUART1_IPG_STOP_MODE REGBIT(1, 60) +#define GPR_CLEAR_WRITE_ERR REGBIT(1, 61) +#define GPR_IOMUX_ISO_EN0 REGBIT(1, 62) +#define GPR_IOMUX_ISO_EN1 REGBIT(1, 63) +/** @} */ + +/*! + * @name SS GPR Control 2 Bit Definitions + */ +/** @{ */ +#define GPR_TL_ISO_EN_B REGBIT(2, 64) +#define GPR_TL_SW_LF_EN REGBIT(2, 65) +#define GPR_TL_SW_HF_EN REGBIT(2, 66) +#define GPR_ADM_LP_INHIBIT REGBIT(2, 67) +#define GPR_SNVS_HP_RTCCLK REGBIT(2, 68) +#define GPR_EWR_ENABLE REGBIT(2, 69) +#define GPR_UNCORR_ECC_FIX0 REGBIT(2, 70) +#define GPR_UNCORR_ECC_FIX1 REGBIT(2, 71) +#define GPR_UNCORR_ECC_FIX2 REGBIT(2, 72) +#define GPR_UNCORR_ECC_FIX3 REGBIT(2, 73) +#define GPR_UNCORR_ECC_FIX4 REGBIT(2, 74) +#define GPR_UNCORR_ECC_FIX5 REGBIT(2, 75) +#define GPR_PLL_FREQ_COUNTER REGBIT(2, 76) +/** @} */ + +/*! + * @name SS GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_BOOT_MODE0 REGBIT(0, 16) +#define GPS_BOOT_MODE1 REGBIT(0, 17) +#define GPS_BOOT_MODE2 REGBIT(0, 18) +#define GPS_BOOT_MODE3 REGBIT(0, 19) +#define GPS_BOOT_MODE4 REGBIT(0, 20) +#define GPS_BOOT_MODE5 REGBIT(0, 21) +#define GPS_BOOT_MODE6 REGBIT(0, 22) +#define GPS_BOOT_MODE7 REGBIT(0, 23) +#define GPS_LP_STOP_MODE_LOWV_BBS0 REGBIT(0, 24) +#define GPS_LP_STOP_MODE_LOWV_BBS1 REGBIT(0, 25) +#define GPS_LP_STOP_MODE_LOWV_BBS2 REGBIT(0, 26) +#define GPS_LP_STOP_OPTION_BBS0 REGBIT(0, 28) +#define GPS_LP_STOP_OPTION_BBS1 REGBIT(0, 29) +/** @} */ + +/*! + * @name SS GPR Status 1 Bit Definitions + */ +/** @{ */ +#define GPS_CPWRUPREQ1 REGBIT(1, 1) +#define GPS_CPWRUPREQ2 REGBIT(1, 2) +#define GPS_CPWRUPREQ3 REGBIT(1, 3) +#define GPS_CPWRUPREQ4 REGBIT(1, 4) +#define GPS_CPWRUPREQ5 REGBIT(1, 5) +#define GPS_CPWRUPREQ6 REGBIT(1, 6) +#define GPS_CPWRUPREQ7 REGBIT(1, 7) +#define GPS_CPWRUPREQ8 REGBIT(1, 8) +#define GPS_CPWRUPREQ9 REGBIT(1, 9) +#define GPS_CDBGPWRUPREQ REGBIT(1, 13) +#define GPS_CSYSPWRUPREQ REGBIT(1, 14) +#define GPS_CDBGRSTREQ REGBIT(1, 15) +#define GPS_SEC_SLEEP_HOLD_ACK REGBIT(1, 16) +#define GPS_ADM_LPM_INHIBIT REGBIT(1, 17) +#define GPS_ADM_CAAM_CG_INHIBIT REGBIT(1, 18) +/** @} */ + +/*! + * @name SS GPR Status 2 Bit Definitions + */ +/** @{ */ +#define GPS_JTAG_ID REGBIT(2, 0) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_CM4_CPU_SLEEPING REGBIT64(1, 4) +#define IRQ_CM4_CPU_SLEEP_DEEP REGBIT64(1, 5) +#define IRQ_CM4_AXBS_STALL_ACK REGBIT64(1, 6) +#define IRQ_CM4_CPU_SYS_RESET_REQ REGBIT64(1, 7) +#define IRQ_WDOG1_WDG_RSTO REGBIT64(1, 8) +#define IRQ_CM4_CPU_LOCKUP REGBIT64(1, 9) +#define IRQ_AWIC_REQ REGBIT64(1, 10) +#define IRQ_CM4_UECC_ERR REGBIT64(1, 11) +#define IRQ_BBS_SIM_BBS_LP_RUN_REQ REGBIT64(1, 12) +#define IRQ_BBS_SIM_BBS_HS_RUN_REQ REGBIT64(1, 13) +#define IRQ_CM0_CPU_SLEEP_DEEP REGBIT64(1, 15) +#define IRQ_CM0_CPU_RESET_REQ REGBIT64(1, 16) +#define IRQ_CM0_WDOG1_WDG_RSTO REGBIT64(1, 17) +#define IRQ_CM0_CPU_LOCKUP REGBIT64(1, 18) +#define IRQ_CM0_UECC_ERR REGBIT64(1, 19) +#define IRQ_LPI2C1_IPG_STOP_ACK REGBIT64(1, 20) +#define IRQ_LPUART1_IPG_STOP_ACK REGBIT64(1, 21) +#define IRQ_CAAM_IPG_STOP_ACK REGBIT64(1, 22) +#define IRQ_INTMUX_INT_OUT_ASYNC REGBIT64(1, 24) +#define IRQ_MU_SIDEB REGBIT64(1, 27) +/** @} */ + +#endif /* SC_SS_SC_DSC_H */ + +/** @} */ + diff --git a/platform/ss/sc/v2/rsrc.h b/platform/ss/sc/v2/rsrc.h new file mode 100644 index 0000000..d2f70c2 --- /dev/null +++ b/platform/ss/sc/v2/rsrc.h @@ -0,0 +1,94 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the SC subsystem. + * + * @addtogroup SC_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_SC_RSRC_H +#define SC_SS_SC_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_SC_PID0 0U +#define SS_R_SC_PID1 1U +#define SS_R_SC_PID2 2U +#define SS_R_SC_PID3 3U +#define SS_R_SC_PID4 4U +#define SS_R_SC_SEMA42 5U +#define SS_R_SC_TPM 6U +#define SS_R_SC_PIT 7U +#define SS_R_SC_UART 8U +#define SS_R_SC_I2C 9U +#define SS_R_SC_MU_0B 10U +#define SS_R_SC_MU_0A0 11U +#define SS_R_SC_MU_0A1 12U +#define SS_R_SC_MU_0A2 13U +#define SS_R_SC_MU_0A3 14U +#define SS_R_SC_MU_1A 15U +#define SS_R_SYSCNT_RD 16U +#define SS_R_SYSCNT_CMP 17U +#define SS_R_DEBUG 18U +#define SS_R_SYSTEM 19U +#define SS_R_SECO 20U +#define SS_R_CAAM_JR1 21U +#define SS_R_CAAM_JR1_OUT 22U +#define SS_R_CAAM_JR2 23U +#define SS_R_CAAM_JR2_OUT 24U +#define SS_R_CAAM_JR3 25U +#define SS_R_CAAM_JR3_OUT 26U +#define SS_R_SECO_MU_2 27U +#define SS_R_SECO_MU_3 28U +#define SS_R_SECO_MU_4 29U +#define SS_R_OTP 30U +#define SS_R_ATTESTATION 31U +#define SS_R_SECVIO 32U +/** @} */ + +#endif /* SC_SS_SC_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/sc/v2/ss.h b/platform/ss/sc/v2/ss.h new file mode 100755 index 0000000..f67877b --- /dev/null +++ b/platform/ss/sc/v2/ss.h @@ -0,0 +1,71 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the SC subsystem API. + * + * @addtogroup SC_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_SC_SS_H +#define SC_SS_SC_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(sc) + +/* Functions */ + +SS_FUNC_PROTO_SC + +void ss_timestamp_enable_sc(sc_sub_t remote, sc_bool_t enable); +void ss_pause_ddr_traffic_sc(sc_bool_t pause); +void ss_osc24trim_setup_sc(sc_pm_power_mode_t mode); + +/* External variables */ + +extern const ss_dsc_l2irq_handler ss_l2irq_handlers_sc[]; + +#endif /* SC_SS_SC_SS_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v3/Makefile b/platform/ss/vpu/v3/Makefile new file mode 100755 index 0000000..764664c --- /dev/null +++ b/platform/ss/vpu/v3/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/vpu/v3/ss.o + +CONFIGH += $(SRC)/ss/vpu/v3/config.h $(SRC)/ss/vpu/v3/rsrc.h + +RSRC_MD += $(SRC)/ss/vpu/v3/resource.txt + +CLK_MD += $(SRC)/ss/vpu/v3/clock.txt + +CTRL_MD += $(SRC)/ss/vpu/v3/control.txt + +DIRS += $(OUT)/ss/vpu/v3 + diff --git a/platform/ss/vpu/v3/config.h b/platform/ss/vpu/v3/config.h new file mode 100644 index 0000000..03e1fdd --- /dev/null +++ b/platform/ss/vpu/v3/config.h @@ -0,0 +1,145 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the entry points and debug resource strings + * for the VPU subsystem. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/config_ss_h.pl */ + +#ifndef SC_SS_VPU_CONFIG_H +#define SC_SS_VPU_CONFIG_H + +/*! + * This define defines the number of resources. + */ +#define SS_NUM_RSRC_VPU 19U + +/*! Define used to create subsystem function prototypes */ +#define SS_FUNC_PROTO_VPU \ + sc_err_t ss_cpu_start_vpu(sc_sub_t ss, ss_idx_t ss_idx, ss_ridx_t \ + rsrc_idx, sc_bool_t enable, sc_faddr_t addr); \ + void ss_do_mem_repair_vpu(sc_sub_t ss, dsc_pdom_t pd, sc_bool_t \ + enable); \ + void ss_prepost_power_mode_vpu(sc_sub_t ss, dsc_pdom_t pd, ss_prepost_t \ + type, sc_pm_power_mode_t from_mode, sc_pm_power_mode_t to_mode, \ + sc_bool_t rom_boot); \ + + +/*! + * This define is used to override the default SS function entry points. + * If this isn't defined, then the SS uses functions in base. + */ +#define SS_EP_INIT_VPU \ + { \ + ss_init_base, \ + ss_trans_power_mode_base, \ + ss_rsrc_reset_base, \ + ss_set_cpu_power_mode_base, \ + ss_set_cpu_resume_base, \ + ss_req_sys_if_power_mode_base, \ + ss_set_clock_rate_base, \ + ss_get_clock_rate_base, \ + ss_clock_enable_base, \ + ss_force_clock_enable_base, \ + ss_set_clock_parent_base, \ + ss_get_clock_parent_base, \ + ss_is_rsrc_accessible_base, \ + ss_mu_irq_base, \ + ss_cpu_start_vpu, \ + ss_rdc_enable_base, \ + ss_rdc_set_master_base, \ + ss_rdc_set_peripheral_base, \ + ss_rdc_set_memory_base, \ + ss_set_control_base, \ + ss_get_control_base, \ + ss_irq_enable_base, \ + ss_irq_status_base, \ + ss_irq_trigger_base, \ + ss_dump_base, \ + ss_do_mem_repair_vpu, \ + ss_updown_base, \ + ss_prepost_power_mode_vpu, \ + ss_iso_disable_base, \ + ss_link_enable_base, \ + ss_ssi_power_base, \ + ss_ssi_bhole_mode_base, \ + ss_ssi_pause_mode_base, \ + ss_ssi_wait_idle_base, \ + ss_adb_enable_base, \ + ss_adb_wait_base, \ + ss_prepost_clock_mode_base, \ + ss_rdc_is_did_vld_base, \ + } + +#ifdef DEBUG + /*! + * This define is used to name resources for debug output. + */ + #define RNAME_INIT_VPU_0 \ + "VPU", \ + "VPU_PID0", \ + "VPU_PID1", \ + "VPU_PID2", \ + "VPU_PID3", \ + "VPU_PID4", \ + "VPU_PID5", \ + "VPU_PID6", \ + "VPU_PID7", \ + "VPU_DEC_0", \ + "VPU_ENC_0", \ + "VPU_ENC_1", \ + "VPU_TS_0", \ + "VPU_MU_0", \ + "VPU_MU_1", \ + "VPU_MU_2", \ + "VPU_MU_3", \ + "DSP", \ + "DSP_RAM", \ + +#endif + +#endif /* SC_SS_VPU_CONFIG_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v3/dsc.h b/platform/ss/vpu/v3/dsc.h new file mode 100755 index 0000000..1059d63 --- /dev/null +++ b/platform/ss/vpu/v3/dsc.h @@ -0,0 +1,143 @@ +/* +** ################################################################### +** +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_VPU_DSC_H +#define SC_SS_VPU_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_MED_CORE_ENC REGBIT(0, 2) +#define RST_SS_DSP REGBIT(0, 3) +#define RST_MED_CORE_DEC REGBIT(0, 4) +#define RST_SS_DSP_CORE REGBIT(0, 5) +#define RST_SS_DSP_DEBUG REGBIT(0, 6) +#define RST_MED_CORE_BISR REGBIT(0, 7) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SYS_OFFSET_IRQ REGBIT(0, 8) +#define GPR_SYS_OFFSET_AUD REGBIT(0, 16) +#define GPR_SYS_OFFSET_SEL REGBIT(0, 24) +#define GPR_ADB_DSP_PWRDNREQN0 REGBIT(0, 25) +#define GPR_ADB_DSP_PWRDNREQN1 REGBIT(0, 26) +#define GPR_DSP_CACHE_SEL REGBIT(0, 27) +#define GPR_DSP_CACHEABLE REGBIT(0, 28) +#define GPR_DSP_DMA_BYPASS REGBIT(0, 29) +#define GPR_ARCACHE REGBIT(0, 30) +#define GPR_AWCACHE REGBIT(0, 31) +/** @} */ + +/*! + * @name GPR Status 0 Bit Definitions + */ +/** @{ */ +#define GPS_DSP_DEBUGSTATUS REGBIT(0, 16) +#define GPS_ADB_DSP_PWRDNACKN0 REGBIT(0, 25) +#define GPS_ADB_DSP_CACTIVES0 REGBIT(0, 26) +#define GPS_ADB_DSP_CACTIVEM0 REGBIT(0, 27) +#define GPS_ADB_DSP_PWRDNACKN1 REGBIT(0, 29) +#define GPS_ADB_DSP_CACTIVES1 REGBIT(0, 30) +#define GPS_ADB_DSP_CACTIVEM1 REGBIT(0, 31) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_AVE_IRQ0 REGBIT64(1, 0) +#define IRQ_AVE_IRQ1 REGBIT64(1, 1) +#define IRQ_MSD_IRQ REGBIT64(1, 2) +#define IRQ_IRQSTR REGBIT64(1, 7) +/** @} */ + +/*! + * @name CSR2 0x00 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_EXPSTATE REGBIT(0x0, 0) +/** @} */ + +/*! + * @name CSR2 0x01 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_IMPWIRE REGBIT(0x1, 0) +/** @} */ + +/*! + * @name CSR2 0x02 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_PRID REGBIT(0x2, 0) +/** @} */ + +/*! + * @name CSR2 0x30 Bit Definitions + */ +/** @{ */ +#define CSR2_DSP_OCDHALTONRESET REGBIT(0x3, 0) +#define CSR2_DSP_RUNSTALL REGBIT(0x3, 1) +#define CSR2_DSP_STATVECTORSEL REGBIT(0x3, 2) +/** @} */ + +/*! + * @name CSR2 0x04 Bit Definitions + */ +/** @{ */ +/** @} */ + +#endif /* SC_SS_VPU_DSC_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v3/rsrc.h b/platform/ss/vpu/v3/rsrc.h new file mode 100644 index 0000000..d0a20ae --- /dev/null +++ b/platform/ss/vpu/v3/rsrc.h @@ -0,0 +1,80 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing local resource defines for the VPU subsystem. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rsrc_ss_h.pl */ + +#ifndef SC_SS_VPU_RSRC_H +#define SC_SS_VPU_RSRC_H + +/*! + * @name Defines for local SS resource indexes + */ +/** @{ */ +#define SS_R_VPU 0U +#define SS_R_VPU_PID0 1U +#define SS_R_VPU_PID1 2U +#define SS_R_VPU_PID2 3U +#define SS_R_VPU_PID3 4U +#define SS_R_VPU_PID4 5U +#define SS_R_VPU_PID5 6U +#define SS_R_VPU_PID6 7U +#define SS_R_VPU_PID7 8U +#define SS_R_VPU_DEC_0 9U +#define SS_R_VPU_ENC_0 10U +#define SS_R_VPU_ENC_1 11U +#define SS_R_VPU_TS_0 12U +#define SS_R_VPU_MU_0 13U +#define SS_R_VPU_MU_1 14U +#define SS_R_VPU_MU_2 15U +#define SS_R_VPU_MU_3 16U +#define SS_R_DSP 17U +#define SS_R_DSP_RAM 18U +/** @} */ + +#endif /* SC_SS_VPU_RSRC_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v3/ss.h b/platform/ss/vpu/v3/ss.h new file mode 100755 index 0000000..147eff9 --- /dev/null +++ b/platform/ss/vpu/v3/ss.h @@ -0,0 +1,62 @@ +/* +** ################################################################### +** +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the VPU subsystem API. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_VPU_SS_H +#define SC_SS_VPU_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(vpu) + +/* Functions */ + +SS_FUNC_PROTO_VPU + +#endif /* SC_SS_VPU_SS_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v4/Makefile b/platform/ss/vpu/v4/Makefile new file mode 100755 index 0000000..222e6ad --- /dev/null +++ b/platform/ss/vpu/v4/Makefile @@ -0,0 +1,13 @@ + +OBJS += $(OUT)/ss/vpu/v4/ss.o + +CONFIGH += $(SRC)/ss/vpu/v4/config.h $(SRC)/ss/vpu/v4/rsrc.h + +RSRC_MD += $(SRC)/ss/vpu/v4/resource.txt + +CLK_MD += $(SRC)/ss/vpu/v4/clock.txt + +CTRL_MD += $(SRC)/ss/vpu/v4/control.txt + +DIRS += $(OUT)/ss/vpu/v4 + diff --git a/platform/ss/vpu/v4/dsc.h b/platform/ss/vpu/v4/dsc.h new file mode 100755 index 0000000..9e4bed8 --- /dev/null +++ b/platform/ss/vpu/v4/dsc.h @@ -0,0 +1,87 @@ +/* +** ################################################################### +** +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing the subsystem specific DSC header info. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_VPU_DSC_H +#define SC_SS_VPU_DSC_H + +/* Includes */ + +#include "ss/base/v1/dsc.h" + +/*! + * @name Reset Bit Definitions + */ +/** @{ */ +#define RST_MED_CORE_ENC REGBIT(0, 2) +#define RST_MED_CORE_DEC REGBIT(0, 3) +#define RST_MED_CORE_BISR REGBIT(0, 7) +/** @} */ + +/*! + * @name GPR Control 0 Bit Definitions + */ +/** @{ */ +#define GPR_SEC_ENB REGBIT(0, 24) +#define GPR_DEC_CLK REGBIT(0, 25) +#define GPR_ENC_CLK REGBIT(0, 26) +#define GPR_ARCACHE REGBIT(0, 27) +#define GPR_AWCACHE REGBIT(0, 28) +/** @} */ + +/*! + * @name SS IRQ Mask Definitions + */ +/** @{ */ +#define IRQ_AVE_IRQ REGBIT64(1, 0) +#define IRQ_AVE_FIQ REGBIT64(1, 1) +#define IRQ_MSD_IRQ REGBIT64(1, 2) +#define IRQ_MSD_FIQ REGBIT64(1, 3) +#define IRQ_MSD_SIF REGBIT64(1, 4) +/** @} */ + +#endif /* SC_SS_VPU_DSC_H */ + +/** @} */ + diff --git a/platform/ss/vpu/v4/ss.h b/platform/ss/vpu/v4/ss.h new file mode 100755 index 0000000..147eff9 --- /dev/null +++ b/platform/ss/vpu/v4/ss.h @@ -0,0 +1,62 @@ +/* +** ################################################################### +** +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file containing the VPU subsystem API. + * + * @addtogroup VPU_SS + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SS_VPU_SS_H +#define SC_SS_VPU_SS_H + +#include "ss/inf/inf.h" + +/* Externs */ + +SS_BASE_INFO_PROTO(vpu) + +/* Functions */ + +SS_FUNC_PROTO_VPU + +#endif /* SC_SS_VPU_SS_H */ + +/** @} */ + diff --git a/platform/svc/irq/Makefile b/platform/svc/irq/Makefile new file mode 100755 index 0000000..ac04a8e --- /dev/null +++ b/platform/svc/irq/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/irq/svc.o + +RPCS += $(OUT)/svc/irq/rpc_srv.o + +RPCL += $(OUT)/svc/irq/rpc_clnt.o + +RPCH += $(SRC)/svc/irq/rpc.h + +RPCC += $(SRC)/svc/irq/rpc_srv.c \ + $(SRC)/svc/irq/rpc_clnt.c \ + $(SRC)/svc/irq/rpc_xlate.c + +RPCHDR += $(SRC)/svc/irq/rpc_header.h + +DIRS += $(OUT)/svc/irq + diff --git a/platform/svc/irq/api.h b/platform/svc/irq/api.h new file mode 100755 index 0000000..96983eb --- /dev/null +++ b/platform/svc/irq/api.h @@ -0,0 +1,211 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/irq/api.h + * + * Header file containing the public API for the System Controller (SC) + * Interrupt (IRQ) function. + * + * @addtogroup IRQ_SVC IRQ: Interrupt Service + * + * @brief Module for the Interrupt (IRQ) service. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_IRQ_API_H +#define SC_IRQ_API_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +#define SC_IRQ_NUM_GROUP 9U /*!< Number of groups */ + +/*! + * @name Defines for sc_irq_group_t + */ +/** @{ */ +#define SC_IRQ_GROUP_TEMP 0U /*!< Temp interrupts */ +#define SC_IRQ_GROUP_WDOG 1U /*!< Watchdog interrupts */ +#define SC_IRQ_GROUP_RTC 2U /*!< RTC interrupts */ +#define SC_IRQ_GROUP_WAKE 3U /*!< Wakeup interrupts */ +#define SC_IRQ_GROUP_SYSCTR 4U /*!< System counter interrupts */ +#define SC_IRQ_GROUP_REBOOTED 5U /*!< Partition reboot complete */ +#define SC_IRQ_GROUP_REBOOT 6U /*!< Partition reboot starting */ +#define SC_IRQ_GROUP_OFFED 7U /*!< Partition off complete */ +#define SC_IRQ_GROUP_OFF 8U /*!< Partition off starting */ +/** @} */ + +/*! + * @name Defines for sc_irq_temp_t + */ +/** @{ */ +#define SC_IRQ_TEMP_HIGH (1UL << 0U) /*!< Temp high alarm interrupt */ +#define SC_IRQ_TEMP_CPU0_HIGH (1UL << 1U) /*!< CPU0 temp alarm interrupt */ +#define SC_IRQ_TEMP_CPU1_HIGH (1UL << 2U) /*!< CPU1 temp alarm interrupt */ +#define SC_IRQ_TEMP_GPU0_HIGH (1UL << 3U) /*!< GPU0 temp alarm interrupt */ +#define SC_IRQ_TEMP_GPU1_HIGH (1UL << 4U) /*!< GPU1 temp alarm interrupt */ +#define SC_IRQ_TEMP_DRC0_HIGH (1UL << 5U) /*!< DRC0 temp alarm interrupt */ +#define SC_IRQ_TEMP_DRC1_HIGH (1UL << 6U) /*!< DRC1 temp alarm interrupt */ +#define SC_IRQ_TEMP_VPU_HIGH (1UL << 7U) /*!< VPU temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC0_HIGH (1UL << 8U) /*!< PMIC0 temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC1_HIGH (1UL << 9U) /*!< PMIC1 temp alarm interrupt */ +#define SC_IRQ_TEMP_LOW (1UL << 10U) /*!< Temp low alarm interrupt */ +#define SC_IRQ_TEMP_CPU0_LOW (1UL << 11U) /*!< CPU0 temp alarm interrupt */ +#define SC_IRQ_TEMP_CPU1_LOW (1UL << 12U) /*!< CPU1 temp alarm interrupt */ +#define SC_IRQ_TEMP_GPU0_LOW (1UL << 13U) /*!< GPU0 temp alarm interrupt */ +#define SC_IRQ_TEMP_GPU1_LOW (1UL << 14U) /*!< GPU1 temp alarm interrupt */ +#define SC_IRQ_TEMP_DRC0_LOW (1UL << 15U) /*!< DRC0 temp alarm interrupt */ +#define SC_IRQ_TEMP_DRC1_LOW (1UL << 16U) /*!< DRC1 temp alarm interrupt */ +#define SC_IRQ_TEMP_VPU_LOW (1UL << 17U) /*!< VPU temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC0_LOW (1UL << 18U) /*!< PMIC0 temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC1_LOW (1UL << 19U) /*!< PMIC1 temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC2_HIGH (1UL << 20U) /*!< PMIC2 temp alarm interrupt */ +#define SC_IRQ_TEMP_PMIC2_LOW (1UL << 21U) /*!< PMIC2 temp alarm interrupt */ +/** @} */ + +/*! + * @name Defines for sc_irq_wdog_t + */ +/** @{ */ +#define SC_IRQ_WDOG (1U << 0U) /*!< Watchdog interrupt */ +/** @} */ + +/*! + * @name Defines for sc_irq_rtc_t + */ +/** @{ */ +#define SC_IRQ_RTC (1U << 0U) /*!< RTC interrupt */ +/** @} */ + +/*! + * @name Defines for sc_irq_wake_t + */ +/** @{ */ +#define SC_IRQ_BUTTON (1U << 0U) /*!< Button interrupt */ +#define SC_IRQ_PAD (1U << 1U) /*!< Pad wakeup */ +#define SC_IRQ_USR1 (1U << 2U) /*!< User defined 1 */ +#define SC_IRQ_USR2 (1U << 3U) /*!< User defined 2 */ +#define SC_IRQ_BC_PAD (1U << 4U) /*!< Pad wakeup (broadcast to all partitions) */ +#define SC_IRQ_SW_WAKE (1U << 5U) /*!< Software requested wake */ +#define SC_IRQ_SECVIO (1U << 6U) /*!< Security violation */ +/** @} */ + +/*! + * @name Defines for sc_irq_sysctr_t + */ +/** @{ */ +#define SC_IRQ_SYSCTR (1U << 0U) /*!< SYSCTR interrupt */ +/** @} */ + +/* Types */ + +/*! + * This type is used to declare an interrupt group. + */ +typedef uint8_t sc_irq_group_t; + +/*! + * This type is used to declare a bit mask of temp interrupts. + */ +typedef uint8_t sc_irq_temp_t; + +/*! + * This type is used to declare a bit mask of watchdog interrupts. + */ +typedef uint8_t sc_irq_wdog_t; + +/*! + * This type is used to declare a bit mask of RTC interrupts. + */ +typedef uint8_t sc_irq_rtc_t; + +/*! + * This type is used to declare a bit mask of wakeup interrupts. + */ +typedef uint8_t sc_irq_wake_t; + +/* Functions */ + +/*! + * This function enables/disables interrupts. If pending interrupts + * are unmasked, an interrupt will be triggered. + * + * @param[in] ipc IPC handle + * @param[in] resource MU channel + * @param[in] group group the interrupts are in + * @param[in] mask mask of interrupts to affect + * @param[in] enable state to change interrupts to + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if group invalid + */ +/* IDL: E8 ENABLE(UI16 resource, UI8 group, UI32 mask, IB enable) #1 */ +sc_err_t sc_irq_enable(sc_ipc_t ipc, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t mask, sc_bool_t enable); + +/*! + * This function returns the current interrupt status (regardless if + * masked). Automatically clears pending interrupts. + * + * @param[in] ipc IPC handle + * @param[in] resource MU channel + * @param[in] group groups the interrupts are in + * @param[in] status status of interrupts + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if group invalid + * + * The returned \a status may show interrupts pending that are + * currently masked. + */ +/* IDL: E8 STATUS(UI16 resource, UI8 group, UO32 status) #2 */ +sc_err_t sc_irq_status(sc_ipc_t ipc, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t *status); + +#endif /* SC_IRQ_API_H */ + +/** @} */ + diff --git a/platform/svc/irq/rpc.h b/platform/svc/irq/rpc.h new file mode 100644 index 0000000..857b1ba --- /dev/null +++ b/platform/svc/irq/rpc.h @@ -0,0 +1,81 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the IRQ RPC implementation. + * + * @addtogroup IRQ_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_IRQ_RPC_H +#define SC_IRQ_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC IRQ function calls + */ +/** @{ */ +#define IRQ_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define IRQ_FUNC_ENABLE 1U /*!< Index for sc_irq_enable() RPC call */ +#define IRQ_FUNC_STATUS 2U /*!< Index for sc_irq_status() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming IRQ RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void irq_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_IRQ_RPC_H */ + +/** @} */ + diff --git a/platform/svc/irq/rpc_clnt.c b/platform/svc/irq/rpc_clnt.c new file mode 100644 index 0000000..ce35f58 --- /dev/null +++ b/platform/svc/irq/rpc_clnt.c @@ -0,0 +1,127 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the IRQ service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup IRQ_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/irq/api.h" +#include "../../main/rpc.h" +#include "svc/irq/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 ENABLE(UI16 resource, UI8 group, UI32 mask, IB enable) #1 */ +sc_err_t sc_irq_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_irq_group_t group, + uint32_t mask, sc_bool_t enable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_IRQ); + RPC_FUNC(&msg) = U8(IRQ_FUNC_ENABLE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(mask); + RPC_U16(&msg, 4U) = U16(resource); + RPC_U8(&msg, 6U) = U8(group); + RPC_U8(&msg, 7U) = B2U8(enable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 STATUS(UI16 resource, UI8 group, UO32 status) #2 */ +sc_err_t sc_irq_status(sc_ipc_t ipc, sc_rsrc_t resource, sc_irq_group_t group, + uint32_t *status) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_IRQ); + RPC_FUNC(&msg) = U8(IRQ_FUNC_STATUS); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(group); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (status != NULL) + { + *status = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/** @} */ + diff --git a/platform/svc/irq/rpc_srv.c b/platform/svc/irq/rpc_srv.c new file mode 100644 index 0000000..ed6be85 --- /dev/null +++ b/platform/svc/irq/rpc_srv.c @@ -0,0 +1,147 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the IRQ service. + * + * @addtogroup IRQ_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/irq/svc.h" +#include "svc/irq/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void irq_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case IRQ_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch enable() */ + case IRQ_FUNC_ENABLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 4U)); + sc_irq_group_t group = ((sc_irq_group_t) RPC_U8(msg, 6U)); + uint32_t mask = ((uint32_t) RPC_U32(msg, 0U)); + sc_bool_t enable = U2B(RPC_U8(msg, 7U)); + + /* Call function */ + err = irq_enable(caller_pt, resource, group, mask, enable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch status() */ + case IRQ_FUNC_STATUS : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_irq_group_t group = ((sc_irq_group_t) RPC_U8(msg, 2U)); + uint32_t status = ((uint32_t) 0U); + + /* Call function */ + err = irq_status(caller_pt, resource, group, &status); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(status); + RPC_SIZE(msg) = 2U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=irq, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=irq, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/irq/svc.c b/platform/svc/irq/svc.c new file mode 100755 index 0000000..8334902 --- /dev/null +++ b/platform/svc/irq/svc.c @@ -0,0 +1,140 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/irq/svc.c + * + * File containing the implementation of the System Controller (SC) + * Interrupt (IRQ) function. + * + * @addtogroup IRQ_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "svc/irq/svc.h" +#include "ss/inf/inf.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* Local Variables */ + +/*--------------------------------------------------------------------------*/ +/* Enable/disable interrupts */ +/*--------------------------------------------------------------------------*/ +sc_err_t irq_enable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t mask, sc_bool_t enable) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + ASRT_ERR(group < SC_IRQ_NUM_GROUP, SC_ERR_PARM); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + uint32_t new_mask = mask; + + /* Convert partition-based IRQs */ + if ((group == SC_IRQ_GROUP_WDOG) + || (group == SC_IRQ_GROUP_RTC) + || (group == SC_IRQ_GROUP_SYSCTR)) + { + new_mask = BIT(caller_pt); + } + + /* Enable/disable interrupt */ + err = ss_irq_enable(idx, group, new_mask, enable); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get and clear interrupt status */ +/*--------------------------------------------------------------------------*/ +sc_err_t irq_status(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t *status) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + ASRT_ERR(group < SC_IRQ_NUM_GROUP, SC_ERR_PARM); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + /* Get and clear interrupt status */ + if (err == SC_ERR_NONE) + { + err = ss_irq_status(idx, group, status); + + /* Convert partition-based IRQs */ + if (err == SC_ERR_NONE) + { + if ((*status != 0U) + && ((group == SC_IRQ_GROUP_WDOG) + || (group == SC_IRQ_GROUP_RTC) + || (group == SC_IRQ_GROUP_SYSCTR))) + { + *status = BIT(0); + } + } + } + + return err; +} + +/*==========================================================================*/ + +/** @} */ + diff --git a/platform/svc/irq/svc.h b/platform/svc/irq/svc.h new file mode 100755 index 0000000..e039b1b --- /dev/null +++ b/platform/svc/irq/svc.h @@ -0,0 +1,81 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/irq/svc.h + * + * Header file containing the API for the System Controller (SC) Interrupt + * (IRQ) function. + * + * @addtogroup IRQ_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_IRQ_SVC_H +#define SC_IRQ_SVC_H + +/* Includes */ + +#include "svc/irq/api.h" +#include "svc/rm/svc.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * Internal SC function to enable/disable interrupts. + * + * @see sc_irq_set_control(). + */ +sc_err_t irq_enable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t mask, sc_bool_t enable); + +/*! + * Internal SC function to get and clear interrupt status. + * + * @see sc_irq_get_control(). + */ +sc_err_t irq_status(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_irq_group_t group, uint32_t *status); + +#endif /* SC_IRQ_SVC_H */ + +/** @} */ + diff --git a/platform/svc/misc/Makefile b/platform/svc/misc/Makefile new file mode 100755 index 0000000..7a7cb31 --- /dev/null +++ b/platform/svc/misc/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/misc/svc.o + +RPCS += $(OUT)/svc/misc/rpc_srv.o + +RPCL += $(OUT)/svc/misc/rpc_clnt.o + +RPCH += $(SRC)/svc/misc/rpc.h + +RPCC += $(SRC)/svc/misc/rpc_srv.c \ + $(SRC)/svc/misc/rpc_clnt.c \ + $(SRC)/svc/misc/rpc_xlate.c + +RPCHDR += $(SRC)/svc/misc/rpc_header.h + +DIRS += $(OUT)/svc/misc + diff --git a/platform/svc/misc/api.h b/platform/svc/misc/api.h new file mode 100755 index 0000000..cc4d40d --- /dev/null +++ b/platform/svc/misc/api.h @@ -0,0 +1,518 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/misc/api.h + * + * Header file containing the public API for the System Controller (SC) + * Miscellaneous (MISC) function. + * + * @addtogroup MISC_SVC MISC: Miscellaneous Service + * + * @brief Module for the Miscellaneous (MISC) service. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_MISC_API_H +#define SC_MISC_API_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_MISC_DMA_GRP_W 5U /*!< Width of sc_misc_dma_group_t */ +/** @} */ + +/*! Max DMA channel priority group */ +#define SC_MISC_DMA_GRP_MAX 31U + +/*! + * @name Defines for sc_misc_boot_status_t + */ +/** @{ */ +#define SC_MISC_BOOT_STATUS_SUCCESS 0U /*!< Success */ +#define SC_MISC_BOOT_STATUS_SECURITY 1U /*!< Security violation */ +/** @} */ + +/*! + * @name Defines for sc_misc_temp_t + */ +/** @{ */ +#define SC_MISC_TEMP 0U /*!< Temp sensor */ +#define SC_MISC_TEMP_HIGH 1U /*!< Temp high alarm */ +#define SC_MISC_TEMP_LOW 2U /*!< Temp low alarm */ +/** @} */ + +/*! + * @name Defines for sc_misc_bt_t + */ +/** @{ */ +#define SC_MISC_BT_PRIMARY 0U /*!< Primary boot */ +#define SC_MISC_BT_SECONDARY 1U /*!< Secondary boot */ +#define SC_MISC_BT_RECOVERY 2U /*!< Recovery boot */ +#define SC_MISC_BT_MANUFACTURE 3U /*!< Manufacture boot */ +#define SC_MISC_BT_SERIAL 4U /*!< Serial boot */ +/** @} */ + +/* Types */ + +/*! + * This type is used to store a DMA channel priority group. + */ +typedef uint8_t sc_misc_dma_group_t; + +/*! + * This type is used report boot status. + */ +typedef uint8_t sc_misc_boot_status_t; + +/*! + * This type is used report boot status. + */ +typedef uint8_t sc_misc_temp_t; + +/*! + * This type is used report the boot type. + */ +typedef uint8_t sc_misc_bt_t; + +/* Functions */ + +/*! + * @name Control Functions + * @{ + */ + +/*! + * This function sets a miscellaneous control value. + * + * @param[in] ipc IPC handle + * @param[in] resource resource the control is associated with + * @param[in] ctrl control to change + * @param[in] val value to apply to the control + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * of the owner + * + * Refer to the [Control List](@ref CONTROLS) for valid control values. + */ +/* IDL: E8 SET_CONTROL(UI16 resource, UI32 ctrl, UI32 val) #1 */ +sc_err_t sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t val); + +/*! + * This function gets a miscellaneous control value. + * + * @param[in] ipc IPC handle + * @param[in] resource resource the control is associated with + * @param[in] ctrl control to get + * @param[out] val pointer to return the control value + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * of the owner + * + * Refer to the [Control List](@ref CONTROLS) for valid control values. + */ +/* IDL: E8 GET_CONTROL(UI16 resource, UI32 ctrl, UO32 val) #2 */ +sc_err_t sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t *val); + +/** @} */ + +/*! + * @name DMA Functions + * @{ + */ + +/*! + * This function configures the max DMA channel priority group for a + * partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to assign \a max + * @param[in] max max priority group (0-31) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the parent + * of the affected partition + * + * Valid \a max range is 0-31 with 0 being the lowest and 31 the highest. + * Default is the max priority group for the parent partition of \a pt. + */ +/* IDL: E8 SET_MAX_DMA_GROUP(UI8 pt, UI8 max) #4 */ +sc_err_t sc_misc_set_max_dma_group(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_misc_dma_group_t max); + +/*! + * This function configures the priority group for a DMA channel. + * + * @param[in] ipc IPC handle + * @param[in] resource DMA channel resource + * @param[in] group priority group (0-31) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the owner or parent + * of the owner of the DMA channel + * + * Valid \a group range is 0-31 with 0 being the lowest and 31 the highest. + * The max value of \a group is limited by the partition max set using + * sc_misc_set_max_dma_group(). + */ +/* IDL: E8 SET_DMA_GROUP(UI16 resource, UI8 group) #5 */ +sc_err_t sc_misc_set_dma_group(sc_ipc_t ipc, sc_rsrc_t resource, + sc_misc_dma_group_t group); + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * This function is used output a debug character from the SCU UART. + * + * @param[in] ipc IPC handle + * @param[in] ch character to output + */ +/* IDL: R0 DEBUG_OUT(UI8 ch) #10 */ +void sc_misc_debug_out(sc_ipc_t ipc, uint8_t ch); + +/*! + * This function starts/stops emulation waveform capture. + * + * @param[in] ipc IPC handle + * @param[in] enable flag to enable/disable capture + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_UNAVAILABLE if not running on emulation + */ +/* IDL: E8 WAVEFORM_CAPTURE(IB enable) #6 */ +sc_err_t sc_misc_waveform_capture(sc_ipc_t ipc, sc_bool_t enable); + +/*! + * This function is used to return the SCFW build info. + * + * @param[in] ipc IPC handle + * @param[out] build pointer to return build number + * @param[out] commit pointer to return commit ID (git SHA-1) + */ +/* IDL: R0 BUILD_INFO(UO32 build, UO32 commit) #15 */ +void sc_misc_build_info(sc_ipc_t ipc, uint32_t *build, + uint32_t *commit); + +/*! + * This function is used to return the SCFW API versions. + * + * @param[in] ipc IPC handle + * @param[out] cl_maj pointer to return major part of client version + * @param[out] cl_min pointer to return minor part of client version + * @param[out] sv_maj pointer to return major part of SCFW version + * @param[out] sv_min pointer to return minor part of SCFW version + * + * Client version is the version of the API ported to and used by the caller. + * SCFW version is the version of the SCFW binary running on the CPU. + * + * Note a major version difference indicates a break in compatibility. + */ +/* IDL: R0 API_VER(UO16 cl_maj, UO16 cl_min, UO16 sv_maj, UO16 sv_min) #35 */ +void sc_misc_api_ver(sc_ipc_t ipc, uint16_t *cl_maj, + uint16_t *cl_min, uint16_t *sv_maj, uint16_t *sv_min); + +/*! + * This function is used to return the device's unique ID. + * + * @param[in] ipc IPC handle + * @param[out] id_l pointer to return lower 32-bit of ID [31:0] + * @param[out] id_h pointer to return upper 32-bits of ID [63:32] + */ +/* IDL: R0 UNIQUE_ID(UO32 id_l, UO32 id_h) #19 */ +void sc_misc_unique_id(sc_ipc_t ipc, uint32_t *id_l, + uint32_t *id_h); + +/** @} */ + +/*! + * @name Other Functions + * @{ + */ + +/*! + * This function configures the ARI match value for PCIe/SATA resources. + * + * @param[in] ipc IPC handle + * @param[in] resource match resource + * @param[in] resource_mst PCIe/SATA master to match + * @param[in] ari ARI to match + * @param[in] enable enable match or not + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the owner or parent + * of the owner of the resource and translation + * + * For PCIe, the ARI is the 16-bit value that includes the bus number, + * device number, and function number. For SATA, this value includes the + * FISType and PM_Port. + */ +/* IDL: E8 SET_ARI(UI16 resource, UI16 resource_mst, UI16 ari, IB enable) #3 */ +sc_err_t sc_misc_set_ari(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rsrc_t resource_mst, uint16_t ari, sc_bool_t enable); + +/*! + * This function reports boot status. + * + * @param[in] ipc IPC handle + * @param[in] status boot status + * + * This is used by SW partitions to report status of boot. This is + * normally used to report a boot failure. + */ +/* IDL: RN BOOT_STATUS(UI8 status) #7 */ +void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status); + +/*! + * This function tells the SCFW that a CPU is done booting. + * + * @param[in] ipc IPC handle + * @param[in] cpu CPU that is done booting + * + * This is called by early booting CPUs to report they are done with + * initialization. After starting early CPUs, the SCFW halts the + * booting process until they are done. During this time, early + * CPUs can call the SCFW with lower latency as the SCFW is idle. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the CPU owner + */ +/* IDL: E8 BOOT_DONE(UI16 cpu) #14 */ +sc_err_t sc_misc_boot_done(sc_ipc_t ipc, sc_rsrc_t cpu); + +/*! + * This function reads a given fuse word index. + * + * @param[in] ipc IPC handle + * @param[in] word fuse word index + * @param[out] val fuse read value + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid + * - SC_ERR_NOACCESS if read operation failed + * - SC_ERR_LOCKED if read operation is locked + */ +/* IDL: E8 OTP_FUSE_READ(UI32 word, UO32 val) #11 */ +sc_err_t sc_misc_otp_fuse_read(sc_ipc_t ipc, uint32_t word, uint32_t *val); + +/*! + * This function writes a given fuse word index. Only the owner of the + * SC_R_SYSTEM resource or a partition with access permissions to + * SC_R_SYSTEM can do this. + * + * @param[in] ipc IPC handle + * @param[in] word fuse word index + * @param[in] val fuse write value + * + * The command is passed as is to SECO. SECO uses part of the + * \a word parameter to indicate if the fuse should be locked + * after programming. See the "Write common fuse" section of + * the SECO API Reference Guide for more info. + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid + * - SC_ERR_NOACCESS if caller does not have SC_R_SYSTEM access + * - SC_ERR_NOACCESS if write operation failed + * - SC_ERR_LOCKED if write operation is locked + */ +/* IDL: E8 OTP_FUSE_WRITE(UI32 word, UI32 val) #17 */ +sc_err_t sc_misc_otp_fuse_write(sc_ipc_t ipc, uint32_t word, uint32_t val); + +/*! + * This function sets a temp sensor alarm. + * + * @param[in] ipc IPC handle + * @param[in] resource resource with sensor + * @param[in] temp alarm to set + * @param[in] celsius whole part of temp to set + * @param[in] tenths fractional part of temp to set + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * This function will enable the alarm interrupt if the temp requested is + * not the min/max temp. This enable automatically clears when the alarm + * occurs and this function has to be called again to re-enable. + * + * Return errors codes: + * - SC_ERR_PARM if parameters invalid + * - SC_ERR_NOACCESS if caller does not own the resource + * - SC_ERR_NOPOWER if power domain of resource not powered + */ +/* IDL: E8 SET_TEMP(UI16 resource, UI8 temp, I16 celsius, I8 tenths) #12 */ +sc_err_t sc_misc_set_temp(sc_ipc_t ipc, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t celsius, int8_t tenths); + +/*! + * This function gets a temp sensor value. + * + * @param[in] ipc IPC handle + * @param[in] resource resource with sensor + * @param[in] temp value to get (sensor or alarm) + * @param[out] celsius whole part of temp to get + * @param[out] tenths fractional part of temp to get + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if parameters invalid + * - SC_ERR_BUSY if temp not ready yet (time delay after power on) + * - SC_ERR_NOPOWER if power domain of resource not powered + */ +/* IDL: E8 GET_TEMP(UI16 resource, UI8 temp, O16 celsius, O8 tenths) #13 */ +sc_err_t sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t *celsius, int8_t *tenths); + +/*! + * This function returns the boot device. + * + * @param[in] ipc IPC handle + * @param[out] dev pointer to return boot device + */ +/* IDL: R0 GET_BOOT_DEV(UO16 dev) #16 */ +void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *dev); + +/*! + * This function returns the boot type. + * + * @param[in] ipc IPC handle + * @param[out] type pointer to return boot type + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors code: + * - SC_ERR_UNAVAILABLE if type not passed by ROM + */ +/* IDL: E8 GET_BOOT_TYPE(UO8 type) #33 */ +sc_err_t sc_misc_get_boot_type(sc_ipc_t ipc, sc_misc_bt_t *type); + +/*! + * This function returns the boot container index. + * + * @param[in] ipc IPC handle + * @param[out] idx pointer to return index + * + * Return \a idx = 1 for first container, 2 for second. + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors code: + * - SC_ERR_UNAVAILABLE if index not passed by ROM + */ +/* IDL: E8 GET_BOOT_CONTAINER(UO8 idx) #36 */ +sc_err_t sc_misc_get_boot_container(sc_ipc_t ipc, uint8_t *idx); + +/*! + * This function returns the current status of the ON/OFF button. + * + * @param[in] ipc IPC handle + * @param[out] status pointer to return button status + */ +/* IDL: R0 GET_BUTTON_STATUS(OB status) #18 */ +void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status); + +/*! + * This function returns the ROM patch checksum. + * + * @param[in] ipc IPC handle + * @param[out] checksum pointer to return checksum + * + * @return Returns and error code (SC_ERR_NONE = success). + */ +/* IDL: E8 ROMPATCH_CHECKSUM(UO32 checksum) #26 */ +sc_err_t sc_misc_rompatch_checksum(sc_ipc_t ipc, uint32_t *checksum); + +/*! + * This function calls the board IOCTL function. + * + * @param[in] ipc IPC handle + * @param[in,out] parm1 pointer to pass parameter 1 + * @param[in,out] parm2 pointer to pass parameter 2 + * @param[in,out] parm3 pointer to pass parameter 3 + * + * @return Returns and error code (SC_ERR_NONE = success). + */ +/* IDL: E8 BOARD_IOCTL(UIO32 parm1, UIO32 parm2, UIO32 parm3) #34 */ +sc_err_t sc_misc_board_ioctl(sc_ipc_t ipc, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3); + +/** @} */ + +#endif /* SC_MISC_API_H */ + +/** @} */ + diff --git a/platform/svc/misc/rpc.h b/platform/svc/misc/rpc.h new file mode 100644 index 0000000..ccdc688 --- /dev/null +++ b/platform/svc/misc/rpc.h @@ -0,0 +1,101 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the MISC RPC implementation. + * + * @addtogroup MISC_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_MISC_RPC_H +#define SC_MISC_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC MISC function calls + */ +/** @{ */ +#define MISC_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define MISC_FUNC_SET_CONTROL 1U /*!< Index for sc_misc_set_control() RPC call */ +#define MISC_FUNC_GET_CONTROL 2U /*!< Index for sc_misc_get_control() RPC call */ +#define MISC_FUNC_SET_MAX_DMA_GROUP 4U /*!< Index for sc_misc_set_max_dma_group() RPC call */ +#define MISC_FUNC_SET_DMA_GROUP 5U /*!< Index for sc_misc_set_dma_group() RPC call */ +#define MISC_FUNC_DEBUG_OUT 10U /*!< Index for sc_misc_debug_out() RPC call */ +#define MISC_FUNC_WAVEFORM_CAPTURE 6U /*!< Index for sc_misc_waveform_capture() RPC call */ +#define MISC_FUNC_BUILD_INFO 15U /*!< Index for sc_misc_build_info() RPC call */ +#define MISC_FUNC_API_VER 35U /*!< Index for sc_misc_api_ver() RPC call */ +#define MISC_FUNC_UNIQUE_ID 19U /*!< Index for sc_misc_unique_id() RPC call */ +#define MISC_FUNC_SET_ARI 3U /*!< Index for sc_misc_set_ari() RPC call */ +#define MISC_FUNC_BOOT_STATUS 7U /*!< Index for sc_misc_boot_status() RPC call */ +#define MISC_FUNC_BOOT_DONE 14U /*!< Index for sc_misc_boot_done() RPC call */ +#define MISC_FUNC_OTP_FUSE_READ 11U /*!< Index for sc_misc_otp_fuse_read() RPC call */ +#define MISC_FUNC_OTP_FUSE_WRITE 17U /*!< Index for sc_misc_otp_fuse_write() RPC call */ +#define MISC_FUNC_SET_TEMP 12U /*!< Index for sc_misc_set_temp() RPC call */ +#define MISC_FUNC_GET_TEMP 13U /*!< Index for sc_misc_get_temp() RPC call */ +#define MISC_FUNC_GET_BOOT_DEV 16U /*!< Index for sc_misc_get_boot_dev() RPC call */ +#define MISC_FUNC_GET_BOOT_TYPE 33U /*!< Index for sc_misc_get_boot_type() RPC call */ +#define MISC_FUNC_GET_BOOT_CONTAINER 36U /*!< Index for sc_misc_get_boot_container() RPC call */ +#define MISC_FUNC_GET_BUTTON_STATUS 18U /*!< Index for sc_misc_get_button_status() RPC call */ +#define MISC_FUNC_ROMPATCH_CHECKSUM 26U /*!< Index for sc_misc_rompatch_checksum() RPC call */ +#define MISC_FUNC_BOARD_IOCTL 34U /*!< Index for sc_misc_board_ioctl() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming MISC RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void misc_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_MISC_RPC_H */ + +/** @} */ + diff --git a/platform/svc/misc/rpc_clnt.c b/platform/svc/misc/rpc_clnt.c new file mode 100644 index 0000000..e455a91 --- /dev/null +++ b/platform/svc/misc/rpc_clnt.c @@ -0,0 +1,661 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the MISC service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup MISC_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/misc/api.h" +#include "../../main/rpc.h" +#include "svc/misc/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 SET_CONTROL(UI16 resource, UI32 ctrl, UI32 val) #1 */ +sc_err_t sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, + uint32_t val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_SET_CONTROL); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ctrl); + RPC_U32(&msg, 4U) = U32(val); + RPC_U16(&msg, 8U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_CONTROL(UI16 resource, UI32 ctrl, UO32 val) #2 */ +sc_err_t sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, + uint32_t *val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_CONTROL); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ctrl); + RPC_U16(&msg, 4U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (val != NULL) + { + *val = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MAX_DMA_GROUP(UI8 pt, UI8 max) #4 */ +sc_err_t sc_misc_set_max_dma_group(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_misc_dma_group_t max) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_SET_MAX_DMA_GROUP); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(max); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_DMA_GROUP(UI16 resource, UI8 group) #5 */ +sc_err_t sc_misc_set_dma_group(sc_ipc_t ipc, sc_rsrc_t resource, + sc_misc_dma_group_t group) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_SET_DMA_GROUP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(group); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: R0 DEBUG_OUT(UI8 ch) #10 */ +void sc_misc_debug_out(sc_ipc_t ipc, uint8_t ch) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_DEBUG_OUT); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(ch); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); +} + +/* IDL: E8 WAVEFORM_CAPTURE(IB enable) #6 */ +sc_err_t sc_misc_waveform_capture(sc_ipc_t ipc, sc_bool_t enable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_WAVEFORM_CAPTURE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = B2U8(enable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: R0 BUILD_INFO(UO32 build, UO32 commit) #15 */ +void sc_misc_build_info(sc_ipc_t ipc, uint32_t *build, uint32_t *commit) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_BUILD_INFO); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (build != NULL) + { + *build = (uint32_t) RPC_U32(&msg, 0U); + } + if (commit != NULL) + { + *commit = (uint32_t) RPC_U32(&msg, 4U); + } +} + +/* IDL: R0 API_VER(UO16 cl_maj, UO16 cl_min, UO16 sv_maj, UO16 sv_min) #35 */ +void sc_misc_api_ver(sc_ipc_t ipc, uint16_t *cl_maj, uint16_t *cl_min, + uint16_t *sv_maj, uint16_t *sv_min) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_API_VER); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (cl_maj != NULL) + { + *cl_maj = (uint16_t) SCFW_API_VERSION_MAJOR; + } + if (cl_min != NULL) + { + *cl_min = (uint16_t) SCFW_API_VERSION_MINOR; + } + if (sv_maj != NULL) + { + *sv_maj = (uint16_t) RPC_U16(&msg, 4U); + } + if (sv_min != NULL) + { + *sv_min = (uint16_t) RPC_U16(&msg, 6U); + } +} + +/* IDL: R0 UNIQUE_ID(UO32 id_l, UO32 id_h) #19 */ +void sc_misc_unique_id(sc_ipc_t ipc, uint32_t *id_l, uint32_t *id_h) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_UNIQUE_ID); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (id_l != NULL) + { + *id_l = (uint32_t) RPC_U32(&msg, 0U); + } + if (id_h != NULL) + { + *id_h = (uint32_t) RPC_U32(&msg, 4U); + } +} + +/* IDL: E8 SET_ARI(UI16 resource, UI16 resource_mst, UI16 ari, IB enable) #3 */ +sc_err_t sc_misc_set_ari(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rsrc_t resource_mst, uint16_t ari, sc_bool_t enable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_SET_ARI); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U16(&msg, 2U) = U16(resource_mst); + RPC_U16(&msg, 4U) = U16(ari); + RPC_U8(&msg, 6U) = B2U8(enable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RN BOOT_STATUS(UI8 status) #7 */ +void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_BOOT_STATUS); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(status); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_TRUE); +} + +/* IDL: E8 BOOT_DONE(UI16 cpu) #14 */ +sc_err_t sc_misc_boot_done(sc_ipc_t ipc, sc_rsrc_t cpu) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_BOOT_DONE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(cpu); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 OTP_FUSE_READ(UI32 word, UO32 val) #11 */ +sc_err_t sc_misc_otp_fuse_read(sc_ipc_t ipc, uint32_t word, uint32_t *val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_OTP_FUSE_READ); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(word); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (val != NULL) + { + *val = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 OTP_FUSE_WRITE(UI32 word, UI32 val) #17 */ +sc_err_t sc_misc_otp_fuse_write(sc_ipc_t ipc, uint32_t word, uint32_t val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_OTP_FUSE_WRITE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(word); + RPC_U32(&msg, 4U) = U32(val); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_TEMP(UI16 resource, UI8 temp, I16 celsius, I8 tenths) #12 */ +sc_err_t sc_misc_set_temp(sc_ipc_t ipc, sc_rsrc_t resource, sc_misc_temp_t temp, + int16_t celsius, int8_t tenths) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_SET_TEMP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_I16(&msg, 2U) = I16(celsius); + RPC_U8(&msg, 4U) = U8(temp); + RPC_I8(&msg, 5U) = I8(tenths); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_TEMP(UI16 resource, UI8 temp, O16 celsius, O8 tenths) #13 */ +sc_err_t sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, sc_misc_temp_t temp, + int16_t *celsius, int8_t *tenths) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_TEMP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(temp); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (celsius != NULL) + { + *celsius = (int16_t) RPC_I16(&msg, 0U); + } + if (tenths != NULL) + { + *tenths = (int8_t) RPC_I8(&msg, 2U); + } + + /* Return result */ + return err; +} + +/* IDL: R0 GET_BOOT_DEV(UO16 dev) #16 */ +void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *dev) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_BOOT_DEV); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (dev != NULL) + { + *dev = (sc_rsrc_t) RPC_U16(&msg, 0U); + } +} + +/* IDL: E8 GET_BOOT_TYPE(UO8 type) #33 */ +sc_err_t sc_misc_get_boot_type(sc_ipc_t ipc, sc_misc_bt_t *type) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_BOOT_TYPE); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (type != NULL) + { + *type = (sc_misc_bt_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 GET_BOOT_CONTAINER(UO8 idx) #36 */ +sc_err_t sc_misc_get_boot_container(sc_ipc_t ipc, uint8_t *idx) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_BOOT_CONTAINER); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (idx != NULL) + { + *idx = (uint8_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: R0 GET_BUTTON_STATUS(OB status) #18 */ +void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_GET_BUTTON_STATUS); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (status != NULL) + { + *status = (sc_bool_t) U2B(RPC_U8(&msg, 0U)); + } +} + +/* IDL: E8 ROMPATCH_CHECKSUM(UO32 checksum) #26 */ +sc_err_t sc_misc_rompatch_checksum(sc_ipc_t ipc, uint32_t *checksum) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_ROMPATCH_CHECKSUM); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (checksum != NULL) + { + *checksum = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 BOARD_IOCTL(UIO32 parm1, UIO32 parm2, UIO32 parm3) #34 */ +sc_err_t sc_misc_board_ioctl(sc_ipc_t ipc, uint32_t *parm1, uint32_t *parm2, + uint32_t *parm3) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_MISC); + RPC_FUNC(&msg) = U8(MISC_FUNC_BOARD_IOCTL); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(*parm1); + RPC_U32(&msg, 4U) = U32(*parm2); + RPC_U32(&msg, 8U) = U32(*parm3); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *parm1 = (uint32_t) RPC_U32(&msg, 0U); + *parm2 = (uint32_t) RPC_U32(&msg, 4U); + *parm3 = (uint32_t) RPC_U32(&msg, 8U); + + /* Return result */ + return err; +} + +/** @} */ + diff --git a/platform/svc/misc/rpc_srv.c b/platform/svc/misc/rpc_srv.c new file mode 100644 index 0000000..baa08b7 --- /dev/null +++ b/platform/svc/misc/rpc_srv.c @@ -0,0 +1,486 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the MISC service. + * + * @addtogroup MISC_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/misc/svc.h" +#include "svc/misc/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void misc_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case MISC_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch set_control() */ + case MISC_FUNC_SET_CONTROL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_ctrl_t ctrl = ((sc_ctrl_t) RPC_U32(msg, 0U)); + uint32_t val = ((uint32_t) RPC_U32(msg, 4U)); + + /* Call function */ + err = misc_set_control(caller_pt, resource, ctrl, val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_control() */ + case MISC_FUNC_GET_CONTROL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 4U)); + sc_ctrl_t ctrl = ((sc_ctrl_t) RPC_U32(msg, 0U)); + uint32_t val = ((uint32_t) 0U); + + /* Call function */ + err = misc_get_control(caller_pt, resource, ctrl, &val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(val); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_max_dma_group() */ + case MISC_FUNC_SET_MAX_DMA_GROUP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_misc_dma_group_t max = ((sc_misc_dma_group_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = misc_set_max_dma_group(caller_pt, pt, max); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_dma_group() */ + case MISC_FUNC_SET_DMA_GROUP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_misc_dma_group_t group = ((sc_misc_dma_group_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = misc_set_dma_group(caller_pt, resource, group); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch debug_out() */ + case MISC_FUNC_DEBUG_OUT : + { + /* Declare return and parameters */ + uint8_t ch = ((uint8_t) RPC_U8(msg, 0U)); + + /* Call function */ + misc_debug_out(caller_pt, ch); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch waveform_capture() */ + case MISC_FUNC_WAVEFORM_CAPTURE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_bool_t enable = U2B(RPC_U8(msg, 0U)); + + /* Call function */ + err = misc_waveform_capture(caller_pt, enable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch build_info() */ + case MISC_FUNC_BUILD_INFO : + { + /* Declare return and parameters */ + uint32_t build = ((uint32_t) 0U); + uint32_t commit = ((uint32_t) 0U); + + /* Call function */ + misc_build_info(caller_pt, &build, &commit); + + /* Copy in return parameters */ + RPC_U32(msg, 0U) = U32(build); + RPC_U32(msg, 4U) = U32(commit); + RPC_SIZE(msg) = 3U; + break; + } + /* Dispatch api_ver() */ + case MISC_FUNC_API_VER : + { + /* Declare return and parameters */ + uint16_t cl_maj = ((uint16_t) 0U); + uint16_t cl_min = ((uint16_t) 0U); + uint16_t sv_maj = ((uint16_t) 0U); + uint16_t sv_min = ((uint16_t) 0U); + + /* Call function */ + misc_api_ver(caller_pt, &cl_maj, &cl_min, &sv_maj, &sv_min); + + /* Copy in return parameters */ + RPC_U16(msg, 0U) = U16(cl_maj); + RPC_U16(msg, 2U) = U16(cl_min); + RPC_U16(msg, 4U) = U16(sv_maj); + RPC_U16(msg, 6U) = U16(sv_min); + RPC_SIZE(msg) = 3U; + break; + } + /* Dispatch unique_id() */ + case MISC_FUNC_UNIQUE_ID : + { + /* Declare return and parameters */ + uint32_t id_l = ((uint32_t) 0U); + uint32_t id_h = ((uint32_t) 0U); + + /* Call function */ + misc_unique_id(caller_pt, &id_l, &id_h); + + /* Copy in return parameters */ + RPC_U32(msg, 0U) = U32(id_l); + RPC_U32(msg, 4U) = U32(id_h); + RPC_SIZE(msg) = 3U; + break; + } + /* Dispatch set_ari() */ + case MISC_FUNC_SET_ARI : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rsrc_t resource_mst = ((sc_rsrc_t) RPC_U16(msg, 2U)); + uint16_t ari = ((uint16_t) RPC_U16(msg, 4U)); + sc_bool_t enable = U2B(RPC_U8(msg, 6U)); + + /* Call function */ + err = misc_set_ari(caller_pt, resource, resource_mst, ari, + enable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch boot_status() */ + case MISC_FUNC_BOOT_STATUS : + { + /* Declare return and parameters */ + sc_misc_boot_status_t status = ((sc_misc_boot_status_t) RPC_U8(msg, 0U)); + + /* Call function */ + misc_boot_status(caller_pt, status); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 0U; + break; + } + /* Dispatch boot_done() */ + case MISC_FUNC_BOOT_DONE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t cpu = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = misc_boot_done(caller_pt, cpu); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch otp_fuse_read() */ + case MISC_FUNC_OTP_FUSE_READ : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t word = ((uint32_t) RPC_U32(msg, 0U)); + uint32_t val = ((uint32_t) 0U); + + /* Call function */ + err = misc_otp_fuse_read(caller_pt, word, &val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(val); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch otp_fuse_write() */ + case MISC_FUNC_OTP_FUSE_WRITE : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t word = ((uint32_t) RPC_U32(msg, 0U)); + uint32_t val = ((uint32_t) RPC_U32(msg, 4U)); + + /* Call function */ + err = misc_otp_fuse_write(caller_pt, word, val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_temp() */ + case MISC_FUNC_SET_TEMP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_misc_temp_t temp = ((sc_misc_temp_t) RPC_U8(msg, 4U)); + int16_t celsius = ((int16_t) RPC_I16(msg, 2U)); + int8_t tenths = ((int8_t) RPC_I8(msg, 5U)); + + /* Call function */ + err = misc_set_temp(caller_pt, resource, temp, celsius, tenths); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_temp() */ + case MISC_FUNC_GET_TEMP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_misc_temp_t temp = ((sc_misc_temp_t) RPC_U8(msg, 2U)); + int16_t celsius = ((int16_t) 0U); + int8_t tenths = ((int8_t) 0U); + + /* Call function */ + err = misc_get_temp(caller_pt, resource, temp, &celsius, + &tenths); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_I16(msg, 0U) = I16(celsius); + RPC_I8(msg, 2U) = I8(tenths); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_boot_dev() */ + case MISC_FUNC_GET_BOOT_DEV : + { + /* Declare return and parameters */ + sc_rsrc_t dev = ((sc_rsrc_t) 0U); + + /* Call function */ + misc_get_boot_dev(caller_pt, &dev); + + /* Copy in return parameters */ + RPC_U16(msg, 0U) = U16(dev); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_boot_type() */ + case MISC_FUNC_GET_BOOT_TYPE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_misc_bt_t type = ((sc_misc_bt_t) 0U); + + /* Call function */ + err = misc_get_boot_type(caller_pt, &type); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(type); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_boot_container() */ + case MISC_FUNC_GET_BOOT_CONTAINER : + { + /* Declare return and parameters */ + sc_err_t result; + uint8_t idx = ((uint8_t) 0U); + + /* Call function */ + err = misc_get_boot_container(caller_pt, &idx); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(idx); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_button_status() */ + case MISC_FUNC_GET_BUTTON_STATUS : + { + /* Declare return and parameters */ + sc_bool_t status = SC_FALSE; + + /* Call function */ + misc_get_button_status(caller_pt, &status); + + /* Copy in return parameters */ + RPC_U8(msg, 0U) = B2U8(status); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch rompatch_checksum() */ + case MISC_FUNC_ROMPATCH_CHECKSUM : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t checksum = ((uint32_t) 0U); + + /* Call function */ + err = misc_rompatch_checksum(caller_pt, &checksum); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(checksum); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch board_ioctl() */ + case MISC_FUNC_BOARD_IOCTL : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t parm1 = ((uint32_t) RPC_U32(msg, 0U)); + uint32_t parm2 = ((uint32_t) RPC_U32(msg, 4U)); + uint32_t parm3 = ((uint32_t) RPC_U32(msg, 8U)); + + /* Call function */ + err = misc_board_ioctl(mu, &parm1, &parm2, &parm3); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(parm1); + RPC_U32(msg, 4U) = U32(parm2); + RPC_U32(msg, 8U) = U32(parm3); + RPC_SIZE(msg) = 4U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=misc, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=misc, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/misc/svc.c b/platform/svc/misc/svc.c new file mode 100755 index 0000000..0e087ed --- /dev/null +++ b/platform/svc/misc/svc.c @@ -0,0 +1,776 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/misc/svc.c + * + * File containing the implementation of the System Controller (SC) + * Miscellaneous (MISC) function. + * + * @addtogroup MISC_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "main/build_info.h" +#include "svc/misc/svc.h" +#include "svc/rm/svc.h" +#include "ss/inf/inf.h" +#include "drivers/analog/fsl_analog.h" +#include "drivers/otp/fsl_otp.h" + +/* Local Defines */ + +/*! Number of CPU waits */ +#define NUM_WAIT_CPU 2 + +/* Local Types */ + +/*! + * This type is used to store dynamic info needed to track partition + * specific data for the watchdog service. + */ +typedef struct +{ + sc_misc_dma_group_t max_dma_group : SC_MISC_DMA_GRP_W; +} misc_part_data_t; + +/* Local Functions */ + +/* Local Variables */ + +/*! State of CPU waits */ +static volatile sc_bool_t cpu_wait[NUM_WAIT_CPU]; + +/*! + * @name Local Variables (not initialized) + * + * @{ + */ +static misc_part_data_t misc_part_data[SC_RM_NUM_PARTITION]; +/** @} */ + +/*--------------------------------------------------------------------------*/ +/* Init the power management service */ +/*--------------------------------------------------------------------------*/ +void misc_init(sc_bool_t api_phase) +{ + if (api_phase != SC_FALSE) + { + sc_rm_pt_t pt; + + /* Init partition data */ + for (pt = 0; pt < SC_RM_NUM_PARTITION; pt++) + { + misc_part_data[pt].max_dma_group = SC_MISC_DMA_GRP_MAX; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set a miscellaneous control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_set_control(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_sub_t ss; + ss_idx_t ss_idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check parameters */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + + if (ss > SC_SUBSYS_LAST) + { + /* Handle board */ + err = board_set_control(resource, ss_idx, idx, ctrl, val); + } + else + { + /* Set control value */ + err = ss_set_control(idx, ctrl, val); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get a miscellaneous control value */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_get_control(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_sub_t ss; + ss_idx_t ss_idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + + if (ss > SC_SUBSYS_LAST) + { + /* Handle board */ + err = board_get_control(resource, ss_idx, idx, ctrl, val); + } + else + { + /* Get control value */ + err = ss_get_control(idx, ctrl, val); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the ARI translation for PCIe/SATA resources */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_set_ari(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rsrc_t resource_mst, uint16_t ari, sc_bool_t enable) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rm_idx_t midx = 0; + sc_sub_t ss; + ss_idx_t ss_idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_RSRC(resource_mst, midx); + + /* Check parameters */ + ACCESS_ALLOWED(caller_pt, idx); + ACCESS_ALLOWED(caller_pt, midx); + + if (err == SC_ERR_NONE) + { + uint32_t val; + + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(midx, &ss, &ss_idx); + + /* Set using the control interface */ + val = U32(ari); + if (enable != SC_FALSE) + { + val |= BIT(31); + } + + err = ss_set_control(idx, ss_idx, val); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the max DMA channel priority group for a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_set_max_dma_group(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_misc_dma_group_t max) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + ASRT_ERR(rm_is_partition_used(pt), SC_ERR_PARM); + ASRT_ERR(max <= misc_part_data[caller_pt].max_dma_group, SC_ERR_PARM); + ASRT_ERR(rm_is_parent(caller_pt, pt), SC_ERR_NOACCESS); + + if (err == SC_ERR_NONE) + { + /* Set max */ + misc_part_data[pt].max_dma_group = max; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure priority group for a DMA channel */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_set_dma_group(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_dma_group_t group) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check parameters */ + ACCESS_ALLOWED(caller_pt, idx); + ASRT_ERR(group <= misc_part_data[caller_pt].max_dma_group, SC_ERR_PARM); + + if (err == SC_ERR_NONE) + { + /* Set using the control interface */ + err = ss_set_control(idx, SC_C_PRIORITY_GROUP, group); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Start/stop emulation waveform capture */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_waveform_capture(sc_rm_pt_t caller_pt, sc_bool_t enable) +{ + #if defined(EMUL) && !defined(SIMU) + if (enable != SC_FALSE) + { + SystemEventTrigger(SC_ENV_TRIG_DUMP); + } + else + { + SystemEventTrigger(SC_ENV_TRIG_KILL); + } + + return SC_ERR_NONE; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Report boot status */ +/*--------------------------------------------------------------------------*/ +void misc_boot_status(sc_rm_pt_t caller_pt, sc_misc_boot_status_t status) +{ + sc_err_t err = SC_ERR_NONE; + + misc_print(3, "misc_boot_status(%d, %d)\n", caller_pt, status); + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + switch (status) + { + /* Success */ + case SC_MISC_BOOT_STATUS_SUCCESS : + { + misc_print(4, " boot success from %d\n", caller_pt); + pm_set_booted(caller_pt, SC_TRUE); + break; + } + /* Security issue (bad authentication) */ + case SC_MISC_BOOT_STATUS_SECURITY: + { + error_print(" boot security violation from %d\n", caller_pt); + pm_set_booted(caller_pt, SC_FALSE); + break; + } + /* Unknown */ + default : + { + misc_print(4, " unknown boot reason from %d\n", caller_pt); + pm_set_booted(caller_pt, SC_FALSE); + break; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Exit early boot */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_boot_done(sc_rm_pt_t caller_pt, sc_rsrc_t cpu) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx; + + misc_print(3, "misc_boot_done(%d, %d)\n", caller_pt, cpu); + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(cpu, idx); + + /* Check parameters */ + ASRT_ERR(rm_is_ridx_owned(caller_pt, idx), SC_ERR_NOACCESS); + + if (err == SC_ERR_NONE) + { + /* Calculate CPU index */ + if (cpu == SC_R_MCU_0_PID0) + { + cpu_wait[0U] = SC_TRUE; + } + else if (cpu == SC_R_MCU_1_PID0) + { + cpu_wait[1U] = SC_TRUE; + } + else + { + err = SC_ERR_PARM; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Wait for CPU boot to be done */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_boot_done_wait(sc_rsrc_t cpu) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx; + + misc_print(3, "misc_boot_done_wait(%d)\n", cpu); + + /* Calculate CPU index */ + if (cpu == SC_R_MCU_0_PID0) + { + idx = 0U; + } + else if (cpu == SC_R_MCU_1_PID0) + { + idx = 1U; + } + else + { + err = SC_ERR_PARM; + } + + if (err == SC_ERR_NONE) + { + /* Wait for CPU to finish */ + while (cpu_wait[idx] == SC_FALSE) + { + ; /* Intentional empty while */ + } + + /* Clear flag */ + cpu_wait[idx]= SC_FALSE; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Output a debug character */ +/*--------------------------------------------------------------------------*/ +void misc_debug_out(sc_rm_pt_t caller_pt, uint8_t ch) +{ + always_print("%c", ch); +} + +/*--------------------------------------------------------------------------*/ +/* OTP MISC read fuse */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_otp_fuse_read(sc_rm_pt_t caller_pt, uint32_t word, + uint32_t *val) +{ + #ifndef NO_DEVICE_ACCESS + return (OTP_Get_Fuse(word, val)); + #else + return SC_ERR_NONE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* OTP MISC write fuse */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_otp_fuse_write(sc_rm_pt_t caller_pt, uint32_t word, + uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check access permissions */ + SYSTEM(caller_pt); + + if (err == SC_ERR_NONE) + { + #ifndef NO_DEVICE_ACCESS + err = OTP_Write(OTP, word, &val); + #endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Return temp sensor availabilty */ +/*--------------------------------------------------------------------------*/ +sc_bool_t misc_has_temp(sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0; + sc_sub_t ss; + ss_idx_t ss_idx; + uint32_t val; + + /* Bounds check */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + + if (ss > SC_SUBSYS_LAST) + { + /* Handle board */ + rtn = (board_get_control(resource, ss_idx, idx, SC_C_TEMP, &val) + == SC_ERR_NONE); + } + else + { + /* Call subsystem interface */ + rtn = ss_temp_sensor(idx); + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set a temp sensor alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_set_temp(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t celsius, int8_t tenths) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + uint32_t val = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check parameters */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + /* Convert temp */ + if ((resource == SC_R_PMIC_0) || (resource == SC_R_PMIC_1) + || (resource == SC_R_PMIC_2)) + { + val = U32(celsius); + } + else + { + sc_sub_t ss = 0; + ss_idx_t ss_idx = 0; + + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + ANA_Temp2Val(sc_ss_info[ss].dsc, celsius, tenths, &val); + } + + /* Set temp */ + switch (temp) + { + case SC_MISC_TEMP : + err = misc_set_control(caller_pt, resource, SC_C_TEMP, + val); + break; + case SC_MISC_TEMP_HIGH : + err = misc_set_control(caller_pt, resource, SC_C_TEMP_HI, + val); + break; + case SC_MISC_TEMP_LOW : + err = misc_set_control(caller_pt, resource, SC_C_TEMP_LOW, + val); + break; + default : + err = SC_ERR_PARM; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get a temp sensor value */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_get_temp(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t *celsius, int8_t *tenths) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + uint32_t val; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Get temp */ + if (err == SC_ERR_NONE) + { + switch (temp) + { + /* Sensor temp */ + case SC_MISC_TEMP : + err = misc_get_control(caller_pt, resource, SC_C_TEMP, + &val); + break; + /* High temp alarm */ + case SC_MISC_TEMP_HIGH : + err = misc_get_control(caller_pt, resource, SC_C_TEMP_HI, + &val); + break; + /* Low temp alarm */ + case SC_MISC_TEMP_LOW : + err = misc_get_control(caller_pt, resource, SC_C_TEMP_LOW, + &val); + break; + /* Bad control */ + default : + err = SC_ERR_PARM; + break; + } + } + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Convert temp */ + if ((resource == SC_R_PMIC_0) || (resource == SC_R_PMIC_1) + || (resource == SC_R_PMIC_2)) + { + *celsius = I16(val); + *tenths = 0; + } + else + { + sc_sub_t ss = 0; + ss_idx_t ss_idx = 0; + + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + ANA_Val2Temp(sc_ss_info[ss].dsc, val, celsius, tenths); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Return SCFW build info */ +/*--------------------------------------------------------------------------*/ +void misc_build_info(sc_rm_pt_t caller_pt, uint32_t *build, + uint32_t *commit) +{ + /* Return info */ + *build = SCFW_BUILD; + *commit = SCFW_COMMIT; +} + +/*--------------------------------------------------------------------------*/ +/* Return unique ID */ +/*--------------------------------------------------------------------------*/ +void misc_unique_id(sc_rm_pt_t caller_pt, uint32_t *id_l, + uint32_t *id_h) +{ + *id_l = OTP_UNIQUE_ID_L; + *id_h = OTP_UNIQUE_ID_H; +} + +/*--------------------------------------------------------------------------*/ +/* Return boot device */ +/*--------------------------------------------------------------------------*/ +void misc_get_boot_dev(sc_rm_pt_t caller_pt, sc_rsrc_t *dev) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + *dev = boot_get_dev(caller_pt, SC_FALSE); + } +} + +/*--------------------------------------------------------------------------*/ +/* Return boot type */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_get_boot_type(sc_rm_pt_t caller_pt, sc_misc_bt_t *type) +{ + sc_err_t err; + sc_bt_dev_type_t dev_type; + uint8_t inst; + sc_bt_type_t bt_type; + + /* Get boot device */ + err = boot_get_boot_dev(&dev_type, &inst, &bt_type); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Translate ROM type */ + switch (bt_type) + { + case SC_BT_TYPE_PRIMARY : + *type = SC_MISC_BT_PRIMARY; + break; + case SC_BT_TYPE_RECOVERY: + *type = SC_MISC_BT_RECOVERY; + break; + case SC_BT_TYPE_SECONDARY: + *type = SC_MISC_BT_SECONDARY; + break; + case SC_BT_TYPE_SERIAL: + *type = SC_MISC_BT_SERIAL; + break; + /* Not found */ + default : + err = SC_ERR_UNAVAILABLE; + break; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Return the boot container index */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_get_boot_container(sc_rm_pt_t caller_pt, uint8_t *idx) +{ + return boot_get_container_idx(idx); +} + +/*--------------------------------------------------------------------------*/ +/* Return the current status of the ON/OFF button */ +/*--------------------------------------------------------------------------*/ +void misc_get_button_status(sc_rm_pt_t caller_pt, sc_bool_t *status) +{ + *status = board_get_button_status(); +} + +/*--------------------------------------------------------------------------*/ +/* Return the ROM patch checksum */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_rompatch_checksum(sc_rm_pt_t caller_pt, uint32_t *checksum) +{ + soc_rompatch_checksum(checksum, OTP_ROM_PATCH_SIZE + + OTP_V2X_PATCH_SIZE); + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Call board IOCTL */ +/*--------------------------------------------------------------------------*/ +sc_err_t misc_board_ioctl(sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t caller_pt; + + err = rm_get_resource_owner(SC_PT, mu, &caller_pt); + + if (err == SC_ERR_NONE) + { + err = board_ioctl(caller_pt, mu, parm1, parm2, parm3); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Return API version info */ +/*--------------------------------------------------------------------------*/ +void misc_api_ver(sc_rm_pt_t caller_pt, uint16_t *cl_maj, + uint16_t *cl_min, uint16_t *sv_maj, uint16_t *sv_min) +{ + *cl_maj = 0U; + *cl_min = 0U; + *sv_maj = SCFW_API_VERSION_MAJOR; + *sv_min = SCFW_API_VERSION_MINOR; +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Dump MISC state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) && defined(DEBUG_MISC) + void misc_dump(sc_rm_pt_t pt) + { + sc_err_t err = SC_ERR_NONE; + + USED_PT(pt); + + if ((debug != SC_FALSE) && (err == SC_ERR_NONE)) + { + /* Dump data */ + misc_print(2, " Partition: %u\n", pt); + misc_print(2, " Max DMA priority group: %u\n", + misc_part_data[pt].max_dma_group); + } + } +#endif + +/** @} */ + diff --git a/platform/svc/misc/svc.h b/platform/svc/misc/svc.h new file mode 100755 index 0000000..50bca96 --- /dev/null +++ b/platform/svc/misc/svc.h @@ -0,0 +1,288 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/misc/svc.h + * + * Header file containing the API for the System Controller (SC) + * Miscellaneous (MISC) function. + * + * @addtogroup MISC_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_MISC_SVC_H +#define SC_MISC_SVC_H + +/* Includes */ + +#include "svc/misc/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/*! + * Internal SC function to initializes the MISC service. + * + * @param[in] api_phase init phase + * + * Initializes the API if /a api_phase = SC_TRUE, otherwise initializes the HW + * managed by the MISC service. API must be initialized before anything else is + * done with the service. + */ +void misc_init(sc_bool_t api_phase); + +/*! + * Internal SC function to set a miscellaneous control value. + * + * @see sc_misc_set_control(). + */ +sc_err_t misc_set_control(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t val); + +/*! + * Internal SC function to get a miscellaneous control value. + * + * @see sc_misc_get_control(). + */ +sc_err_t misc_get_control(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_ctrl_t ctrl, uint32_t *val); + +/*! + * Internal SC function to configure the ARI translation for + * PCIe/SATA resources. + * + * @see sc_misc_set_ari(). + */ +sc_err_t misc_set_ari(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rsrc_t resource_mst, uint16_t ari, sc_bool_t enable); + +/*! + * Internal SC function to configure max DMA channel priority + * group for a partition. + * + * @see sc_misc_set_max_dma_group(). + */ +sc_err_t misc_set_max_dma_group(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_misc_dma_group_t max); + +/*! + * Internal SC function to configure the priority group for a + * DMA channel. + * + * @see sc_misc_set_dma_group(). + */ +sc_err_t misc_set_dma_group(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_dma_group_t group); + +/*! + * Internal SC function to report boot status. + * + * @see sc_misc_boot_status(). + */ +void misc_boot_status(sc_rm_pt_t caller_pt, sc_misc_boot_status_t status); + +/*! + * Internal SC function to report a CPU has finished initialization. + * + * @see sc_misc_boot_done(). + */ +sc_err_t misc_boot_done(sc_rm_pt_t caller_pt, sc_rsrc_t cpu); + +/*! + * Internal SC function to wait for a CPU to be done booting. + * + * @param[in] cpu CPU to wait for + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t misc_boot_done_wait(sc_rsrc_t cpu); + +/*! + * Internal SC function to start/stop emulation waveform capture. + * + * @see sc_misc_waveform_capture(). + */ +sc_err_t misc_waveform_capture(sc_rm_pt_t caller_pt, sc_bool_t enable); + +/*! + * Internal SC function to output a debug charcter. + * + * @see sc_misc_debug_out(). + */ +void misc_debug_out(sc_rm_pt_t caller_pt, uint8_t ch); + +/*! + * Internal SC function to read otp fuse word + * + * @see sc_misc_otp_fuse_read(). + */ +sc_err_t misc_otp_fuse_read(sc_rm_pt_t caller_pt, + uint32_t word, uint32_t *val); + +/*! + * Internal SC function to write otp fuse word + * + * @see sc_misc_otp_fuse_write(). + */ +sc_err_t misc_otp_fuse_write(sc_rm_pt_t caller_pt, + uint32_t word, uint32_t val); + +/*! + * This function reports if a resource has a temp sensor. + * + * @param[in] resource resource to querry + * + * @return Returns SC_TRUE if the subsystem containing + * /a resource has a temp sensor. + */ +sc_bool_t misc_has_temp(sc_rsrc_t resource); + +/*! + * Internal SC function to set a temp sensor alarm + * + * @see sc_misc_set_temp(). + */ +sc_err_t misc_set_temp(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t celsius, int8_t tenths); + +/*! + * Internal SC function to get a temp sensor value + * + * @see sc_misc_get_temp(). + */ +sc_err_t misc_get_temp(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_misc_temp_t temp, int16_t *celsius, int8_t *tenths); + +/*! + * Internal SC function to return SCFW build info + * + * @see sc_misc_build_info(). + */ +void misc_build_info(sc_rm_pt_t caller_pt, uint32_t *build, + uint32_t *commit); + +/*! + * Internal SC function to return the device unique ID + * + * @see sc_misc_unique_id(). + */ +void misc_unique_id(sc_rm_pt_t caller_pt, uint32_t *id_l, + uint32_t *id_h); + +/*! + * Internal SC function to return the boot device + * + * @see sc_misc_get_boot_dev(). + */ +void misc_get_boot_dev(sc_rm_pt_t caller_pt, sc_rsrc_t *dev); + +/*! + * Internal SC function to return the boot type + * + * @see sc_misc_get_boot_type(). + */ +sc_err_t misc_get_boot_type(sc_rm_pt_t caller_pt, sc_misc_bt_t *type); + +/*! + * Internal SC function to return the boot container index + * + * @see sc_misc_get_boot_containere(). + */ +sc_err_t misc_get_boot_container(sc_rm_pt_t caller_pt, uint8_t *idx); + +/*! + * Internal SC function to return the current status of the ON/OFF button + * + * @see sc_misc_get_button_status(). + */ +void misc_get_button_status(sc_rm_pt_t caller_pt, sc_bool_t *status); + +/*! + * Internal SC function to return the ROM patch checksum + * + * @see sc_misc_rompatch_checksum(). + */ +sc_err_t misc_rompatch_checksum(sc_rm_pt_t caller_pt, uint32_t *checksum); + +/*! + * Internal SC function to call board IOCTL + * + * @see sc_misc_board_ioctl(). + */ +sc_err_t misc_board_ioctl(sc_rsrc_t mu, uint32_t *parm1, + uint32_t *parm2, uint32_t *parm3); + +/*! + * Internal SC function to return API version info + * + * @see sc_misc_api_ver(). + */ +void misc_api_ver(sc_rm_pt_t caller_pt, uint16_t *cl_maj, + uint16_t *cl_min, uint16_t *sv_maj, uint16_t *sv_min); + +/** @} */ + +#if defined(DEBUG) && defined(DEBUG_MISC) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal state of the MISC service. + * + * @param[in] pt partition to dump + */ + void misc_dump(sc_rm_pt_t pt); + + /** @} */ +#endif + + +#endif /* SC_MISC_SVC_H */ + +/** @} */ + diff --git a/platform/svc/pad/Makefile b/platform/svc/pad/Makefile new file mode 100755 index 0000000..bc6affe --- /dev/null +++ b/platform/svc/pad/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/pad/svc.o + +RPCS += $(OUT)/svc/pad/rpc_srv.o + +RPCL += $(OUT)/svc/pad/rpc_clnt.o + +RPCH += $(SRC)/svc/pad/rpc.h + +RPCC += $(SRC)/svc/pad/rpc_srv.c \ + $(SRC)/svc/pad/rpc_clnt.c \ + $(SRC)/svc/pad/rpc_xlate.c + +RPCHDR += $(SRC)/svc/pad/rpc_header.h + +DIRS += $(OUT)/svc/pad + diff --git a/platform/svc/pad/api.h b/platform/svc/pad/api.h new file mode 100755 index 0000000..344da2b --- /dev/null +++ b/platform/svc/pad/api.h @@ -0,0 +1,640 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pad/api.h + * + * Header file containing the public API for the System Controller (SC) + * Pad Control (PAD) function. + * + * @addtogroup PAD_SVC PAD: Pad Service + * + * @brief Module for the Pad Control (PAD) service. + * + * @details + * + * Pad configuration is managed by SC firmware. The pad configuration + * features supported by the SC firmware include: + * + * - Configuring the mux, input/output connection, and low-power isolation + mode. + * - Configuring the technology-specific pad setting such as drive strength, + * pullup/pulldown, etc. + * - Configuring compensation for pad groups with dual voltage capability. + * + * Pad functions fall into one of three categories. Generic functions are + * common to all SoCs and all process technologies. SoC functions are raw + * low-level functions. Technology-specific functions are specific to the + * process technology. + * + * The list of pads is SoC specific. Refer to the SoC [Pad List](@ref PADS) + * for valid pad values. Note that all pads exist on a die but may or + * may not be brought out by the specific package. Mapping of pads to + * package pins/balls is documented in the associated Data Sheet. Some pads + * may not be brought out because the part (die+package) is defeatured and + * some pads may connect to the substrate in the package. + * + * Some pads (SC_P_COMP_*) that can be specified are not individual pads + * but are in fact pad groups. These groups have additional configuration + * that can be done using the sc_pad_set_gp_28fdsoi_comp() function. More + * info on these can be found in the associated Reference Manual. + * + * Pads are managed as a resource by the Resource Manager (RM). They have + * assigned owners and only the owners can configure the pads. Some of the + * pads are reserved for use by the SCFW itself and this can be overridden + * with the implementation of board_config_sc(). Additionally, pads may + * be assigned to various other partitions via the implementation of + * board_system_config(). + * + * Note muxing two input pads to the same IP functional signal will + * result in undefined behavior. + * + * @includedoc pad/details.dox + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PAD_API_H +#define SC_PAD_API_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_PAD_MUX_W 3U /*!< Width of mux parameter */ +/** @} */ + +/*! + * @name Defines for sc_pad_config_t + */ +/** @{ */ +#define SC_PAD_CONFIG_NORMAL 0U /*!< Normal */ +#define SC_PAD_CONFIG_OD 1U /*!< Open Drain */ +#define SC_PAD_CONFIG_OD_IN 2U /*!< Open Drain and input */ +#define SC_PAD_CONFIG_OUT_IN 3U /*!< Output and input */ +/** @} */ + +/*! + * @name Defines for sc_pad_iso_t + */ +/** @{ */ +#define SC_PAD_ISO_OFF 0U /*!< ISO latch is transparent */ +#define SC_PAD_ISO_EARLY 1U /*!< Follow EARLY_ISO */ +#define SC_PAD_ISO_LATE 2U /*!< Follow LATE_ISO */ +#define SC_PAD_ISO_ON 3U /*!< ISO latched data is held */ +/** @} */ + +/*! + * @name Defines for sc_pad_wakeup_t + */ +/** @{ */ +#define SC_PAD_WAKEUP_OFF 0U /*!< Off */ +#define SC_PAD_WAKEUP_CLEAR 1U /*!< Clears pending flag */ +#define SC_PAD_WAKEUP_LOW_LVL 4U /*!< Low level */ +#define SC_PAD_WAKEUP_FALL_EDGE 5U /*!< Falling edge */ +#define SC_PAD_WAKEUP_RISE_EDGE 6U /*!< Rising edge */ +#define SC_PAD_WAKEUP_HIGH_LVL 7U /*!< High-level */ +/** @} */ + +/*! + * @name Defines for sc_pad_28fdsoi_dse_t + */ +/** @{ */ +#define SC_PAD_28FDSOI_DSE_18V_1MA 0U /*!< Drive strength of 1mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_2MA 1U /*!< Drive strength of 2mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_4MA 2U /*!< Drive strength of 4mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_6MA 3U /*!< Drive strength of 6mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_8MA 4U /*!< Drive strength of 8mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_10MA 5U /*!< Drive strength of 10mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_12MA 6U /*!< Drive strength of 12mA for 1.8v */ +#define SC_PAD_28FDSOI_DSE_18V_HS 7U /*!< High-speed drive strength for 1.8v */ +#define SC_PAD_28FDSOI_DSE_33V_2MA 0U /*!< Drive strength of 2mA for 3.3v */ +#define SC_PAD_28FDSOI_DSE_33V_4MA 1U /*!< Drive strength of 4mA for 3.3v */ +#define SC_PAD_28FDSOI_DSE_33V_8MA 2U /*!< Drive strength of 8mA for 3.3v */ +#define SC_PAD_28FDSOI_DSE_33V_12MA 3U /*!< Drive strength of 12mA for 3.3v */ +#define SC_PAD_28FDSOI_DSE_DV_HIGH 0U /*!< High drive strength for dual volt */ +#define SC_PAD_28FDSOI_DSE_DV_LOW 1U /*!< Low drive strength for dual volt */ +/** @} */ + +/*! + * @name Defines for sc_pad_28fdsoi_ps_t + */ +/** @{ */ +#define SC_PAD_28FDSOI_PS_KEEPER 0U /*!< Bus-keeper (only valid for 1.8v) */ +#define SC_PAD_28FDSOI_PS_PU 1U /*!< Pull-up */ +#define SC_PAD_28FDSOI_PS_PD 2U /*!< Pull-down */ +#define SC_PAD_28FDSOI_PS_NONE 3U /*!< No pull (disabled) */ +/** @} */ + +/*! + * @name Defines for sc_pad_28fdsoi_pus_t + */ +/** @{ */ +#define SC_PAD_28FDSOI_PUS_30K_PD 0U /*!< 30K pull-down */ +#define SC_PAD_28FDSOI_PUS_100K_PU 1U /*!< 100K pull-up */ +#define SC_PAD_28FDSOI_PUS_3K_PU 2U /*!< 3K pull-up */ +#define SC_PAD_28FDSOI_PUS_30K_PU 3U /*!< 30K pull-up */ +/** @} */ + +/* Types */ + +/*! + * This type is used to declare a pad config. It determines how the + * output data is driven, pull-up is controlled, and input signal is + * connected. Normal and OD are typical and only connect the input + * when the output is not driven. The IN options are less common and + * force an input connection even when driving the output. + */ +typedef uint8_t sc_pad_config_t; + +/*! + * This type is used to declare a pad low-power isolation config. + * ISO_LATE is the most common setting. ISO_EARLY is only used when + * an output pad is directly determined by another input pad. The + * other two are only used when SW wants to directly control isolation. + */ +typedef uint8_t sc_pad_iso_t; + +/*! + * This type is used to declare a wakeup mode of a pad. + */ +typedef uint8_t sc_pad_wakeup_t; + +/*! + * This type is used to declare a drive strength. Note it is specific + * to 28FDSOI. Also note that valid values depend on the pad type. + */ +typedef uint8_t sc_pad_28fdsoi_dse_t; + +/*! + * This type is used to declare a pull select. Note it is specific + * to 28FDSOI. + */ +typedef uint8_t sc_pad_28fdsoi_ps_t; + +/*! + * This type is used to declare a pull-up select. Note it is specific + * to 28FDSOI HSIC pads. + */ +typedef uint8_t sc_pad_28fdsoi_pus_t; + +/* Functions */ + +/*! + * @name Generic Functions + * @{ + */ + +/*! + * This function configures the mux settings for a pad. This includes + * the signal mux, pad config, and low-power isolation mode. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] mux mux setting + * @param[in] config pad config + * @param[in] iso low-power isolation mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Note muxing two input pads to the same IP functional signal will + * result in undefined behavior. + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_MUX(UI16 pad, UI8 mux, UI8 config, UI8 iso) #1 */ +sc_err_t sc_pad_set_mux(sc_ipc_t ipc, sc_pad_t pad, + uint8_t mux, sc_pad_config_t config, sc_pad_iso_t iso); + +/*! + * This function gets the mux settings for a pad. This includes + * the signal mux, pad config, and low-power isolation mode. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] mux pointer to return mux setting + * @param[out] config pointer to return pad config + * @param[out] iso pointer to return low-power isolation mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_MUX(UI16 pad, UO8 mux, UO8 config, UO8 iso) #6 */ +sc_err_t sc_pad_get_mux(sc_ipc_t ipc, sc_pad_t pad, + uint8_t *mux, sc_pad_config_t *config, sc_pad_iso_t *iso); + +/*! + * This function configures the general purpose pad control. This + * is technology dependent and includes things like drive strength, + * slew rate, pull up/down, etc. Refer to the SoC Reference Manual + * for bit field details. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] ctrl control value to set + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_GP(UI16 pad, UI32 ctrl) #2 */ +sc_err_t sc_pad_set_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t ctrl); + +/*! + * This function gets the general purpose pad control. This + * is technology dependent and includes things like drive strength, + * slew rate, pull up/down, etc. Refer to the SoC Reference Manual + * for bit field details. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] ctrl pointer to return control value + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_GP(UI16 pad, UO32 ctrl) #7 */ +sc_err_t sc_pad_get_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t *ctrl); + +/*! + * This function configures the wakeup mode of the pad. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] wakeup wakeup to set + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_WAKEUP(UI16 pad, UI8 wakeup) #4 */ +sc_err_t sc_pad_set_wakeup(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_wakeup_t wakeup); + +/*! + * This function gets the wakeup mode of a pad. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] wakeup pointer to return wakeup + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_WAKEUP(UI16 pad, UO8 wakeup) #9 */ +sc_err_t sc_pad_get_wakeup(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_wakeup_t *wakeup); + +/*! + * This function configures a pad. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] mux mux setting + * @param[in] config pad config + * @param[in] iso low-power isolation mode + * @param[in] ctrl control value + * @param[in] wakeup wakeup to set + * + * @see sc_pad_set_mux(). + * @see sc_pad_set_gp(). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Note muxing two input pads to the same IP functional signal will + * result in undefined behavior. + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_ALL(UI16 pad, UI8 mux, UI8 config, UI8 iso, UI32 ctrl, UI8 wakeup) #5 */ +sc_err_t sc_pad_set_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso, uint32_t ctrl, + sc_pad_wakeup_t wakeup); + +/*! + * This function gets a pad's config. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] mux pointer to return mux setting + * @param[out] config pointer to return pad config + * @param[out] iso pointer to return low-power isolation mode + * @param[out] ctrl pointer to return control value + * @param[out] wakeup pointer to return wakeup to set + * + * @see sc_pad_set_mux(). + * @see sc_pad_set_gp(). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_ALL(UI16 pad, UO8 mux, UO8 config, UO8 iso, UO32 ctrl, UO8 wakeup) #10 */ +sc_err_t sc_pad_get_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso, uint32_t *ctrl, + sc_pad_wakeup_t *wakeup); + +/** @} */ + +/*! + * @name SoC Specific Functions + * @{ + */ + +/*! + * This function configures the settings for a pad. This setting is SoC + * specific. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] val value to set + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET(UI16 pad, UI32 val) #15 */ +sc_err_t sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, uint32_t val); + +/*! + * This function gets the settings for a pad. This setting is SoC + * specific. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] val pointer to return setting + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET(UI16 pad, UO32 val) #16 */ +sc_err_t sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, uint32_t *val); + +/*! + * This function writes a configuration register. This setting is SoC + * specific. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] val value to set + * + * Use to configure various HSIC and NAND congiruation settings. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 CONFIG(UI16 pad, UI32 val) #17 */ +sc_err_t sc_pad_config(sc_ipc_t ipc, sc_pad_t pad, uint32_t val); + +/** @} */ + +/*! + * @name 28FDSIO Technology Specific Functions + * @{ + */ + +/*! + * This function configures the pad control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] dse drive strength + * @param[in] ps pull select + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_GP_28FDSOI(UI16 pad, UI8 dse, UI8 ps) #11 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_pad_28fdsoi_ps_t ps); + +/*! + * This function gets the pad control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] dse pointer to return drive strength + * @param[out] ps pointer to return pull select + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_GP_28FDSOI(UI16 pad, UO8 dse, UO8 ps) #12 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_pad_28fdsoi_ps_t *ps); + +/*! + * This function configures the pad control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] dse drive strength + * @param[in] hys hysteresis + * @param[in] pus pull-up select + * @param[in] pke pull keeper enable + * @param[in] pue pull-up enable + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 SET_GP_28FDSOI_HSIC(UI16 pad, UI8 dse, IB hys, UI8 pus, IB pke, IB pue) #3 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_bool_t hys, sc_pad_28fdsoi_pus_t pus, + sc_bool_t pke, sc_bool_t pue); + +/*! + * This function gets the pad control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] dse pointer to return drive strength + * @param[out] hys pointer to return hysteresis + * @param[out] pus pointer to return pull-up select + * @param[out] pke pointer to return pull keeper enable + * @param[out] pue pointer to return pull-up enable + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_GP_28FDSOI_HSIC(UI16 pad, UO8 dse, OB hys, UO8 pus, OB pke, OB pue) #8 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_bool_t *hys, sc_pad_28fdsoi_pus_t *pus, + sc_bool_t *pke, sc_bool_t *pue); + +/*! + * This function configures the compensation control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to configure + * @param[in] compen compensation/freeze mode + * @param[in] fastfrz fast freeze + * @param[in] rasrcp compensation code for PMOS + * @param[in] rasrcn compensation code for NMOS + * @param[in] nasrc_sel NASRC read select + * @param[in] psw_ovr 2.5v override + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + * + * Note \a psw_ovr is only applicable to pads supporting 2.5 volt + * operation (e.g. some Ethernet pads). + */ +/* IDL: E8 SET_GP_28FDSOI_COMP(UI16 pad, UI8 compen, IB fastfrz, UI8 rasrcp, UI8 rasrcn, IB nasrc_sel, IB psw_ovr) #13 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad, + uint8_t compen, sc_bool_t fastfrz, uint8_t rasrcp, uint8_t rasrcn, + sc_bool_t nasrc_sel, sc_bool_t psw_ovr); + +/*! + * This function gets the compensation control specific to 28FDSOI. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to query + * @param[out] compen pointer to return compensation/freeze mode + * @param[out] fastfrz pointer to return fast freeze + * @param[out] rasrcp pointer to return compensation code for PMOS + * @param[out] rasrcn pointer to return compensation code for NMOS + * @param[out] nasrc_sel pointer to return NASRC read select + * @param[out] compok pointer to return compensation status + * @param[out] nasrc pointer to return NASRCP/NASRCN + * @param[out] psw_ovr pointer to return the 2.5v override + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner, + * - SC_ERR_NOTFOUND if process not applicable + * + * Refer to the SoC [Pad List](@ref PADS) for valid pad values. + */ +/* IDL: E8 GET_GP_28FDSOI_COMP(UI16 pad, UO8 compen, OB fastfrz, UO8 rasrcp, UO8 rasrcn, OB nasrc_sel, OB compok, UO8 nasrc, OB psw_ovr) #14 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad, + uint8_t *compen, sc_bool_t *fastfrz, uint8_t *rasrcp, uint8_t *rasrcn, + sc_bool_t *nasrc_sel, sc_bool_t *compok, uint8_t *nasrc, sc_bool_t *psw_ovr); + +/** @} */ + +#endif /* SC_PAD_API_H */ + +/** @} */ + diff --git a/platform/svc/pad/rpc.h b/platform/svc/pad/rpc.h new file mode 100644 index 0000000..4105fd6 --- /dev/null +++ b/platform/svc/pad/rpc.h @@ -0,0 +1,96 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the PAD RPC implementation. + * + * @addtogroup PAD_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_PAD_RPC_H +#define SC_PAD_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC PAD function calls + */ +/** @{ */ +#define PAD_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define PAD_FUNC_SET_MUX 1U /*!< Index for sc_pad_set_mux() RPC call */ +#define PAD_FUNC_GET_MUX 6U /*!< Index for sc_pad_get_mux() RPC call */ +#define PAD_FUNC_SET_GP 2U /*!< Index for sc_pad_set_gp() RPC call */ +#define PAD_FUNC_GET_GP 7U /*!< Index for sc_pad_get_gp() RPC call */ +#define PAD_FUNC_SET_WAKEUP 4U /*!< Index for sc_pad_set_wakeup() RPC call */ +#define PAD_FUNC_GET_WAKEUP 9U /*!< Index for sc_pad_get_wakeup() RPC call */ +#define PAD_FUNC_SET_ALL 5U /*!< Index for sc_pad_set_all() RPC call */ +#define PAD_FUNC_GET_ALL 10U /*!< Index for sc_pad_get_all() RPC call */ +#define PAD_FUNC_SET 15U /*!< Index for sc_pad_set() RPC call */ +#define PAD_FUNC_GET 16U /*!< Index for sc_pad_get() RPC call */ +#define PAD_FUNC_CONFIG 17U /*!< Index for sc_pad_config() RPC call */ +#define PAD_FUNC_SET_GP_28FDSOI 11U /*!< Index for sc_pad_set_gp_28fdsoi() RPC call */ +#define PAD_FUNC_GET_GP_28FDSOI 12U /*!< Index for sc_pad_get_gp_28fdsoi() RPC call */ +#define PAD_FUNC_SET_GP_28FDSOI_HSIC 3U /*!< Index for sc_pad_set_gp_28fdsoi_hsic() RPC call */ +#define PAD_FUNC_GET_GP_28FDSOI_HSIC 8U /*!< Index for sc_pad_get_gp_28fdsoi_hsic() RPC call */ +#define PAD_FUNC_SET_GP_28FDSOI_COMP 13U /*!< Index for sc_pad_set_gp_28fdsoi_comp() RPC call */ +#define PAD_FUNC_GET_GP_28FDSOI_COMP 14U /*!< Index for sc_pad_get_gp_28fdsoi_comp() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming PAD RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void pad_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_PAD_RPC_H */ + +/** @} */ + diff --git a/platform/svc/pad/rpc_clnt.c b/platform/svc/pad/rpc_clnt.c new file mode 100644 index 0000000..0d645b5 --- /dev/null +++ b/platform/svc/pad/rpc_clnt.c @@ -0,0 +1,651 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the PAD service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup PAD_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/pad/api.h" +#include "../../main/rpc.h" +#include "svc/pad/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 SET_MUX(UI16 pad, UI8 mux, UI8 config, UI8 iso) #1 */ +sc_err_t sc_pad_set_mux(sc_ipc_t ipc, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_MUX); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(mux); + RPC_U8(&msg, 3U) = U8(config); + RPC_U8(&msg, 4U) = U8(iso); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_MUX(UI16 pad, UO8 mux, UO8 config, UO8 iso) #6 */ +sc_err_t sc_pad_get_mux(sc_ipc_t ipc, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_MUX); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mux != NULL) + { + *mux = (uint8_t) RPC_U8(&msg, 0U); + } + if (config != NULL) + { + *config = (sc_pad_config_t) RPC_U8(&msg, 1U); + } + if (iso != NULL) + { + *iso = (sc_pad_iso_t) RPC_U8(&msg, 2U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_GP(UI16 pad, UI32 ctrl) #2 */ +sc_err_t sc_pad_set_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t ctrl) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ctrl); + RPC_U16(&msg, 4U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_GP(UI16 pad, UO32 ctrl) #7 */ +sc_err_t sc_pad_get_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t *ctrl) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (ctrl != NULL) + { + *ctrl = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_WAKEUP(UI16 pad, UI8 wakeup) #4 */ +sc_err_t sc_pad_set_wakeup(sc_ipc_t ipc, sc_pad_t pad, sc_pad_wakeup_t wakeup) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_WAKEUP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(wakeup); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_WAKEUP(UI16 pad, UO8 wakeup) #9 */ +sc_err_t sc_pad_get_wakeup(sc_ipc_t ipc, sc_pad_t pad, sc_pad_wakeup_t *wakeup) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_WAKEUP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (wakeup != NULL) + { + *wakeup = (sc_pad_wakeup_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_ALL(UI16 pad, UI8 mux, UI8 config, UI8 iso, UI32 ctrl, UI8 wakeup) #5 */ +sc_err_t sc_pad_set_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso, uint32_t ctrl, + sc_pad_wakeup_t wakeup) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_ALL); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ctrl); + RPC_U16(&msg, 4U) = U16(pad); + RPC_U8(&msg, 6U) = U8(mux); + RPC_U8(&msg, 7U) = U8(config); + RPC_U8(&msg, 8U) = U8(iso); + RPC_U8(&msg, 9U) = U8(wakeup); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_ALL(UI16 pad, UO8 mux, UO8 config, UO8 iso, UO32 ctrl, UO8 wakeup) #10 */ +sc_err_t sc_pad_get_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso, uint32_t *ctrl, + sc_pad_wakeup_t *wakeup) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_ALL); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (ctrl != NULL) + { + *ctrl = (uint32_t) RPC_U32(&msg, 0U); + } + if (mux != NULL) + { + *mux = (uint8_t) RPC_U8(&msg, 4U); + } + if (config != NULL) + { + *config = (sc_pad_config_t) RPC_U8(&msg, 5U); + } + if (iso != NULL) + { + *iso = (sc_pad_iso_t) RPC_U8(&msg, 6U); + } + if (wakeup != NULL) + { + *wakeup = (sc_pad_wakeup_t) RPC_U8(&msg, 7U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET(UI16 pad, UI32 val) #15 */ +sc_err_t sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, uint32_t val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(val); + RPC_U16(&msg, 4U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET(UI16 pad, UO32 val) #16 */ +sc_err_t sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, uint32_t *val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (val != NULL) + { + *val = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 CONFIG(UI16 pad, UI32 val) #17 */ +sc_err_t sc_pad_config(sc_ipc_t ipc, sc_pad_t pad, uint32_t val) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_CONFIG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(val); + RPC_U16(&msg, 4U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_GP_28FDSOI(UI16 pad, UI8 dse, UI8 ps) #11 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_pad_28fdsoi_ps_t ps) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(dse); + RPC_U8(&msg, 3U) = U8(ps); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_GP_28FDSOI(UI16 pad, UO8 dse, UO8 ps) #12 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_pad_28fdsoi_ps_t *ps) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (dse != NULL) + { + *dse = (sc_pad_28fdsoi_dse_t) RPC_U8(&msg, 0U); + } + if (ps != NULL) + { + *ps = (sc_pad_28fdsoi_ps_t) RPC_U8(&msg, 1U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_GP_28FDSOI_HSIC(UI16 pad, UI8 dse, IB hys, UI8 pus, IB pke, IB pue) #3 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_bool_t hys, sc_pad_28fdsoi_pus_t pus, + sc_bool_t pke, sc_bool_t pue) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI_HSIC); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(dse); + RPC_U8(&msg, 3U) = U8(pus); + RPC_U8(&msg, 4U) = B2U8(hys); + RPC_U8(&msg, 5U) = B2U8(pke); + RPC_U8(&msg, 6U) = B2U8(pue); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_GP_28FDSOI_HSIC(UI16 pad, UO8 dse, OB hys, UO8 pus, OB pke, OB pue) #8 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_bool_t *hys, sc_pad_28fdsoi_pus_t *pus, + sc_bool_t *pke, sc_bool_t *pue) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI_HSIC); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (dse != NULL) + { + *dse = (sc_pad_28fdsoi_dse_t) RPC_U8(&msg, 0U); + } + if (pus != NULL) + { + *pus = (sc_pad_28fdsoi_pus_t) RPC_U8(&msg, 1U); + } + if (hys != NULL) + { + *hys = (sc_bool_t) U2B(RPC_U8(&msg, 2U)); + } + if (pke != NULL) + { + *pke = (sc_bool_t) U2B(RPC_U8(&msg, 3U)); + } + if (pue != NULL) + { + *pue = (sc_bool_t) U2B(RPC_U8(&msg, 4U)); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_GP_28FDSOI_COMP(UI16 pad, UI8 compen, IB fastfrz, UI8 rasrcp, UI8 rasrcn, IB nasrc_sel, IB psw_ovr) #13 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_set_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad, uint8_t compen, + sc_bool_t fastfrz, uint8_t rasrcp, uint8_t rasrcn, sc_bool_t nasrc_sel, + sc_bool_t psw_ovr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI_COMP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(compen); + RPC_U8(&msg, 3U) = U8(rasrcp); + RPC_U8(&msg, 4U) = U8(rasrcn); + RPC_U8(&msg, 5U) = B2U8(fastfrz); + RPC_U8(&msg, 6U) = B2U8(nasrc_sel); + RPC_U8(&msg, 7U) = B2U8(psw_ovr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_GP_28FDSOI_COMP(UI16 pad, UO8 compen, OB fastfrz, UO8 rasrcp, UO8 rasrcn, OB nasrc_sel, OB compok, UO8 nasrc, OB psw_ovr) #14 ^API_HAS_28FDSOI */ +sc_err_t sc_pad_get_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad, uint8_t *compen, + sc_bool_t *fastfrz, uint8_t *rasrcp, uint8_t *rasrcn, sc_bool_t *nasrc_sel, + sc_bool_t *compok, uint8_t *nasrc, sc_bool_t *psw_ovr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD); + RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI_COMP); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (compen != NULL) + { + *compen = (uint8_t) RPC_U8(&msg, 0U); + } + if (rasrcp != NULL) + { + *rasrcp = (uint8_t) RPC_U8(&msg, 1U); + } + if (rasrcn != NULL) + { + *rasrcn = (uint8_t) RPC_U8(&msg, 2U); + } + if (nasrc != NULL) + { + *nasrc = (uint8_t) RPC_U8(&msg, 3U); + } + if (fastfrz != NULL) + { + *fastfrz = (sc_bool_t) U2B(RPC_U8(&msg, 4U)); + } + if (nasrc_sel != NULL) + { + *nasrc_sel = (sc_bool_t) U2B(RPC_U8(&msg, 5U)); + } + if (compok != NULL) + { + *compok = (sc_bool_t) U2B(RPC_U8(&msg, 6U)); + } + if (psw_ovr != NULL) + { + *psw_ovr = (sc_bool_t) U2B(RPC_U8(&msg, 7U)); + } + + /* Return result */ + return err; +} + +/** @} */ + diff --git a/platform/svc/pad/rpc_srv.c b/platform/svc/pad/rpc_srv.c new file mode 100644 index 0000000..27aa4a8 --- /dev/null +++ b/platform/svc/pad/rpc_srv.c @@ -0,0 +1,476 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the PAD service. + * + * @addtogroup PAD_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/pad/svc.h" +#include "svc/pad/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void pad_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case PAD_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch set_mux() */ + case PAD_FUNC_SET_MUX : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint8_t mux = ((uint8_t) RPC_U8(msg, 2U)); + sc_pad_config_t config = ((sc_pad_config_t) RPC_U8(msg, 3U)); + sc_pad_iso_t iso = ((sc_pad_iso_t) RPC_U8(msg, 4U)); + + /* Call function */ + err = pad_set_mux(caller_pt, pad, mux, config, iso); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_mux() */ + case PAD_FUNC_GET_MUX : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint8_t mux = ((uint8_t) 0U); + sc_pad_config_t config = ((sc_pad_config_t) 0U); + sc_pad_iso_t iso = ((sc_pad_iso_t) 0U); + + /* Call function */ + err = pad_get_mux(caller_pt, pad, &mux, &config, &iso); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mux); + RPC_U8(msg, 1U) = U8(config); + RPC_U8(msg, 2U) = U8(iso); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_gp() */ + case PAD_FUNC_SET_GP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 4U)); + uint32_t ctrl = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = pad_set_gp(caller_pt, pad, ctrl); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_gp() */ + case PAD_FUNC_GET_GP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint32_t ctrl = ((uint32_t) 0U); + + /* Call function */ + err = pad_get_gp(caller_pt, pad, &ctrl); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(ctrl); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_wakeup() */ + case PAD_FUNC_SET_WAKEUP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_wakeup_t wakeup = ((sc_pad_wakeup_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = pad_set_wakeup(caller_pt, pad, wakeup); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_wakeup() */ + case PAD_FUNC_GET_WAKEUP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_wakeup_t wakeup = ((sc_pad_wakeup_t) 0U); + + /* Call function */ + err = pad_get_wakeup(caller_pt, pad, &wakeup); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(wakeup); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_all() */ + case PAD_FUNC_SET_ALL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 4U)); + uint8_t mux = ((uint8_t) RPC_U8(msg, 6U)); + sc_pad_config_t config = ((sc_pad_config_t) RPC_U8(msg, 7U)); + sc_pad_iso_t iso = ((sc_pad_iso_t) RPC_U8(msg, 8U)); + uint32_t ctrl = ((uint32_t) RPC_U32(msg, 0U)); + sc_pad_wakeup_t wakeup = ((sc_pad_wakeup_t) RPC_U8(msg, 9U)); + + /* Call function */ + err = pad_set_all(caller_pt, pad, mux, config, iso, ctrl, + wakeup); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_all() */ + case PAD_FUNC_GET_ALL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint8_t mux = ((uint8_t) 0U); + sc_pad_config_t config = ((sc_pad_config_t) 0U); + sc_pad_iso_t iso = ((sc_pad_iso_t) 0U); + uint32_t ctrl = ((uint32_t) 0U); + sc_pad_wakeup_t wakeup = ((sc_pad_wakeup_t) 0U); + + /* Call function */ + err = pad_get_all(caller_pt, pad, &mux, &config, &iso, &ctrl, + &wakeup); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 4U) = U8(mux); + RPC_U8(msg, 5U) = U8(config); + RPC_U8(msg, 6U) = U8(iso); + RPC_U32(msg, 0U) = U32(ctrl); + RPC_U8(msg, 7U) = U8(wakeup); + RPC_SIZE(msg) = 3U; + break; + } + /* Dispatch set() */ + case PAD_FUNC_SET : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 4U)); + uint32_t val = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = pad_set(caller_pt, pad, val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get() */ + case PAD_FUNC_GET : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint32_t val = ((uint32_t) 0U); + + /* Call function */ + err = pad_get(caller_pt, pad, &val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(val); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch config() */ + case PAD_FUNC_CONFIG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 4U)); + uint32_t val = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = pad_config(caller_pt, pad, val); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } +#ifdef API_HAS_28FDSOI + /* Dispatch set_gp_28fdsoi() */ + case PAD_FUNC_SET_GP_28FDSOI : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_28fdsoi_dse_t dse = ((sc_pad_28fdsoi_dse_t) RPC_U8(msg, 2U)); + sc_pad_28fdsoi_ps_t ps = ((sc_pad_28fdsoi_ps_t) RPC_U8(msg, 3U)); + + /* Call function */ + err = pad_set_gp_28fdsoi(caller_pt, pad, dse, ps); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } +#endif +#ifdef API_HAS_28FDSOI + /* Dispatch get_gp_28fdsoi() */ + case PAD_FUNC_GET_GP_28FDSOI : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_28fdsoi_dse_t dse = ((sc_pad_28fdsoi_dse_t) 0U); + sc_pad_28fdsoi_ps_t ps = ((sc_pad_28fdsoi_ps_t) 0U); + + /* Call function */ + err = pad_get_gp_28fdsoi(caller_pt, pad, &dse, &ps); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(dse); + RPC_U8(msg, 1U) = U8(ps); + RPC_SIZE(msg) = 2U; + break; + } +#endif +#ifdef API_HAS_28FDSOI + /* Dispatch set_gp_28fdsoi_hsic() */ + case PAD_FUNC_SET_GP_28FDSOI_HSIC : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_28fdsoi_dse_t dse = ((sc_pad_28fdsoi_dse_t) RPC_U8(msg, 2U)); + sc_bool_t hys = U2B(RPC_U8(msg, 4U)); + sc_pad_28fdsoi_pus_t pus = ((sc_pad_28fdsoi_pus_t) RPC_U8(msg, 3U)); + sc_bool_t pke = U2B(RPC_U8(msg, 5U)); + sc_bool_t pue = U2B(RPC_U8(msg, 6U)); + + /* Call function */ + err = pad_set_gp_28fdsoi_hsic(caller_pt, pad, dse, hys, pus, pke, + pue); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } +#endif +#ifdef API_HAS_28FDSOI + /* Dispatch get_gp_28fdsoi_hsic() */ + case PAD_FUNC_GET_GP_28FDSOI_HSIC : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_28fdsoi_dse_t dse = ((sc_pad_28fdsoi_dse_t) 0U); + sc_bool_t hys = SC_FALSE; + sc_pad_28fdsoi_pus_t pus = ((sc_pad_28fdsoi_pus_t) 0U); + sc_bool_t pke = SC_FALSE; + sc_bool_t pue = SC_FALSE; + + /* Call function */ + err = pad_get_gp_28fdsoi_hsic(caller_pt, pad, &dse, &hys, &pus, + &pke, &pue); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(dse); + RPC_U8(msg, 2U) = B2U8(hys); + RPC_U8(msg, 1U) = U8(pus); + RPC_U8(msg, 3U) = B2U8(pke); + RPC_U8(msg, 4U) = B2U8(pue); + RPC_SIZE(msg) = 3U; + break; + } +#endif +#ifdef API_HAS_28FDSOI + /* Dispatch set_gp_28fdsoi_comp() */ + case PAD_FUNC_SET_GP_28FDSOI_COMP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint8_t compen = ((uint8_t) RPC_U8(msg, 2U)); + sc_bool_t fastfrz = U2B(RPC_U8(msg, 5U)); + uint8_t rasrcp = ((uint8_t) RPC_U8(msg, 3U)); + uint8_t rasrcn = ((uint8_t) RPC_U8(msg, 4U)); + sc_bool_t nasrc_sel = U2B(RPC_U8(msg, 6U)); + sc_bool_t psw_ovr = U2B(RPC_U8(msg, 7U)); + + /* Call function */ + err = pad_set_gp_28fdsoi_comp(caller_pt, pad, compen, fastfrz, + rasrcp, rasrcn, nasrc_sel, psw_ovr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } +#endif +#ifdef API_HAS_28FDSOI + /* Dispatch get_gp_28fdsoi_comp() */ + case PAD_FUNC_GET_GP_28FDSOI_COMP : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + uint8_t compen = ((uint8_t) 0U); + sc_bool_t fastfrz = SC_FALSE; + uint8_t rasrcp = ((uint8_t) 0U); + uint8_t rasrcn = ((uint8_t) 0U); + sc_bool_t nasrc_sel = SC_FALSE; + sc_bool_t compok = SC_FALSE; + uint8_t nasrc = ((uint8_t) 0U); + sc_bool_t psw_ovr = SC_FALSE; + + /* Call function */ + err = pad_get_gp_28fdsoi_comp(caller_pt, pad, &compen, &fastfrz, + &rasrcp, &rasrcn, &nasrc_sel, &compok, &nasrc, &psw_ovr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(compen); + RPC_U8(msg, 4U) = B2U8(fastfrz); + RPC_U8(msg, 1U) = U8(rasrcp); + RPC_U8(msg, 2U) = U8(rasrcn); + RPC_U8(msg, 5U) = B2U8(nasrc_sel); + RPC_U8(msg, 6U) = B2U8(compok); + RPC_U8(msg, 3U) = U8(nasrc); + RPC_U8(msg, 7U) = B2U8(psw_ovr); + RPC_SIZE(msg) = 3U; + break; + } +#endif + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=pad, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=pad, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/pad/svc.c b/platform/svc/pad/svc.c new file mode 100755 index 0000000..fd02ed1 --- /dev/null +++ b/platform/svc/pad/svc.c @@ -0,0 +1,878 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pad/svc.c + * + * File containing the implementation of the System Controller (SC) Pad + * Control (PAD) function. + * + * @addtogroup PAD_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/soc.h" +#include "main/boot.h" +#include "svc/pad/svc.h" +#include "svc/rm/svc.h" +#include "ss/inf/inf.h" +#include "drivers/pad/fsl_pad.h" +#include "pad_priority.h" + +/* Local Defines */ + +/*! Define to fill in a pad_priority_info_t variable */ +#define PNFO(PAD, PAD_MUX, PAD_RSRC) \ +{ \ + .pad = SC_P_##PAD, \ + .mux = (PAD_MUX), \ + .resource = SC_R_##PAD_RSRC \ +} + +/*! + * @name Parameter checking macros + */ +/** @{ */ +#define PAD_OWNED(X) ASRT_ERR(rm_is_pad_owned(caller_pt, (X)) != SC_FALSE, SC_ERR_NOACCESS) +#define PAD_OWNED_C(X) ASRT_C(rm_is_pad_owned(caller_pt, (X)) != SC_FALSE) +#define MUX_OKAY(X,Y) ASRT_ERR(pad_mux_okay(caller_pt, (X), (Y)) != SC_FALSE, SC_ERR_NOACCESS) +#define MUX_OKAY_C(X,Y) ASRT_C(pad_mux_okay(caller_pt, (X), (Y)) != SC_FALSE) +/** @} */ + +/* Local Types */ + +/*! + * This type is used store static constant info about resources in a + * subsystem. A pointer to this structure can be found in the + * ss_base_info_t type. + */ +typedef struct +{ + sc_pad_t pad : SC_PAD_W; //!< Pad + uint8_t mux : SC_PAD_MUX_W; //!< Mux + sc_rsrc_t resource : SC_RSRC_W; //!< Resource +} pad_priority_info_t; + +/* Local Functions */ + +static sc_bool_t pad_mux_okay(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux); + +/* Local Variables */ + +/*! + * Constant array to hold pad mapping info. + */ +static const uint16_t pad_map[SC_NUM_PAD] = +{ + SC_SVC_PAD_INIT +}; + +/*--------------------------------------------------------------------------*/ +/* Init the pad service */ +/*--------------------------------------------------------------------------*/ +void pad_init(sc_bool_t api_phase) +{ + static const pad_priority_info_t pad_init_info[] = + { + SC_PAD_INIT_INIT + }; + + if (api_phase == SC_FALSE) + { + sc_rsrc_t boot_dev; + const pad_priority_info_t *p = pad_init_info; + + /* Get boot device */ + boot_dev = boot_get_dev(SC_PT, SC_FALSE); + + /* Loop through pad priority */ + while ((p->pad != 0U) || (p->mux != 0U) || (p->resource != 0U)) + { + /* Unused for boot? */ + if (p->resource != boot_dev) + { + uint8_t mux = 0U; + sc_pad_config_t config = SC_PAD_CONFIG_NORMAL; + sc_pad_iso_t iso = SC_PAD_ISO_OFF; + + /* Get current state */ + if (pad_get_mux(SC_PT, p->pad, &mux, &config, &iso) == SC_ERR_NONE) + { + /* Check if not already configured by ROM */ + if (mux == 0U) + { + pad_force_mux(p->pad, p->mux, + SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF); + } + } + } + + p++; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + uint8_t mux; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Extract the mux setting */ + mux = PAD_ExtractMux(val); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + MUX_OKAY(pad, mux); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + MUX_OKAY_C(p, mux); + } + + /* Configure */ + PAD_Set(U32(pad_map[p]) << 4U, val); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad mux */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_mux(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(config <= SC_PAD_CONFIG_OUT_IN, SC_ERR_PARM); + ASRT_ERR(iso <= SC_PAD_ISO_ON, SC_ERR_PARM); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + MUX_OKAY(pad, mux); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + MUX_OKAY_C(p, mux); + } + + /* Configure mux */ + PAD_SetMux(U32(pad_map[p]) << 4U, mux, config, iso); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Force the pad mux */ +/*--------------------------------------------------------------------------*/ +void pad_force_mux(sc_pad_t pad, uint8_t mux, sc_pad_config_t config, + sc_pad_iso_t iso) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check parameters */ + BOUND_PAD(pad); + + if (err == SC_ERR_NONE) + { + /* Configure mux */ + PAD_SetMux(U32(pad_map[pad]) << 4U, mux, config, iso); + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad control */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_gp(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t ctrl) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + PAD_OWNED(pad); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + } + + /* Configure GP */ + PAD_SetGP(U32(pad_map[p]) << 4U, ctrl); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad wakeup control */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_wakeup(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_wakeup_t wakeup) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(wakeup <= SC_PAD_WAKEUP_HIGH_LVL, SC_ERR_PARM); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + } + + /* Configure wakeup */ + PAD_SetWakeup(U32(pad_map[p]) << 4U, wakeup); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad config */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_all(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso, uint32_t ctrl, + sc_pad_wakeup_t wakeup) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(config <= SC_PAD_CONFIG_OUT_IN, SC_ERR_PARM); + ASRT_ERR(iso <= SC_PAD_ISO_ON, SC_ERR_PARM); + ASRT_ERR(wakeup <= SC_PAD_WAKEUP_HIGH_LVL, SC_ERR_PARM); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + MUX_OKAY(pad, mux); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + MUX_OKAY_C(p, mux); + } + + /* Configure all */ + PAD_SetAll(U32(pad_map[p]) << 4U, mux, config, iso, ctrl, + wakeup); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t *val) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure mux */ + PAD_Get(U32(pad_map[pad]) << 4U, val); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad mux */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_mux(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Get mux */ + PAD_GetMux(U32(pad_map[pad]) << 4U, mux, config, iso); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad control */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_gp(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t *ctrl) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Get GP */ + PAD_GetGP(U32(pad_map[pad]) << 4U, ctrl); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad wakeup control */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_wakeup(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_wakeup_t *wakeup) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Get mux */ + PAD_GetWakeup(U32(pad_map[pad]) << 4U, wakeup); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad config */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_all(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso, uint32_t *ctrl, + sc_pad_wakeup_t *wakeup) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure all */ + PAD_GetAll(U32(pad_map[pad]) << 4U, mux, config, iso, ctrl, + wakeup); + } + + return err; +} + +#ifdef API_HAS_28FDSOI +/*--------------------------------------------------------------------------*/ +/* Set the pad control specific to 28FDSOI */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_gp_28fdsoi(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_pad_28fdsoi_ps_t ps) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(dse <= SC_PAD_28FDSOI_DSE_18V_HS, SC_ERR_PARM); + ASRT_ERR(ps <= SC_PAD_28FDSOI_PS_NONE, SC_ERR_PARM); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + PAD_OWNED_C(p); + } + + /* Configure GP */ + PAD_SetGP28Fdsoi(U32(pad_map[p]) << 4U, dse, ps); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad control specific to 28FDSOI */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_gp_28fdsoi(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_pad_28fdsoi_ps_t *ps) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + /* Configure GP */ + if (err == SC_ERR_NONE) + { + PAD_GetGP28Fdsoi(U32(pad_map[pad]) << 4U, dse, ps); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the pad control specific to 28FDSOI HSIC */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_gp_28fdsoi_hsic(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_bool_t hyp, sc_pad_28fdsoi_pus_t pus, + sc_bool_t pke, sc_bool_t pue) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(dse <= SC_PAD_28FDSOI_DSE_18V_HS, SC_ERR_PARM); + ASRT_ERR(pus <= SC_PAD_28FDSOI_PUS_30K_PU, SC_ERR_PARM); + + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure GP */ + PAD_SetGP28FdsoiHsic(U32(pad_map[pad]) << 4U, dse, hyp, + pus, pke, pue); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad control specific to 28FDSOI HSIC */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_gp_28fdsoi_hsic(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_bool_t *hyp, sc_pad_28fdsoi_pus_t *pus, + sc_bool_t *pke, sc_bool_t *pue) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure GP */ + PAD_GetGP28FdsoiHsic(U32(pad_map[pad]) << 4U, dse, hyp, pus, pke, + pue); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the compensation control specific to 28FDSOI */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_set_gp_28fdsoi_comp(sc_rm_pt_t caller_pt, sc_pad_t pad, + uint8_t compen, sc_bool_t fastfrz, uint8_t rasrcp, uint8_t rasrcn, + sc_bool_t nasrc_sel, sc_bool_t psw_ovr) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure GP */ + PAD_SetGP28FdsoiComp(U32(pad_map[pad]) << 4U, compen, fastfrz, + rasrcp, rasrcn, nasrc_sel, psw_ovr); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the pad compensation specific to 28FDSOI */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_get_gp_28fdsoi_comp(sc_rm_pt_t caller_pt, sc_pad_t pad, + uint8_t *compen, sc_bool_t *fastfrz, uint8_t *rasrcp, uint8_t *rasrcn, + sc_bool_t *nasrc_sel, sc_bool_t *compok, uint8_t *nasrc, + sc_bool_t *psw_ovr) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure GP */ + PAD_GetGP28FdsoiComp(U32(pad_map[pad]) << 4U, compen, fastfrz, + rasrcp, rasrcn, nasrc_sel, compok, nasrc, psw_ovr); + } + + return err; +} +#endif + +/*--------------------------------------------------------------------------*/ +/* Set a config value */ +/*--------------------------------------------------------------------------*/ +sc_err_t pad_config(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t val) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_PAD(pad); + + /* Check ownership */ + PAD_OWNED(pad); + + if (err == SC_ERR_NONE) + { + /* Configure */ + PAD_Set(U32(pad_map[pad]) << 4U, val); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Map pad irq and index to pad resource */ +/*--------------------------------------------------------------------------*/ +sc_pad_t pad_map_irq(uint8_t irq, uint8_t idx) +{ + /*! + * Constant array to hold pad grouping info. + */ + static const sc_pad_t pad_irq[SC_NUM_PAD_IRQS] = + { + SC_SVC_PAD_IRQ_INIT + }; + + /* Init pad */ + sc_pad_t pad = SC_NUM_PAD; + + /* Calculate pad from pending IRQ */ + if (irq < SC_NUM_PAD_IRQS) + { + pad = pad_irq[irq] + idx; + } + + return pad; +} + +/*--------------------------------------------------------------------------*/ +/* Dump PAD state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) && defined(DEBUG_PAD) + void pad_dump(sc_rm_pt_t pt) + { + } +#endif + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Get priority conflict info */ +/*--------------------------------------------------------------------------*/ +static sc_bool_t pad_mux_okay(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux) +{ + static const pad_priority_info_t pad_priority[SC_NUM_PAD_PRIORITY + 1] = + { + SC_PAD_PRIORITY_INIT + }; + static const pad_priority_info_t * const p = pad_priority; + int16_t top = SC_NUM_PAD_PRIORITY - 1; + uint32_t search = (U32(pad) << 16U) | U32(mux); + sc_bool_t rtn = SC_TRUE; + + /* Skip check for SCFW */ + if (caller_pt != SC_PT) + { + int16_t bottom = 0; + + /* Perform binary search */ + while (bottom <= top) + { + int16_t mid; + uint32_t item; + + /* Next middle to check */ + mid = bottom + ((top - bottom) / 2); + + /* Generate item */ + item = (U32(p[mid].pad) << 16U) | U32(p[mid].mux); + + if (item < search) + { + /* Next search section */ + bottom = mid + 1; + } + else if (item > search) + { + /* Next search section */ + top = mid - 1; + } + else + { + /* Found so return it */ + rtn = rm_is_resource_access_allowed(caller_pt, p[mid].resource); + + break; + } + } + } + + return rtn; +} + +/** @} */ + diff --git a/platform/svc/pad/svc.h b/platform/svc/pad/svc.h new file mode 100755 index 0000000..a6dc011 --- /dev/null +++ b/platform/svc/pad/svc.h @@ -0,0 +1,263 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pad/svc.h + * + * Header file containing the API for the System Controller (SC) Pad + * Control (PAD) function. + * + * @addtogroup PAD_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PAD_SVC_H +#define SC_PAD_SVC_H + +/* Includes */ + +#include "svc/pad/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/*! + * Internal SC function to initializes the PAD service. + * + * @param[in] api_phase init phase + * + * Initializes the API if /a api_phase = SC_TRUE, otherwise initializes the HW + * managed by the PAD service. API must be initialized before anything else is + * done with the service. + */ +void pad_init(sc_bool_t api_phase); + +/*! + * Internal SC function to set the pad value. + * + * @see sc_pad_set(). + */ +sc_err_t pad_set(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t val); + +/*! + * Internal SC function to set the pad mux. + * + * @see sc_pad_set_mux(). + */ +sc_err_t pad_set_mux(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso); + +/* + * This internal function configures the mux settings for a pad. This + * includes the signal mux, pad config, and low-power isolation mode. + * + * @param[in] pad pad to configure + * @param[in] mux mux setting + * @param[in] config pad config + * @param[in] iso low-power isolation mode + * + * No error returned. Just fails silently. + */ +void pad_force_mux(sc_pad_t pad, uint8_t mux, sc_pad_config_t config, + sc_pad_iso_t iso); + +/*! + * Internal SC function to set the pad control. + * + * @see sc_pad_set_gp(). + */ +sc_err_t pad_set_gp(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t ctrl); + +/*! + * Internal SC function to set the pad wakeup control. + * + * @see sc_pad_set_wakeup(). + */ +sc_err_t pad_set_wakeup(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_wakeup_t wakeup); + +/*! + * Internal SC function to configure a pad. + * + * @see sc_pad_set_all(). + */ +sc_err_t pad_set_all(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t mux, + sc_pad_config_t config, sc_pad_iso_t iso, uint32_t ctrl, + sc_pad_wakeup_t wakeup); + +/*! + * Internal SC function to get the pad value. + * + * @see sc_pad_get(). + */ +sc_err_t pad_get(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t *val); + +/*! + * Internal SC function to get the pad mux. + * + * @see sc_pad_get_mux(). + */ +sc_err_t pad_get_mux(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso); + +/*! + * Internal SC function to get the pad control. + * + * @see sc_pad_get_gp(). + */ +sc_err_t pad_get_gp(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t *ctrl); + +/*! + * Internal SC function to get the pad wakeup control. + * + * @see sc_pad_get_wakeup(). + */ +sc_err_t pad_get_wakeup(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_wakeup_t *wakeup); + +/*! + * Internal SC function to get a pad's configuration. + * + * @see sc_pad_get_all(). + */ +sc_err_t pad_get_all(sc_rm_pt_t caller_pt, sc_pad_t pad, uint8_t *mux, + sc_pad_config_t *config, sc_pad_iso_t *iso, uint32_t *ctrl, + sc_pad_wakeup_t *wakeup); + +#ifdef API_HAS_28FDSOI +/*! + * Internal SC function to set the pad control specific to 28FDSOI. + * + * @see sc_pad_set_gp_28fdsoi(). + */ +sc_err_t pad_set_gp_28fdsoi(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_pad_28fdsoi_ps_t ps); + +/*! + * Internal SC function to get the pad control specific to 28FDSOI. + * + * @see sc_pad_get_gp_28fdsoi(). + */ +sc_err_t pad_get_gp_28fdsoi(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_pad_28fdsoi_ps_t *ps); + +/*! + * Internal SC function to set the pad control specific to 28FDSOI. + * + * @see sc_pad_set_gp_28fdsoi_hsic(). + */ +sc_err_t pad_set_gp_28fdsoi_hsic(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t dse, sc_bool_t hyp, sc_pad_28fdsoi_pus_t pus, + sc_bool_t pke, sc_bool_t pue); + +/*! + * Internal SC function to get the pad control specific to 28FDSOI. + * + * @see sc_pad_get_gp_28fdsoi_hsic(). + */ +sc_err_t pad_get_gp_28fdsoi_hsic(sc_rm_pt_t caller_pt, sc_pad_t pad, + sc_pad_28fdsoi_dse_t *dse, sc_bool_t *hyp, sc_pad_28fdsoi_pus_t *pus, + sc_bool_t *pke, sc_bool_t *pue); + +/*! + * Internal SC function to set the pad compensation specific to 28FDSOI. + * + * @see sc_pad_set_gp_28fdsoi_comp(). + */ +sc_err_t pad_set_gp_28fdsoi_comp(sc_rm_pt_t caller_pt, sc_pad_t pad, + uint8_t compen, sc_bool_t fastfrz, uint8_t rasrcp, uint8_t rasrcn, + sc_bool_t nasrc_sel, sc_bool_t psw_ovr); + +/*! + * Internal SC function to get the compensation control specific to 28FDSOI. + * + * @see sc_pad_get_gp_28fdsoi_comp(). + */ +sc_err_t pad_get_gp_28fdsoi_comp(sc_rm_pt_t caller_pt, sc_pad_t pad, + uint8_t *compen, sc_bool_t *fastfrz, uint8_t *rasrcp, uint8_t *rasrcn, + sc_bool_t *nasrc_sel, sc_bool_t *compok, uint8_t *nasrc, sc_bool_t *psw_ovr); +#endif + +/*! + * Internal SC function to set a config value. + * + * @see sc_pad_config(). + */ +sc_err_t pad_config(sc_rm_pt_t caller_pt, sc_pad_t pad, uint32_t val); + +/*! + * Internal function to map pad irq and index to pad resource. + * + * @param[in] irq irq of pad + * @param[out] idx index within irq + * + * @return Returns the pad mapping. + * + * If invalid irq or idx then return is >= SC_NUM_PAD. + */ +sc_pad_t pad_map_irq(uint8_t irq, uint8_t idx); + +/** @} */ + +#if defined(DEBUG) && defined(DEBUG_PAD) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal state of the PAD service. + * + * @param[in] pt partition to dump + */ + void pad_dump(sc_rm_pt_t pt); + + /** @} */ +#endif + +#endif /* SC_PAD_SVC_H */ + +/** @} */ + diff --git a/platform/svc/pm/Makefile b/platform/svc/pm/Makefile new file mode 100755 index 0000000..b31b54a --- /dev/null +++ b/platform/svc/pm/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/pm/svc.o + +RPCS += $(OUT)/svc/pm/rpc_srv.o + +RPCL += $(OUT)/svc/pm/rpc_clnt.o + +RPCH += $(SRC)/svc/pm/rpc.h + +RPCC += $(SRC)/svc/pm/rpc_srv.c \ + $(SRC)/svc/pm/rpc_clnt.c \ + $(SRC)/svc/pm/rpc_xlate.c + +RPCHDR += $(SRC)/svc/pm/rpc_header.h + +DIRS += $(OUT)/svc/pm + diff --git a/platform/svc/pm/api.h b/platform/svc/pm/api.h new file mode 100755 index 0000000..8f4630b --- /dev/null +++ b/platform/svc/pm/api.h @@ -0,0 +1,947 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pm/api.h + * + * Header file containing the public API for the System Controller (SC) + * Power Management (PM) function. This includes functions for power state + * control, clock control, reset control, and wake-up event control. + * + * @addtogroup PM_SVC PM: Power Management Service + * + * @brief Module for the Power Management (PM) service. + * + * @includedoc pm/details.dox + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PM_API_H +#define SC_PM_API_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_PM_POWER_MODE_W 2U /*!< Width of sc_pm_power_mode_t */ +#define SC_PM_CLOCK_MODE_W 3U /*!< Width of sc_pm_clock_mode_t */ +#define SC_PM_RESET_TYPE_W 2U /*!< Width of sc_pm_reset_type_t */ +#define SC_PM_RESET_REASON_W 4U /*!< Width of sc_pm_reset_reason_t */ +/** @} */ + +/*! + * @name Defines for clock indexes (sc_pm_clk_t) + */ +/** @{ */ +/** @} */ + +/*! + * @name Defines for ALL parameters + */ +/** @{ */ +#define SC_PM_CLK_ALL ((sc_pm_clk_t) UINT8_MAX) /*!< All clocks */ +/** @} */ + +/*! + * @name Defines for sc_pm_power_mode_t + */ +/** @{ */ +#define SC_PM_PW_MODE_OFF 0U /*!< Power off */ +#define SC_PM_PW_MODE_STBY 1U /*!< Power in standby */ +#define SC_PM_PW_MODE_LP 2U /*!< Power in low-power */ +#define SC_PM_PW_MODE_ON 3U /*!< Power on */ +/** @} */ + +/*! + * @name Defines for sc_pm_clk_t + */ +/** @{ */ +#define SC_PM_CLK_SLV_BUS 0U /*!< Slave bus clock */ +#define SC_PM_CLK_MST_BUS 1U /*!< Master bus clock */ +#define SC_PM_CLK_PER 2U /*!< Peripheral clock */ +#define SC_PM_CLK_PHY 3U /*!< Phy clock */ +#define SC_PM_CLK_MISC 4U /*!< Misc clock */ +#define SC_PM_CLK_MISC0 0U /*!< Misc 0 clock */ +#define SC_PM_CLK_MISC1 1U /*!< Misc 1 clock */ +#define SC_PM_CLK_MISC2 2U /*!< Misc 2 clock */ +#define SC_PM_CLK_MISC3 3U /*!< Misc 3 clock */ +#define SC_PM_CLK_MISC4 4U /*!< Misc 4 clock */ +#define SC_PM_CLK_CPU 2U /*!< CPU clock */ +#define SC_PM_CLK_PLL 4U /*!< PLL */ +#define SC_PM_CLK_BYPASS 4U /*!< Bypass clock */ +/** @} */ + +/*! + * @name Defines for sc_pm_clk_parent_t + */ +/** @{ */ +#define SC_PM_PARENT_XTAL 0U /*!< Parent is XTAL */ +#define SC_PM_PARENT_PLL0 1U /*!< Parent is PLL0 */ +#define SC_PM_PARENT_PLL1 2U /*!< Parent is PLL1 or PLL0/2 */ +#define SC_PM_PARENT_PLL2 3U /*!< Parent in PLL2 or PLL0/4 */ +#define SC_PM_PARENT_BYPS 4U /*!< Parent is a bypass clock. */ +/** @} */ + +/*! + * @name Defines for sc_pm_reset_type_t + */ +/** @{ */ +#define SC_PM_RESET_TYPE_COLD 0U /*!< Cold reset */ +#define SC_PM_RESET_TYPE_WARM 1U /*!< Warm reset */ +#define SC_PM_RESET_TYPE_BOARD 2U /*!< Board reset */ +/** @} */ + +/*! + * @name Defines for sc_pm_reset_reason_t + */ +/** @{ */ +#define SC_PM_RESET_REASON_POR 0U /*!< Power on reset */ +#define SC_PM_RESET_REASON_JTAG 1U /*!< JTAG reset */ +#define SC_PM_RESET_REASON_SW 2U /*!< Software reset */ +#define SC_PM_RESET_REASON_WDOG 3U /*!< Partition watchdog reset */ +#define SC_PM_RESET_REASON_LOCKUP 4U /*!< SCU lockup reset */ +#define SC_PM_RESET_REASON_SNVS 5U /*!< SNVS reset */ +#define SC_PM_RESET_REASON_TEMP 6U /*!< Temp panic reset */ +#define SC_PM_RESET_REASON_MSI 7U /*!< MSI reset */ +#define SC_PM_RESET_REASON_UECC 8U /*!< ECC reset */ +#define SC_PM_RESET_REASON_SCFW_WDOG 9U /*!< SCFW watchdog reset */ +#define SC_PM_RESET_REASON_ROM_WDOG 10U /*!< SCU ROM watchdog reset */ +#define SC_PM_RESET_REASON_SECO 11U /*!< SECO reset */ +#define SC_PM_RESET_REASON_SCFW_FAULT 12U /*!< SCFW fault reset */ +#define SC_PM_RESET_REASON_V2X_DEBUG 13U /*!< V2X debug switch */ +/** @} */ + +/*! + * @name Defines for sc_pm_sys_if_t + */ +/** @{ */ +#define SC_PM_SYS_IF_INTERCONNECT 0U /*!< System interconnect */ +#define SC_PM_SYS_IF_MU 1U /*!< AP -> SCU message units */ +#define SC_PM_SYS_IF_OCMEM 2U /*!< On-chip memory (ROM/OCRAM) */ +#define SC_PM_SYS_IF_DDR 3U /*!< DDR memory */ +/** @} */ + +/*! + * @name Defines for sc_pm_wake_src_t + */ +/** @{ */ +#define SC_PM_WAKE_SRC_NONE 0U /*!< No wake source, used for self-kill */ +#define SC_PM_WAKE_SRC_SCU 1U /*!< Wakeup from SCU to resume CPU (IRQSTEER & GIC powered down) */ +#define SC_PM_WAKE_SRC_IRQSTEER 2U /*!< Wakeup from IRQSTEER to resume CPU (GIC powered down) */ +#define SC_PM_WAKE_SRC_IRQSTEER_GIC 3U /*!< Wakeup from IRQSTEER+GIC to wake CPU (GIC clock gated) */ +#define SC_PM_WAKE_SRC_GIC 4U /*!< Wakeup from GIC to wake CPU */ +/** @} */ + +/* Types */ + +/*! + * This type is used to declare a power mode. Note resources only use + * SC_PM_PW_MODE_OFF and SC_PM_PW_MODE_ON. The other modes are used only + * as system power modes. + */ +typedef uint8_t sc_pm_power_mode_t; + +/*! + * This type is used to declare a clock. + */ +typedef uint8_t sc_pm_clk_t; + +/*! + * This type is used to declare the clock parent. + */ +typedef uint8_t sc_pm_clk_parent_t; + +/*! + * This type is used to declare clock rates. + */ +typedef uint32_t sc_pm_clock_rate_t; + +/*! + * This type is used to declare a desired reset type. + */ +typedef uint8_t sc_pm_reset_type_t; + +/*! + * This type is used to declare a reason for a reset. + */ +typedef uint8_t sc_pm_reset_reason_t; + +/*! + * This type is used to specify a system-level interface to be power managed. + */ +typedef uint8_t sc_pm_sys_if_t; + +/*! + * This type is used to specify a wake source for CPU resources. + */ +typedef uint8_t sc_pm_wake_src_t; + +/* Functions */ + +/*! + * @name Power Functions + * @{ + */ + +/*! + * This function sets the system power mode. Only the owner of the + * SC_R_SYSTEM resource or a partition with access permissions to + * SC_R_SYSTEM can do this. + * + * @param[in] ipc IPC handle + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid mode, + * - SC_ERR_NOACCESS if caller does not have SC_R_SYSTEM access + * + * @see sc_pm_set_sys_power_mode(). + */ +/* IDL: E8 SET_SYS_POWER_MODE(UI8 mode) #19 */ +sc_err_t sc_pm_set_sys_power_mode(sc_ipc_t ipc, sc_pm_power_mode_t mode); + +/*! + * This function sets the power mode of a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition or mode != SC_PM_PW_MODE_OFF, + * - SC_ERR_NOACCESS if caller's partition is not the owner or + * parent of \a pt + * + * This function can only be used to turn off a partition by calling + * with mode equal to SC_PM_PW_MODE_OFF. After turning off, the partition + * can be booted with sc_pm_reboot_partition() or sc_pm_boot(). It cannot + * be used to turn off the calling partition as the MU could not return + * the an error response. + * + * For dynamic power management of a partition, use + * sc_pm_req_low_power_mode(), sc_pm_req_cpu_low_power_mode(), + * and sc_pm_req_sys_if_power_mode() with a WFI for controlled power + * state transitions. + */ +/* IDL: E8 SET_PARTITION_POWER_MODE(UI8 pt, UI8 mode) #1 */ +sc_err_t sc_pm_set_partition_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_power_mode_t mode); + +/*! + * This function turns off the calling partition. + * + * @param[in] ipc IPC handle + * + * This function can only be used to turn off the calling partition. + * After turning off, the partition can only be booted by the parent + * with sc_pm_reboot_partition() or sc_pm_boot(). + */ +/* IDL: RN PARTITION_POWER_OFF() #30 */ +void sc_pm_partition_power_off(sc_ipc_t ipc); + +/*! + * This function gets the power mode of a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition + * @param[out] mode pointer to return power mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition + */ +/* IDL: E8 GET_SYS_POWER_MODE(UI8 pt, UO8 mode) #2 */ +sc_err_t sc_pm_get_sys_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_power_mode_t *mode); + +/*! + * This function sends a wake interrupt to a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to wake + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * An SC_IRQ_SW_WAKE interrupt is sent to all MUs owned by the + * partition that have this interrupt enabled. The CPU using an + * MU will exit a low-power state to service the MU interrupt. + * + * Return errors: + * - SC_ERR_PARM if invalid partition + */ +/* IDL: E8 PARTITION_WAKE(UI8 pt) #28 */ +sc_err_t sc_pm_partition_wake(sc_ipc_t ipc, sc_rm_pt_t pt); + +/*! + * This function sets the power mode of a resource. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or mode, + * - SC_ERR_PARM if resource is the MU used to make the call, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner + * + * Resources must be at SC_PM_PW_MODE_LP mode or higher to access them, + * otherwise the master will get a bus error or hang. + * + * Note some resources are still not accessible even when powered up if bus + * transactions go through a fabric not powered up. Examples of this are + * resources in display and capture subsystems which require the display + * controller or the imaging subsystem to be powered up first. + * + * Note that resources are grouped into power domains by the underlying + * hardware. If any resource in the domain is on, the entire power domain + * will be on. Other power domains required to access the resource will + * also be turned on. Bus clocks required to access the peripheral will be + * turned on. Refer to the SoC RM for more info on power domains and access + * infrastructure (bus fabrics, clock domains, etc.). + * + * When the resource transitions to the SC_PM_PW_MODE_OFF, all of the settings, + * including clock rate, will be lost; immaterial of the state of other + * resources in the same power domain. + */ +/* IDL: E8 SET_RESOURCE_POWER_MODE(UI16 resource, UI8 mode) #3 */ +sc_err_t sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode); + +/*! + * This function sets the power mode for all the resources owned + * by a child partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of child partition + * @param[in] mode power mode to apply + * @param[in] exclude resource to exclude + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition or mode, + * - SC_ERR_NOACCESS if caller's partition is not the parent + * (with grant) of \a pt + * + * This functions loops through all the resources owned by \a pt + * and sets the power mode to \a mode. It will skip setting + * \a exclude (SC_R_LAST to skip none). + * + * This function can only be called by the parent. It is used to + * implement some aspects of virtualization. + */ +/* IDL: E8 SET_RESOURCE_POWER_MODE_ALL(UI8 pt, UI8 mode, UI16 exclude) #22 */ +sc_err_t sc_pm_set_resource_power_mode_all(sc_ipc_t ipc, + sc_rm_pt_t pt, sc_pm_power_mode_t mode, sc_rsrc_t exclude); + +/*! + * This function gets the power mode of a resource. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[out] mode pointer to return power mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Note only SC_PM_PW_MODE_OFF and SC_PM_PW_MODE_ON are valid. The value + * returned does not reflect the power mode of the partition. + */ +/* IDL: E8 GET_RESOURCE_POWER_MODE(UI16 resource, UO8 mode) #4 */ +sc_err_t sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t *mode); + +/*! + * This function specifies the low power mode some of the resources + * can enter based on their state. This API is only valid for the + * following resources : SC_R_AP_x, SC_R_AP_x_y, SC_R_CCI. For all + * other resources it will return SC_ERR_PARAM. This function will + * set the low power mode the cores, cluster and cluster associated + * resources will enter when all the cores in a given cluster execute + * WFI. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + */ +/* IDL: E8 REQ_LOW_POWER_MODE(UI16 resource, UI8 mode) #16 */ +sc_err_t sc_pm_req_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode); + +/*! + * This function requests low-power mode entry for CPU/cluster + * resources. This API is only valid for the following resources: + * SC_R_AP_x, SC_R_AP_x_y, SC_R_CCI. For all other resources it will + * return SC_ERR_PARAM. For individual core resources, the specified + * power mode and wake source will be applied after the core has entered + * WFI. For cluster resources, the specified power mode is + * applied after all cores in the cluster have entered low-power mode. + * For multicluster resources, the specified power mode is applied + * after all clusters have reached low-power mode. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * @param[in] wake_src wake source for low-power exit + * + * @return Returns an error code (SC_ERR_NONE = success). + * + */ +/* IDL: E8 REQ_CPU_LOW_POWER_MODE(UI16 resource, UI8 mode, UI8 wake_src) #20 */ +sc_err_t sc_pm_req_cpu_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src); + +/*! + * This function is used to set the resume address of a CPU. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the CPU resource + * @param[in] address 64-bit resume address + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or address, + * - SC_ERR_NOACCESS if caller's partition is not the parent of the + * resource (CPU) owner + * + * Note the address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: E8 SET_CPU_RESUME_ADDR(UI16 resource, UI64 address) #17 */ +sc_err_t sc_pm_set_cpu_resume_addr(sc_ipc_t ipc, sc_rsrc_t resource, + sc_faddr_t address); + +/*! + * This function is used to set parameters for CPU resume from + * low-power mode. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the CPU resource + * @param[in] isPrimary set SC_TRUE if primary wake CPU + * @param[in] address 64-bit resume address + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or address, + * - SC_ERR_NOACCESS if caller's partition is not the parent of the + * resource (CPU) owner + * + * Note the address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: E8 SET_CPU_RESUME(UI16 resource, IB isPrimary, UI64 address) #21 */ +sc_err_t sc_pm_set_cpu_resume(sc_ipc_t ipc, sc_rsrc_t resource, + sc_bool_t isPrimary, sc_faddr_t address); + +/*! + * This function requests the power mode configuration for system-level + * interfaces including messaging units, interconnect, and memories. This + * API is only valid for the following resources : SC_R_AP_x, and + * SC_R_MCU_x_PID_y. For all other resources, it will return SC_ERR_PARAM. + * The requested power mode will be captured and applied to system-level + * resources as system conditions allow. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] sys_if system-level interface to be configured + * @param[in] hpm high-power mode for the system interface + * @param[in] lpm low-power mode for the system interface + * + * @return Returns an error code (SC_ERR_NONE = success). + * + */ +/* IDL: E8 REQ_SYS_IF_POWER_MODE(UI16 resource, UI8 sys_if, UI8 hpm, UI8 lpm) #18 */ +sc_err_t sc_pm_req_sys_if_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm); + +/** @} */ + +/*! + * @name Clock/PLL Functions + * @{ + */ + +/*! + * This function sets the rate of a resource's clock/PLL. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] clk clock/PLL to affect + * @param[in,out] rate pointer to rate + * + * This function returns the actual clock rate of the hardware. This rate + * may be different from the requested clock rate. It is guaranteed to be + * <= the requested rate. If no such rate can be obtained due to hardware + * limitations then it will return SC_ERR_PARM. See the Clocking section + * of the SoC RM to understand the limitations of any specific clock. + * Limitations may be due to clock rate of parent, parent options, max + * integer divider range, etc. The monitor 'dump rsrc_clks' command can + * be used to better understand the limitations. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock/PLL, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner, + * - SC_ERR_UNAVAILABLE if clock/PLL not applicable to this resource, + * - SC_ERR_LOCKED if rate locked (usually because shared clock/PLL) + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock/PLL values. + */ +/* IDL: E8 SET_CLOCK_RATE(UI16 resource, UI8 clk, UIO32 rate) #5 */ +sc_err_t sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); + +/*! + * This function gets the rate of a resource's clock/PLL. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] clk clock/PLL to affect + * @param[out] rate pointer to return rate + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource, clock/PLL, or rate, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner, + * - SC_ERR_UNAVAILABLE if clock/PLL not applicable to this resource + * + * This function returns the actual clock rate of the hardware. This rate + * may be different from the original requested clock rate if the resource + * is set to a low power mode. + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock/PLL values. + */ +/* IDL: E8 GET_CLOCK_RATE(UI16 resource, UI8 clk, UO32 rate) #6 */ +sc_err_t sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); + +/*! + * This function enables/disables a resource's clock. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] clk clock to affect + * @param[in] enable enable if SC_TRUE; otherwise disabled + * @param[in] autog HW auto clock gating + * + * If \a resource is SC_R_ALL then all resources owned will be affected. + * No error will be returned. + * + * If \a clk is SC_PM_CLK_ALL, then an error will be returned if any + * of the available clocks returns an error. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent (with grant) of the owner, + * - SC_ERR_UNAVAILABLE if clock not applicable to this resource + * - SC_ERR_NOPOWER if resource not powered + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +/* IDL: E8 CLOCK_ENABLE(UI16 resource, UI8 clk, IB enable, IB autog) #7 */ +sc_err_t sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); + +/*! + * This function sets the parent of a resource's clock. + * This function should only be called when the clock is disabled. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] clk clock to affect + * @param[in] parent New parent of the clock + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent (with grant) of the owner, + * - SC_ERR_UNAVAILABLE if clock not applicable to this resource + * - SC_ERR_BUSY if clock is currently enabled. + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +/* IDL: E8 SET_CLOCK_PARENT(UI16 resource, UI8 clk, UI8 parent) #14 */ +sc_err_t sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t parent); + +/*! + * This function gets the parent of a resource's clock. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the resource + * @param[in] clk clock to affect + * @param[out] parent pointer to return parent of clock + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or clock, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner + * or parent of the owner, + * - SC_ERR_UNAVAILABLE if clock not applicable to this resource + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +/* IDL: E8 GET_CLOCK_PARENT(UI16 resource, UI8 clk, UO8 parent) #15 */ +sc_err_t sc_pm_get_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); + +/** @} */ + +/*! + * @name Reset Functions + * @{ + */ + +/*! + * This function is used to reset the system. Only the owner of the + * SC_R_SYSTEM resource or a partition with access permissions to + * SC_R_SYSTEM can do this. + * + * @param[in] ipc IPC handle + * @param[in] type reset type + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid type, + * - SC_ERR_NOACCESS if caller cannot access SC_R_SYSTEM + * + * If this function returns, then the reset did not occur due to an + * invalid parameter. + */ +/* IDL: E8 RESET(UI8 type) #13 */ +sc_err_t sc_pm_reset(sc_ipc_t ipc, sc_pm_reset_type_t type); + +/*! + * This function gets a caller's reset reason. + * + * @param[in] ipc IPC handle + * @param[out] reason pointer to return the reset reason + * + * This function returns the reason a partition was reset. If the reason + * is POR, then the system reset reason will be returned. + * + * Note depending on the connection of the WDOG_OUT signal and the OTP + * programming of the PMIC, some resets may trigger a system POR + * and the original reason will be lost. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 RESET_REASON(UO8 reason) #10 */ +sc_err_t sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason); + +/*! + * This function gets the partition that caused a reset. + * + * @param[in] ipc IPC handle + * @param[out] pt pointer to return the resetting partition + * + * If the reset reason obtained via sc_pm_reset_reason() is POR then the + * result from this function will be 0. Some SECO causes of reset will + * also return 0. + * + * Note depending on the connection of the WDOG_OUT signal and the OTP + * programming of the PMIC, some resets may trigger a system POR + * and the partition info will be lost. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 GET_RESET_PART(UO8 pt) #26 */ +sc_err_t sc_pm_get_reset_part(sc_ipc_t ipc, sc_rm_pt_t *pt); + +/*! + * This function is used to boot a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to boot + * @param[in] resource_cpu ID of the CPU resource to start + * @param[in] boot_addr 64-bit boot address + * @param[in] resource_mu ID of the MU that must be powered + * @param[in] resource_dev ID of the boot device that must be powered + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition, resource, or addr, + * - SC_ERR_NOACCESS if caller's partition is not the parent of the + * partition to boot + * + * This must be used to boot a partition. Only a partition booted this + * way can be rebooted using the watchdog, sc_pm_boot() or + * sc_pm_reboot_partition(). + * + * Note the address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: E8 BOOT(UI8 pt, UI16 resource_cpu, UI64 boot_addr, UI16 resource_mu, UI16 resource_dev) #8 */ +sc_err_t sc_pm_boot(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, + sc_rsrc_t resource_mu, sc_rsrc_t resource_dev); + +/*! + * This function is used to change the boot parameters for a partition. + * + * @param[in] ipc IPC handle + * @param[in] resource_cpu ID of the CPU resource to start + * @param[in] boot_addr 64-bit boot address + * @param[in] resource_mu ID of the MU that must be powered (0=none) + * @param[in] resource_dev ID of the boot device that must be powered (0=none) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource, or addr + * + * This function can be used to change the boot parameters for a partition. + * This can be useful if a partitions reboots differently from the initial + * boot done via sc_pm_boot() or via ROM. + * + * Note the address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: E8 SET_BOOT_PARM(UI16 resource_cpu, UI64 boot_addr, UI16 resource_mu, UI16 resource_dev) #27 */ +sc_err_t sc_pm_set_boot_parm(sc_ipc_t ipc, + sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, + sc_rsrc_t resource_mu, sc_rsrc_t resource_dev); + +/*! + * This function is used to reboot the caller's partition. + * + * @param[in] ipc IPC handle + * @param[in] type reset type + * + * If \a type is SC_PM_RESET_TYPE_COLD, then most peripherals owned by + * the calling partition will be reset if possible. SC state (partitions, + * power, clocks, etc.) is reset. The boot SW of the booting CPU must be + * able to handle peripherals that that are not reset. + * + * If \a type is SC_PM_RESET_TYPE_WARM or SC_PM_RESET_TYPE_BOARD, then + * does nothing. + * + * If this function returns, then the reset did not occur due to an + * invalid parameter. A partition also cannot reboot if it is not + * isolated See sc_rm_partition_alloc(). + */ +/* IDL: RN REBOOT(UI8 type) #9 */ +void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type); + +/*! + * This function is used to reboot a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to reboot + * @param[in] type reset type + * + * If \a type is SC_PM_RESET_TYPE_COLD, then most peripherals owned by + * the calling partition will be reset if possible. SC state (partitions, + * power, clocks, etc.) is reset. The boot SW of the booting CPU must be + * able to handle peripherals that that are not reset. + * + * If \a type is SC_PM_RESET_TYPE_WARM or SC_PM_RESET_TYPE_BOARD, then + * returns SC_ERR_PARM as these are not supported. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Normally the caller needs to be the parent of the partition being + * rebooted. This is not a requirement if the caller has access rights + * to the SC_R_SYSTEM resource. In other words, having access rights to + * SC_R_SYSTEM overrides the requirement to be the parent. Having access + * rights to SC_R_SYSTEM is not required if the caller is the parent of + * \a pt. + * + * Return errors: + * - SC_ERR_PARM if invalid partition or type + * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt + * (see exception above) + * - SC_ERR_NOACCESS if \a pt is not isolated (see sc_rm_partition_alloc()) + * + * Most peripherals owned by the partition will be reset if + * possible. SC state (partitions, power, clocks, etc.) is reset. The + * boot SW of the booting CPU must be able to handle peripherals that + * that are not reset. + * + * If board_reboot_part() returns a non-0 mask, then the reboot will + * be delayed until all partitions indicated in the mask have called + * sc_pm_reboot_continue() to continue the boot. + */ +/* IDL: E8 REBOOT_PARTITION(UI8 pt, UI8 type) #12 */ +sc_err_t sc_pm_reboot_partition(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_reset_type_t type); + +/*! + * This function is used to continue the reboot a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to continue + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition + */ +/* IDL: E8 REBOOT_CONTINUE(UI8 pt) #25 */ +sc_err_t sc_pm_reboot_continue(sc_ipc_t ipc, sc_rm_pt_t pt); + +/*! + * This function is used to start/stop a CPU. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the CPU resource + * @param[in] enable start if SC_TRUE; otherwise stop + * @param[in] address 64-bit boot address + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or address, + * - SC_ERR_NOACCESS if caller's partition is not the parent of the + * resource (CPU) owner + * + * This function is usually used to start a secondary CPU in the + * same partition as the caller. It is not used to start the first + * CPU in a dedicated partition. That would be started by calling + * sc_pm_boot(). + * + * A CPU started with sc_pm_cpu_start() will not restart as a result + * of a watchdog event or calling sc_pm_reboot() or sc_pm_reboot_partition(). + * Those will reboot that partition which will start the CPU started with + * sc_pm_boot(). + * + * Note the address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: E8 CPU_START(UI16 resource, IB enable, UI64 address) #11 */ +sc_err_t sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable, + sc_faddr_t address); + +/*! + * This function is used to reset a CPU. + * + * @param[in] ipc IPC handle + * @param[in] resource ID of the CPU resource + * @param[in] address 64-bit boot address + * + * This function does not return anything as the calling core may have been + * reset. It can still fail if the resource or address is invalid. It can also + * fail if the caller's partition is not the owner of the CPU, not the parent + * of the CPU resource owner, or has access to SC_R_SYSTEM. Will also fail if + * the resource is not powered on. No indication of failure is returned. + * + * Note this just resets the CPU. None of the peripherals or bus fabric used by + * the CPU is reset. State configured in the SCFW is not reset. The SW running + * on the core has to understand and deal with this. + * + * The address is limited by the hardware implementation. See the + * [CPU Start Address](@ref BOOT_ADDR) section in the Porting Guide. + */ +/* IDL: RN CPU_RESET(UI16 resource, UI64 address) #23 */ +void sc_pm_cpu_reset(sc_ipc_t ipc, sc_rsrc_t resource, sc_faddr_t address); + +/*! + * This function is used to reset a peripheral. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to reset + * + * This function will reset a resource. Most resources cannot be reset unless + * the SoC design specifically allows it. In the case on MUs, the IPC/RPC + * protocol is also reset. Note a caller cannot reset an MU that this API + * call is sent on. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource, + * - SC_ERR_PARM if resource is the MU used to make the call, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * (with grant) of the owner, + * - SC_ERR_BUSY if the resource cannot be reset due to power state of buses, + * - SC_ERR_UNAVAILABLE if the resource cannot be reset due to hardware limitations + */ +/* IDL: E8 RESOURCE_RESET(UI16 resource) #29 */ +sc_err_t sc_pm_resource_reset(sc_ipc_t ipc, sc_rsrc_t resource); + +/*! + * This function returns a bool indicating if a partition was started. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to check + * + * @return Returns a bool (SC_TRUE = started). + * + * Note this indicates if a partition was started. It does not indicate if a + * partition is currently running or in a low power state. + */ +/* IDL: RB IS_PARTITION_STARTED(UI8 pt) #24 */ +sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt); + +/** @} */ + +#endif /* SC_PM_API_H */ + +/** @} */ + diff --git a/platform/svc/pm/rpc.h b/platform/svc/pm/rpc.h new file mode 100644 index 0000000..33948fd --- /dev/null +++ b/platform/svc/pm/rpc.h @@ -0,0 +1,109 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the PM RPC implementation. + * + * @addtogroup PM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_PM_RPC_H +#define SC_PM_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC PM function calls + */ +/** @{ */ +#define PM_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define PM_FUNC_SET_SYS_POWER_MODE 19U /*!< Index for sc_pm_set_sys_power_mode() RPC call */ +#define PM_FUNC_SET_PARTITION_POWER_MODE 1U /*!< Index for sc_pm_set_partition_power_mode() RPC call */ +#define PM_FUNC_PARTITION_POWER_OFF 30U /*!< Index for sc_pm_partition_power_off() RPC call */ +#define PM_FUNC_GET_SYS_POWER_MODE 2U /*!< Index for sc_pm_get_sys_power_mode() RPC call */ +#define PM_FUNC_PARTITION_WAKE 28U /*!< Index for sc_pm_partition_wake() RPC call */ +#define PM_FUNC_SET_RESOURCE_POWER_MODE 3U /*!< Index for sc_pm_set_resource_power_mode() RPC call */ +#define PM_FUNC_SET_RESOURCE_POWER_MODE_ALL 22U /*!< Index for sc_pm_set_resource_power_mode_all() RPC call */ +#define PM_FUNC_GET_RESOURCE_POWER_MODE 4U /*!< Index for sc_pm_get_resource_power_mode() RPC call */ +#define PM_FUNC_REQ_LOW_POWER_MODE 16U /*!< Index for sc_pm_req_low_power_mode() RPC call */ +#define PM_FUNC_REQ_CPU_LOW_POWER_MODE 20U /*!< Index for sc_pm_req_cpu_low_power_mode() RPC call */ +#define PM_FUNC_SET_CPU_RESUME_ADDR 17U /*!< Index for sc_pm_set_cpu_resume_addr() RPC call */ +#define PM_FUNC_SET_CPU_RESUME 21U /*!< Index for sc_pm_set_cpu_resume() RPC call */ +#define PM_FUNC_REQ_SYS_IF_POWER_MODE 18U /*!< Index for sc_pm_req_sys_if_power_mode() RPC call */ +#define PM_FUNC_SET_CLOCK_RATE 5U /*!< Index for sc_pm_set_clock_rate() RPC call */ +#define PM_FUNC_GET_CLOCK_RATE 6U /*!< Index for sc_pm_get_clock_rate() RPC call */ +#define PM_FUNC_CLOCK_ENABLE 7U /*!< Index for sc_pm_clock_enable() RPC call */ +#define PM_FUNC_SET_CLOCK_PARENT 14U /*!< Index for sc_pm_set_clock_parent() RPC call */ +#define PM_FUNC_GET_CLOCK_PARENT 15U /*!< Index for sc_pm_get_clock_parent() RPC call */ +#define PM_FUNC_RESET 13U /*!< Index for sc_pm_reset() RPC call */ +#define PM_FUNC_RESET_REASON 10U /*!< Index for sc_pm_reset_reason() RPC call */ +#define PM_FUNC_GET_RESET_PART 26U /*!< Index for sc_pm_get_reset_part() RPC call */ +#define PM_FUNC_BOOT 8U /*!< Index for sc_pm_boot() RPC call */ +#define PM_FUNC_SET_BOOT_PARM 27U /*!< Index for sc_pm_set_boot_parm() RPC call */ +#define PM_FUNC_REBOOT 9U /*!< Index for sc_pm_reboot() RPC call */ +#define PM_FUNC_REBOOT_PARTITION 12U /*!< Index for sc_pm_reboot_partition() RPC call */ +#define PM_FUNC_REBOOT_CONTINUE 25U /*!< Index for sc_pm_reboot_continue() RPC call */ +#define PM_FUNC_CPU_START 11U /*!< Index for sc_pm_cpu_start() RPC call */ +#define PM_FUNC_CPU_RESET 23U /*!< Index for sc_pm_cpu_reset() RPC call */ +#define PM_FUNC_RESOURCE_RESET 29U /*!< Index for sc_pm_resource_reset() RPC call */ +#define PM_FUNC_IS_PARTITION_STARTED 24U /*!< Index for sc_pm_is_partition_started() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming PM RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void pm_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_PM_RPC_H */ + +/** @} */ + diff --git a/platform/svc/pm/rpc_clnt.c b/platform/svc/pm/rpc_clnt.c new file mode 100644 index 0000000..79799aa --- /dev/null +++ b/platform/svc/pm/rpc_clnt.c @@ -0,0 +1,882 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the PM service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup PM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/pm/api.h" +#include "../../main/rpc.h" +#include "svc/pm/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 SET_SYS_POWER_MODE(UI8 mode) #19 */ +sc_err_t sc_pm_set_sys_power_mode(sc_ipc_t ipc, sc_pm_power_mode_t mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_SYS_POWER_MODE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_PARTITION_POWER_MODE(UI8 pt, UI8 mode) #1 */ +sc_err_t sc_pm_set_partition_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_power_mode_t mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_PARTITION_POWER_MODE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RN PARTITION_POWER_OFF() #30 */ +void sc_pm_partition_power_off(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_PARTITION_POWER_OFF); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_TRUE); +} + +/* IDL: E8 GET_SYS_POWER_MODE(UI8 pt, UO8 mode) #2 */ +sc_err_t sc_pm_get_sys_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_power_mode_t *mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_GET_SYS_POWER_MODE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mode != NULL) + { + *mode = (sc_pm_power_mode_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 PARTITION_WAKE(UI8 pt) #28 */ +sc_err_t sc_pm_partition_wake(sc_ipc_t ipc, sc_rm_pt_t pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_PARTITION_WAKE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RESOURCE_POWER_MODE(UI16 resource, UI8 mode) #3 */ +sc_err_t sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_RESOURCE_POWER_MODE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RESOURCE_POWER_MODE_ALL(UI8 pt, UI8 mode, UI16 exclude) #22 */ +sc_err_t sc_pm_set_resource_power_mode_all(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_power_mode_t mode, sc_rsrc_t exclude) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_RESOURCE_POWER_MODE_ALL); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(exclude); + RPC_U8(&msg, 2U) = U8(pt); + RPC_U8(&msg, 3U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_RESOURCE_POWER_MODE(UI16 resource, UO8 mode) #4 */ +sc_err_t sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t *mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_GET_RESOURCE_POWER_MODE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mode != NULL) + { + *mode = (sc_pm_power_mode_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 REQ_LOW_POWER_MODE(UI16 resource, UI8 mode) #16 */ +sc_err_t sc_pm_req_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REQ_LOW_POWER_MODE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 REQ_CPU_LOW_POWER_MODE(UI16 resource, UI8 mode, UI8 wake_src) #20 */ +sc_err_t sc_pm_req_cpu_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REQ_CPU_LOW_POWER_MODE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(mode); + RPC_U8(&msg, 3U) = U8(wake_src); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_CPU_RESUME_ADDR(UI16 resource, UI64 address) #17 */ +sc_err_t sc_pm_set_cpu_resume_addr(sc_ipc_t ipc, sc_rsrc_t resource, + sc_faddr_t address) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_CPU_RESUME_ADDR); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(address >> 32ULL); + RPC_U32(&msg, 4U) = U32(address); + RPC_U16(&msg, 8U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_CPU_RESUME(UI16 resource, IB isPrimary, UI64 address) #21 */ +sc_err_t sc_pm_set_cpu_resume(sc_ipc_t ipc, sc_rsrc_t resource, + sc_bool_t isPrimary, sc_faddr_t address) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_CPU_RESUME); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(address >> 32ULL); + RPC_U32(&msg, 4U) = U32(address); + RPC_U16(&msg, 8U) = U16(resource); + RPC_U8(&msg, 10U) = B2U8(isPrimary); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 REQ_SYS_IF_POWER_MODE(UI16 resource, UI8 sys_if, UI8 hpm, UI8 lpm) #18 */ +sc_err_t sc_pm_req_sys_if_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REQ_SYS_IF_POWER_MODE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(sys_if); + RPC_U8(&msg, 3U) = U8(hpm); + RPC_U8(&msg, 4U) = U8(lpm); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_CLOCK_RATE(UI16 resource, UI8 clk, UIO32 rate) #5 */ +sc_err_t sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_CLOCK_RATE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(*rate); + RPC_U16(&msg, 4U) = U16(resource); + RPC_U8(&msg, 6U) = U8(clk); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *rate = (sc_pm_clock_rate_t) RPC_U32(&msg, 0U); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_CLOCK_RATE(UI16 resource, UI8 clk, UO32 rate) #6 */ +sc_err_t sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_GET_CLOCK_RATE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(clk); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (rate != NULL) + { + *rate = (sc_pm_clock_rate_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 CLOCK_ENABLE(UI16 resource, UI8 clk, IB enable, IB autog) #7 */ +sc_err_t sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_bool_t enable, sc_bool_t autog) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_CLOCK_ENABLE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(clk); + RPC_U8(&msg, 3U) = B2U8(enable); + RPC_U8(&msg, 4U) = B2U8(autog); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_CLOCK_PARENT(UI16 resource, UI8 clk, UI8 parent) #14 */ +sc_err_t sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t parent) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_CLOCK_PARENT); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(clk); + RPC_U8(&msg, 3U) = U8(parent); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_CLOCK_PARENT(UI16 resource, UI8 clk, UO8 parent) #15 */ +sc_err_t sc_pm_get_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t *parent) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_GET_CLOCK_PARENT); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(clk); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (parent != NULL) + { + *parent = (sc_pm_clk_parent_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 RESET(UI8 type) #13 */ +sc_err_t sc_pm_reset(sc_ipc_t ipc, sc_pm_reset_type_t type) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_RESET); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(type); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 RESET_REASON(UO8 reason) #10 */ +sc_err_t sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_RESET_REASON); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (reason != NULL) + { + *reason = (sc_pm_reset_reason_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 GET_RESET_PART(UO8 pt) #26 */ +sc_err_t sc_pm_get_reset_part(sc_ipc_t ipc, sc_rm_pt_t *pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_GET_RESET_PART); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (pt != NULL) + { + *pt = (sc_rm_pt_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 BOOT(UI8 pt, UI16 resource_cpu, UI64 boot_addr, UI16 resource_mu, UI16 resource_dev) #8 */ +sc_err_t sc_pm_boot(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource_cpu, + sc_faddr_t boot_addr, sc_rsrc_t resource_mu, sc_rsrc_t resource_dev) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 5U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_BOOT); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(boot_addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(boot_addr); + RPC_U16(&msg, 8U) = U16(resource_cpu); + RPC_U16(&msg, 10U) = U16(resource_mu); + RPC_U16(&msg, 12U) = U16(resource_dev); + RPC_U8(&msg, 14U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_BOOT_PARM(UI16 resource_cpu, UI64 boot_addr, UI16 resource_mu, UI16 resource_dev) #27 */ +sc_err_t sc_pm_set_boot_parm(sc_ipc_t ipc, sc_rsrc_t resource_cpu, + sc_faddr_t boot_addr, sc_rsrc_t resource_mu, sc_rsrc_t resource_dev) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 5U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_SET_BOOT_PARM); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(boot_addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(boot_addr); + RPC_U16(&msg, 8U) = U16(resource_cpu); + RPC_U16(&msg, 10U) = U16(resource_mu); + RPC_U16(&msg, 12U) = U16(resource_dev); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RN REBOOT(UI8 type) #9 */ +void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REBOOT); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(type); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_TRUE); +} + +/* IDL: E8 REBOOT_PARTITION(UI8 pt, UI8 type) #12 */ +sc_err_t sc_pm_reboot_partition(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_pm_reset_type_t type) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REBOOT_PARTITION); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(type); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 REBOOT_CONTINUE(UI8 pt) #25 */ +sc_err_t sc_pm_reboot_continue(sc_ipc_t ipc, sc_rm_pt_t pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_REBOOT_CONTINUE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 CPU_START(UI16 resource, IB enable, UI64 address) #11 */ +sc_err_t sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable, + sc_faddr_t address) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_CPU_START); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(address >> 32ULL); + RPC_U32(&msg, 4U) = U32(address); + RPC_U16(&msg, 8U) = U16(resource); + RPC_U8(&msg, 10U) = B2U8(enable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RN CPU_RESET(UI16 resource, UI64 address) #23 */ +void sc_pm_cpu_reset(sc_ipc_t ipc, sc_rsrc_t resource, sc_faddr_t address) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_CPU_RESET); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(address >> 32ULL); + RPC_U32(&msg, 4U) = U32(address); + RPC_U16(&msg, 8U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_TRUE); +} + +/* IDL: E8 RESOURCE_RESET(UI16 resource) #29 */ +sc_err_t sc_pm_resource_reset(sc_ipc_t ipc, sc_rsrc_t resource) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_RESOURCE_RESET); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RB IS_PARTITION_STARTED(UI8 pt) #24 */ +sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_PM); + RPC_FUNC(&msg) = U8(PM_FUNC_IS_PARTITION_STARTED); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/** @} */ + diff --git a/platform/svc/pm/rpc_srv.c b/platform/svc/pm/rpc_srv.c new file mode 100644 index 0000000..a59589c --- /dev/null +++ b/platform/svc/pm/rpc_srv.c @@ -0,0 +1,628 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the PM service. + * + * @addtogroup PM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/pm/svc.h" +#include "svc/pm/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void pm_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case PM_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch set_sys_power_mode() */ + case PM_FUNC_SET_SYS_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = pm_set_sys_power_mode(caller_pt, mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_partition_power_mode() */ + case PM_FUNC_SET_PARTITION_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = pm_set_partition_power_mode(caller_pt, pt, mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch partition_power_off() */ + case PM_FUNC_PARTITION_POWER_OFF : + { + /* Declare return and parameters */ + + /* Call function */ + pm_partition_power_off(caller_pt); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 0U; + break; + } + /* Dispatch get_sys_power_mode() */ + case PM_FUNC_GET_SYS_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) 0U); + + /* Call function */ + err = pm_get_sys_power_mode(caller_pt, pt, &mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mode); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch partition_wake() */ + case PM_FUNC_PARTITION_WAKE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = pm_partition_wake(caller_pt, pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_resource_power_mode() */ + case PM_FUNC_SET_RESOURCE_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = pm_set_resource_power_mode(mu, resource, mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_resource_power_mode_all() */ + case PM_FUNC_SET_RESOURCE_POWER_MODE_ALL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 2U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 3U)); + sc_rsrc_t exclude = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = pm_set_resource_power_mode_all(caller_pt, pt, mode, + exclude); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_resource_power_mode() */ + case PM_FUNC_GET_RESOURCE_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) 0U); + + /* Call function */ + err = pm_get_resource_power_mode(caller_pt, resource, &mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mode); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch req_low_power_mode() */ + case PM_FUNC_REQ_LOW_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = pm_req_low_power_mode(caller_pt, resource, mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch req_cpu_low_power_mode() */ + case PM_FUNC_REQ_CPU_LOW_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_power_mode_t mode = ((sc_pm_power_mode_t) RPC_U8(msg, 2U)); + sc_pm_wake_src_t wake_src = ((sc_pm_wake_src_t) RPC_U8(msg, 3U)); + + /* Call function */ + err = pm_req_cpu_low_power_mode(caller_pt, resource, mode, + wake_src); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_cpu_resume_addr() */ + case PM_FUNC_SET_CPU_RESUME_ADDR : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_faddr_t address = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = pm_set_cpu_resume_addr(caller_pt, resource, address); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_cpu_resume() */ + case PM_FUNC_SET_CPU_RESUME : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_bool_t isPrimary = U2B(RPC_U8(msg, 10U)); + sc_faddr_t address = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = pm_set_cpu_resume(caller_pt, resource, isPrimary, + address); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch req_sys_if_power_mode() */ + case PM_FUNC_REQ_SYS_IF_POWER_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_sys_if_t sys_if = ((sc_pm_sys_if_t) RPC_U8(msg, 2U)); + sc_pm_power_mode_t hpm = ((sc_pm_power_mode_t) RPC_U8(msg, 3U)); + sc_pm_power_mode_t lpm = ((sc_pm_power_mode_t) RPC_U8(msg, 4U)); + + /* Call function */ + err = pm_req_sys_if_power_mode(caller_pt, resource, sys_if, hpm, + lpm); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_clock_rate() */ + case PM_FUNC_SET_CLOCK_RATE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 4U)); + sc_pm_clk_t clk = ((sc_pm_clk_t) RPC_U8(msg, 6U)); + sc_pm_clock_rate_t rate = ((sc_pm_clock_rate_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = pm_set_clock_rate(caller_pt, resource, clk, &rate); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(rate); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_clock_rate() */ + case PM_FUNC_GET_CLOCK_RATE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_clk_t clk = ((sc_pm_clk_t) RPC_U8(msg, 2U)); + sc_pm_clock_rate_t rate = ((sc_pm_clock_rate_t) 0U); + + /* Call function */ + err = pm_get_clock_rate(caller_pt, resource, clk, &rate); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(rate); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch clock_enable() */ + case PM_FUNC_CLOCK_ENABLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_clk_t clk = ((sc_pm_clk_t) RPC_U8(msg, 2U)); + sc_bool_t enable = U2B(RPC_U8(msg, 3U)); + sc_bool_t autog = U2B(RPC_U8(msg, 4U)); + + /* Call function */ + err = pm_clock_enable(caller_pt, resource, clk, enable, autog); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_clock_parent() */ + case PM_FUNC_SET_CLOCK_PARENT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_clk_t clk = ((sc_pm_clk_t) RPC_U8(msg, 2U)); + sc_pm_clk_parent_t parent = ((sc_pm_clk_parent_t) RPC_U8(msg, 3U)); + + /* Call function */ + err = pm_set_clock_parent(caller_pt, resource, clk, parent); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_clock_parent() */ + case PM_FUNC_GET_CLOCK_PARENT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_pm_clk_t clk = ((sc_pm_clk_t) RPC_U8(msg, 2U)); + sc_pm_clk_parent_t parent = ((sc_pm_clk_parent_t) 0U); + + /* Call function */ + err = pm_get_clock_parent(caller_pt, resource, clk, &parent); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(parent); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch reset() */ + case PM_FUNC_RESET : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pm_reset_type_t type = ((sc_pm_reset_type_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = pm_reset(caller_pt, type); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch reset_reason() */ + case PM_FUNC_RESET_REASON : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pm_reset_reason_t reason = ((sc_pm_reset_reason_t) 0U); + + /* Call function */ + err = pm_reset_reason(caller_pt, &reason); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(reason); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch get_reset_part() */ + case PM_FUNC_GET_RESET_PART : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) 0U); + + /* Call function */ + err = pm_get_reset_part(caller_pt, &pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(pt); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch boot() */ + case PM_FUNC_BOOT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 14U)); + sc_rsrc_t resource_cpu = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_faddr_t boot_addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_rsrc_t resource_mu = ((sc_rsrc_t) RPC_U16(msg, 10U)); + sc_rsrc_t resource_dev = ((sc_rsrc_t) RPC_U16(msg, 12U)); + + /* Call function */ + err = pm_boot(caller_pt, pt, resource_cpu, boot_addr, + resource_mu, resource_dev); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_boot_parm() */ + case PM_FUNC_SET_BOOT_PARM : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource_cpu = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_faddr_t boot_addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_rsrc_t resource_mu = ((sc_rsrc_t) RPC_U16(msg, 10U)); + sc_rsrc_t resource_dev = ((sc_rsrc_t) RPC_U16(msg, 12U)); + + /* Call function */ + err = pm_set_boot_parm(caller_pt, resource_cpu, boot_addr, + resource_mu, resource_dev); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch reboot() */ + case PM_FUNC_REBOOT : + { + /* Declare return and parameters */ + sc_pm_reset_type_t type = ((sc_pm_reset_type_t) RPC_U8(msg, 0U)); + + /* Call function */ + pm_reboot(caller_pt, type); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 0U; + break; + } + /* Dispatch reboot_partition() */ + case PM_FUNC_REBOOT_PARTITION : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_pm_reset_type_t type = ((sc_pm_reset_type_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = pm_reboot_partition(caller_pt, pt, type); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch reboot_continue() */ + case PM_FUNC_REBOOT_CONTINUE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = pm_reboot_continue(caller_pt, pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch cpu_start() */ + case PM_FUNC_CPU_START : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_bool_t enable = U2B(RPC_U8(msg, 10U)); + sc_faddr_t address = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = pm_cpu_start(caller_pt, resource, enable, address); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch cpu_reset() */ + case PM_FUNC_CPU_RESET : + { + /* Declare return and parameters */ + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 8U)); + sc_faddr_t address = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + pm_cpu_reset(caller_pt, resource, address); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 0U; + break; + } + /* Dispatch resource_reset() */ + case PM_FUNC_RESOURCE_RESET : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = pm_resource_reset(mu, resource); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch is_partition_started() */ + case PM_FUNC_IS_PARTITION_STARTED : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + + /* Call function */ + result = pm_is_partition_started(caller_pt, pt); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=pm, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=pm, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/pm/svc.c b/platform/svc/pm/svc.c new file mode 100755 index 0000000..276f6d5 --- /dev/null +++ b/platform/svc/pm/svc.c @@ -0,0 +1,1920 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pm/svc.c + * + * File containing the implementation of the System Controller (SC) Power + * Management (PM) function. This includes functions for power state + * control, clock control, reset control, and wake-up event control. + * + * @addtogroup PM_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "main/boot.h" +#include "main/soc.h" +#include "svc/pm/svc.h" +#include "svc/rm/svc.h" +#include "svc/timer/svc.h" +#include "ss/inf/inf.h" +#include "ss_ver.h" +#if SS_VER_BASE == 1 +#include "ss/base/v1/ss.h" +#endif +#include "drivers/sysctr/fsl_sysctr.h" + +/* Local Defines */ + +/*! + * @name Parameter checking macros + */ +/** @{ */ +#define BOUND_MODE(X) ASRT_ERR((X) <= SC_PM_PW_MODE_ON, SC_ERR_PARM) +#define BOUND_CLK(X) ASRT_ERR((X) < SS_MAX_PM_CLKS, SC_ERR_PARM) +/** @} */ + +/*! + * @name Patition power flags + */ +/** @{ */ +#define PM_PART_INIT BIT32(0U) +#define PM_PART_FINAL BIT32(1U) +#define PM_PART_REBOOT BIT32(2U) +/** @} */ + +/* Local Types */ + +/*! + * This type is used to store dynamic info needed to track partition + * specific data for the power management service. + */ +typedef struct +{ + sc_faddr_t boot_addr; + uint32_t reboot_mask; + sc_rsrc_t boot_cpu : SC_RSRC_W; + sc_rsrc_t boot_mu : SC_RSRC_W; + sc_rsrc_t boot_dev : SC_RSRC_W; + sc_rm_pt_t reason_pt : SC_RM_PARTITION_W; + sc_pm_reset_reason_t reason : SC_PM_RESET_REASON_W; + sc_pm_power_mode_t mode : SC_PM_CLOCK_MODE_W; + sc_pm_reset_type_t type : SC_PM_RESET_TYPE_W; + sc_pm_power_mode_t sys_mode : SC_PM_POWER_MODE_W; + sc_bool_t booted : SC_BOOL_W; +} pm_part_data_t; + +/*! + * This type is used to store dynamic info needed to track resource + * specific data for the power management service. + */ +typedef struct +{ + sc_pm_power_mode_t rsrc_mode : SC_PM_POWER_MODE_W; + sc_pm_power_mode_t user_mode : SC_PM_POWER_MODE_W; +} pm_rsrc_data_t; + +/* Local Functions */ + +static void ss_cpu_stop_all(sc_rm_pt_t pt); +static sc_err_t pm_reboot_cont(sc_rm_pt_t pt); +static sc_err_t pm_part_off(sc_rm_pt_t pt, uint32_t flags); + +/* Local Variables */ + +/*! + * @name Local Variables + * + * @{ + */ +static pm_part_data_t pm_part_data[SC_RM_NUM_PARTITION]; +static pm_rsrc_data_t pm_rsrc_data[SC_NUM_RSRC]; +/** @} */ + +/*--------------------------------------------------------------------------*/ +/* Init the power management service */ +/*--------------------------------------------------------------------------*/ +void pm_init(sc_bool_t api_phase) +{ + if (api_phase != SC_FALSE) + { + sc_rm_pt_t pt; + + /* Init partition data */ + for (pt = 0U; pt < SC_RM_NUM_PARTITION; pt++) + { + pm_part_data[pt].sys_mode = SC_PM_PW_MODE_ON; + pm_part_data[pt].boot_cpu = SC_NUM_RESOURCE; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Initialize a new partition */ +/*--------------------------------------------------------------------------*/ +void pm_init_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + /* Update partition power mode */ + pm_part_data[pt].sys_mode = SC_PM_PW_MODE_ON; + pm_part_data[pt].reboot_mask = 0U; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for a resource index */ +/*--------------------------------------------------------------------------*/ +void pm_init_rsrc_power_mode(sc_rsrc_t rsrc, sc_pm_power_mode_t mode) +{ + sc_rm_idx_t idx= 0U; + + if (rm_check_map_ridx(rsrc, &idx) != SC_FALSE) + { + sc_sub_t ss; + sc_ss_idx_t ss_idx; + + pm_rsrc_data[idx].rsrc_mode = SC_PM_PW_MODE_ON; + + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + ss_init_boot_base(ss, ss_idx, SC_PM_PW_MODE_ON); + } +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for the system */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_sys_power_mode(sc_rm_pt_t caller_pt, sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MODE(mode); + + /* Check permissions */ + SYSTEM(caller_pt); + + /* Set power mode */ + if (err == SC_ERR_NONE) + { + err = board_power(mode); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Init partition to off */ +/*--------------------------------------------------------------------------*/ +void pm_init_partition_power_off(sc_rm_pt_t pt) +{ + pm_part_data[pt].sys_mode = SC_PM_PW_MODE_OFF; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_partition_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + ASRT_ERR(mode == SC_PM_PW_MODE_OFF, SC_ERR_PARM) + + /* Check parameters */ + USED_PT(pt); + ASRT_ERR(caller_pt != pt, SC_ERR_PARM) + + /* Check ownership */ + if (rm_get_control_partition(pt) != caller_pt) + { + ANCESTOR(pt); + } + + if (err == SC_ERR_NONE) + { + /* Power off partition */ + err = pm_part_off(pt, PM_PART_INIT | PM_PART_FINAL); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for calling partition */ +/*--------------------------------------------------------------------------*/ +void pm_partition_power_off(sc_rm_pt_t caller_pt) +{ + /* Power off partition */ + (void) pm_part_off(caller_pt, PM_PART_INIT | PM_PART_FINAL); +} + +/*--------------------------------------------------------------------------*/ +/* Update power mode for a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_update_partition_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + BOUND_MODE(mode); + + /* Check parameters */ + USED_PT(pt); + ASRT_ERR((pt != SC_PT) || (mode != SC_PM_PW_MODE_OFF), SC_ERR_PARM); + + /* Check ownership */ + ANCESTOR(pt); + + if (err == SC_ERR_NONE) + { + sc_rm_idx_t idx = 0U; + + /* Save partition system power mode */ + pm_part_data[pt].sys_mode = mode; + + /* Update all resources */ + for (idx = SC_NUM_RSRC - 1U; idx > 0U; idx--) + { + pm_update_ridx(idx); + } + pm_update_ridx(0U); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Send wake interrupt to a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_partition_wake(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Send interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_WAKE, SC_IRQ_SW_WAKE, pt); + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get power mode for a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_sys_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t *mode) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + + if (err == SC_ERR_NONE) + { + /* Return partition power mode */ + *mode = pm_part_data[pt].sys_mode; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update the power state of a resource */ +/*--------------------------------------------------------------------------*/ +void pm_update_ridx(sc_rm_idx_t idx) +{ + sc_rm_pt_t pt = 0U; + sc_pm_power_mode_t to_mode; + + /* Get resource info */ + rm_get_ridx_owner(idx, &pt); + + /* Determine new resource power mode. New mode is the mimumum + * of the user-specified power mode of the resource and the + * power mode of the partition owning the resource. + */ + to_mode = MIN(pm_rsrc_data[idx].user_mode, pm_part_data[pt].sys_mode); + + /* Resource power mode changed? */ + if (to_mode != pm_rsrc_data[idx].rsrc_mode) + { + sc_bool_t no_reset = SC_FALSE; + + /* Reset resource */ + if (to_mode == SC_PM_PW_MODE_OFF) + { + /* Will return a SC_TRUE if resource is in + * use and power mode should remain unchanged + */ + no_reset = soc_reboot_no_reset(idx); + } + + if (no_reset == SC_FALSE) + { + sc_pm_power_mode_t from_mode; + + /* Block access via HW? */ + (void) rm_ridx_block(idx, to_mode < SC_PM_PW_MODE_LP); + (void) rm_update_peripheral(idx); + + /* Call SS to transition resource power mode */ + from_mode = pm_rsrc_data[idx].rsrc_mode; + + /* + * Certain power state transitions require clocks so we may need to + * do two steps to acheive it. + */ + if (CLKOFFTRANS()) + { + soc_clk_off_trans = SC_TRUE; + ss_trans_power_mode(idx, from_mode, SC_PM_PW_MODE_LP); + ss_trans_power_mode(idx, SC_PM_PW_MODE_LP, to_mode); + } + else + { + soc_clk_off_trans = SC_FALSE; + ss_trans_power_mode(idx, from_mode, to_mode); + } + + /* Save new resource power mode */ + pm_rsrc_data[idx].rsrc_mode = to_mode; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_resource_power_mode(sc_rsrc_t mu, sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_err_t err; + sc_rm_pt_t caller_pt = SC_PT; + + /* Get calling partition */ + err = rm_get_resource_owner(SC_PT, mu, &caller_pt); + + /* Check to insure not disabling MU we are calling on */ + ASRT_ERR((mu != resource) || (mode > SC_PM_PW_MODE_STBY), SC_ERR_PARM); + + /* Error? */ + if (err == SC_ERR_NONE) + { + err = pm_set_resource_power_mode_pt(caller_pt, resource, mode); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for a resource via pt */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_resource_power_mode_pt(sc_rm_pt_t caller_pt, + sc_rsrc_t resource, sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + sc_rsrc_t r0, rN; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MODE(mode); + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0U; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + sc_pm_power_mode_t from_mode; + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + /* Check ownership */ + if (caller_pt != SC_PT) + { + ACCESS_ALLOWED(caller_pt, idx); + } + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + + from_mode = pm_rsrc_data[idx].rsrc_mode; + if ((from_mode == SC_PM_PW_MODE_OFF) && (mode == SC_PM_PW_MODE_STBY)) + { + err = SC_ERR_PARM; + } + } + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + + /* Check ownership */ + ACCESS_ALLOWED_C(caller_pt, idx); + } + pm_set_rsrc_power_mode(idx, mode); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for all resources in a child partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_resource_power_mode_all(sc_rm_pt_t caller_pt, + sc_rm_pt_t pt, sc_pm_power_mode_t mode, sc_rsrc_t exclude) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + BOUND_MODE(mode); + + /* Check parameters */ + USED_PT(pt); + + /* Check access */ + ASRT_ERR(rm_is_parent(caller_pt, pt) != SC_FALSE, + SC_ERR_NOACCESS); + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = 0U; r <= (SC_NUM_RESOURCE - 1U); r++) + { + sc_rm_idx_t idx = 0U; + sc_rm_pt_t owner = 0U; + + /* Exclude? */ + ASRT_C(r != exclude); + + /* Get resoure index */ + BOUND_RSRC_C(r, idx); + + /* Correct partition? */ + rm_get_ridx_owner(idx, &owner); + if (owner != pt) + { + continue; + } + pm_set_rsrc_power_mode(idx, mode); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set power mode for a resource index */ +/*--------------------------------------------------------------------------*/ +void pm_set_rsrc_power_mode(sc_rm_idx_t idx, sc_pm_power_mode_t mode) +{ + /* Check availability */ + if (rm_is_ridx_avail(idx) != SC_FALSE) + { + sc_pm_power_mode_t from_mode; + + from_mode = pm_rsrc_data[idx].rsrc_mode; + + if ((from_mode != SC_PM_PW_MODE_OFF) + || (mode != SC_PM_PW_MODE_STBY)) + { + /* Save user-specified resource power mode */ + pm_rsrc_data[idx].user_mode = mode; + + /* Update resource */ + pm_update_ridx(idx); + + /* Reflect mode achieved during update */ + pm_rsrc_data[idx].user_mode = pm_rsrc_data[idx].rsrc_mode; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Update power mode for a resource index */ +/*--------------------------------------------------------------------------*/ +void pm_set_active_rsrc_power_mode(sc_rm_idx_t idx, sc_pm_power_mode_t mode) +{ + /* Check availability */ + if (rm_is_ridx_avail(idx) != SC_FALSE) + { + sc_pm_power_mode_t from_mode; + + from_mode = pm_rsrc_data[idx].rsrc_mode; + + if ((from_mode != SC_PM_PW_MODE_OFF) + || (mode != SC_PM_PW_MODE_STBY)) + { + sc_rm_pt_t pt = 0U; + sc_pm_power_mode_t sys_mode; + + /* Save user-specified resource power mode */ + pm_rsrc_data[idx].user_mode = mode; + + /* Save partition state */ + rm_get_ridx_owner(idx, &pt); + sys_mode = pm_part_data[pt].sys_mode; + pm_part_data[pt].sys_mode = SC_PM_PW_MODE_ON; + + /* Update resource */ + pm_update_ridx(idx); + + /* Restore partition state */ + pm_part_data[pt].sys_mode = sys_mode; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Force power mode for a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_force_resource_power_mode(sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_RSRC(resource, idx); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + sc_pm_power_mode_t from_mode; + + from_mode = pm_rsrc_data[idx].rsrc_mode; + + if ((from_mode == SC_PM_PW_MODE_OFF) && (mode == SC_PM_PW_MODE_STBY)) + { + err = SC_ERR_PARM; + } + else + { + /* Update resource power mode */ + pm_set_rsrc_power_mode(idx, mode); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Force power mode for a resource (no return) */ +/*--------------------------------------------------------------------------*/ +void pm_force_resource_power_mode_v(sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + sc_pm_power_mode_t from_mode; + + from_mode = pm_rsrc_data[idx].rsrc_mode; + + if ((from_mode != SC_PM_PW_MODE_OFF) || (mode != SC_PM_PW_MODE_STBY)) + { + /* Save user-specified resource power mode */ + pm_rsrc_data[idx].user_mode = mode; + + /* Update resource */ + pm_update_ridx(idx); + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Get power mode for a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_resource_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_power_mode_t *mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Return resource power mode */ + *mode = pm_rsrc_data[idx].user_mode; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get power mode for a resource index */ +/*--------------------------------------------------------------------------*/ +void pm_get_rsrc_power_mode(sc_rm_idx_t idx, sc_pm_power_mode_t *mode) +{ + /* Check availability */ + if (rm_is_ridx_avail(idx) == SC_FALSE) + { + *mode = SC_PM_PW_MODE_OFF; + } + else + { + *mode = pm_rsrc_data[idx].user_mode; + } +} + +/*--------------------------------------------------------------------------*/ +/* Get active power mode for a resource index */ +/*--------------------------------------------------------------------------*/ +void pm_get_active_rsrc_power_mode(sc_rm_idx_t idx, sc_pm_power_mode_t *mode) +{ + /* Check availability */ + if (rm_is_ridx_avail(idx) == SC_FALSE) + { + *mode = SC_PM_PW_MODE_OFF; + } + else + { + *mode = pm_rsrc_data[idx].rsrc_mode; + } +} + +/*--------------------------------------------------------------------------*/ +/* Request low power mode for a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_req_low_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx= 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_MODE(mode); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + /* Set CPU power mode */ + err = ss_set_cpu_power_mode(idx, mode, SC_PM_WAKE_SRC_GIC); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Request low power mode for a CPU resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_req_cpu_low_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx= 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_MODE(mode); + ASRT_ERR(wake_src <= SC_PM_WAKE_SRC_GIC, SC_ERR_PARM); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Set CPU power mode */ + err = ss_set_cpu_power_mode(idx, mode, wake_src); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the resume address of a CPU */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_cpu_resume_addr(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_faddr_t address) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t owner_pt = 0U; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check ownership */ + if (err == SC_ERR_NONE) + { + rm_get_ridx_owner(idx, &owner_pt); + ASRT_ERR(rm_is_parent(caller_pt, owner_pt) || (caller_pt == owner_pt), + SC_ERR_NOACCESS); + } + + /* Set the resume address of the CPU */ + if (err == SC_ERR_NONE) + { + err = ss_set_cpu_resume(idx, SC_FALSE, address); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the resume parameters of a CPU */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_cpu_resume(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t isPrimary, sc_faddr_t address) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t owner_pt = 0U; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check ownership */ + if (err == SC_ERR_NONE) + { + rm_get_ridx_owner(idx, &owner_pt); + ASRT_ERR(rm_is_parent(caller_pt, owner_pt) || (caller_pt == owner_pt), + SC_ERR_NOACCESS); + } + + /* Set the resume address of the CPU */ + if (err == SC_ERR_NONE) + { + err = ss_set_cpu_resume(idx, isPrimary, address); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Request power mode for system-level interfaces including messaging */ +/* units, interconnect, and memories. */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_req_sys_if_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + ASRT_ERR(sys_if <= SC_PM_SYS_IF_DDR, SC_ERR_PARM); + ASRT_ERR((hpm <= SC_PM_PW_MODE_ON) && + (lpm <= SC_PM_PW_MODE_ON) && + (lpm <= hpm), SC_ERR_PARM); + + /* Check ownership */ + OWNED(resource); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Set interface power mode */ + err = ss_req_sys_if_power_mode(idx, sys_if, hpm, lpm); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get functional state of a resource */ +/*--------------------------------------------------------------------------*/ +sc_bool_t pm_is_resource_accessible(sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_RSRC(resource, idx); + + /* Call SS to inquire about the resource */ + if (err == SC_ERR_NONE) + { + rtn = ss_is_rsrc_accessible(idx); + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set rate for a resource's clock (0 = gated) */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_clock_rate(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_CLK(clk); + ASRT_ERR(*rate != 0U, SC_ERR_PARM); + + /* Check ownership */ + ASRT_ERR((caller_pt == SC_PT) || rm_is_ridx_access_allowed(caller_pt, + idx), SC_ERR_NOACCESS); + + /* Call SS to set clock rate */ + if (err == SC_ERR_NONE) + { + err = ss_set_clock_rate(idx, clk, rate); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get rate for a resource's clock (0 = gated) */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_clock_rate(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_CLK(clk); + + if (err == SC_ERR_NONE) + { + /* Call SS to get clock rates */ + err = ss_get_clock_rate(idx, clk, rate); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Enable/disable for a resource's clock */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_clock_enable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + sc_rsrc_t r0 = 0U; + sc_rsrc_t rN = 0U; + sc_pm_power_mode_t mode; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check if resource is powered */ + if (err == SC_ERR_NONE) + { + err = pm_get_resource_power_mode(caller_pt, resource, &mode); + } + if (err == SC_ERR_NONE) + { + if (mode == SC_PM_PW_MODE_OFF) + { + err = SC_ERR_NOPOWER; + } + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0U; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + /* Check parameters */ + BOUND_RSRC(resource, idx); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + } + } + + if (err == SC_ERR_NONE) + { + sc_pm_clk_t c0, cN; + + /* Is one or all clock? */ + if (clk == SC_PM_CLK_ALL) + { + /* Set range to cover all clocks */ + c0 = 0U; + cN = SS_MAX_PM_CLKS - 1U; + } + else + { + /* Check parameters */ + BOUND_CLK(clk); + + /* Set range to cover only the specified clock */ + c0 = clk; + cN = clk; + } + + /* Process range of resources */ + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + sc_pm_clk_t c; + + for (r = r0; r <= rN; r++) + { + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + + /* Check ownership */ + ACCESS_ALLOWED_C(caller_pt, idx); + } + + /* Process range of clocks */ + for (c = c0; c <= cN; c++) + { + err = ss_clock_enable(idx, c, enable, autog); + if (err == SC_ERR_NONE) + { + continue; + } + + /* For all resources, do not return an error */ + if (resource == SC_R_ALL) + { + err = SC_ERR_NONE; + continue; + } + + /* For all clocks, return err only if available */ + if (clk != SC_PM_CLK_ALL) + { + break; + } + if (err != SC_ERR_UNAVAILABLE) + { + break; + } + } + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Force enable of a resource's clock */ +/*--------------------------------------------------------------------------*/ +void pm_force_clock_enable(sc_rsrc_t resource, sc_pm_clk_t clk, + sc_bool_t enable) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_RSRC(resource, idx); + BOUND_CLK(clk); + + if (err == SC_ERR_NONE) + { + /* Call SS to set clock mode */ + (void) ss_force_clock_enable(idx, clk, enable); + } +} + +/*--------------------------------------------------------------------------*/ +/* Set Parent of a resource's clock */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_clock_parent(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t parent) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_CLK(clk); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + /* Call SS to set clock mode */ + err = ss_set_clock_parent(idx, clk, parent); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set Parent of a resource's clock */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_clock_parent(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t *parent) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0U; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + BOUND_CLK(clk); + + if (err == SC_ERR_NONE) + { + /* Call SS to set clock mode */ + err = ss_get_clock_parent(idx, clk, parent); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Boot a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_boot(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, sc_rsrc_t resource_cpu, + sc_faddr_t boot_addr, sc_rsrc_t resource_mu, sc_rsrc_t resource_dev) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t boot_cpu_idx = 0U; + sc_rm_idx_t boot_mu_idx = 0U; + sc_pm_power_mode_t mode = SC_PM_PW_MODE_OFF; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + BOUND_RSRC(resource_cpu, boot_cpu_idx); + BOUND_RSRC(resource_mu, boot_mu_idx); + + /* Check ownership */ + if (rm_get_control_partition(pt) != caller_pt) + { + ANCESTOR(pt); + } + + /* Check CPU and MU ownership */ + OWNER(pt, resource_cpu); + OWNER(pt, resource_mu); + +#ifdef ERR050601_WORKAROUND + /* Block this partition if AP */ + soc_block_ap_set(pt, resource_cpu); +#endif + + /* Power on partition */ + if (err == SC_ERR_NONE) + { + err = pm_update_partition_power_mode(SC_PT, pt, + SC_PM_PW_MODE_ON); + } + + if (err == SC_ERR_NONE) + { + /* Prep CPU */ + main_prep_cpu(resource_cpu, resource_mu); + + /* Check power */ + (void) pm_get_rsrc_power_mode(boot_cpu_idx, &mode); + ASRT_ERR(mode > SC_PM_PW_MODE_STBY, SC_ERR_NOPOWER); + } + + if (err == SC_ERR_NONE) + { + /* Record info */ + pm_part_data[pt].boot_cpu = resource_cpu; + pm_part_data[pt].boot_mu = resource_mu; + pm_part_data[pt].boot_dev = resource_dev; + pm_part_data[pt].boot_addr = boot_addr; + pm_part_data[pt].reason = SC_PM_RESET_REASON_POR; + pm_part_data[pt].reason_pt = SC_PT; + pm_part_data[pt].booted = SC_FALSE; + + /* Set cold boot flag in MU */ + ss_mu_irq(boot_mu_idx, SC_RPC_MU_GIR_BOOT); + + /* Start/stop CPU */ + err = ss_cpu_start(boot_cpu_idx, SC_TRUE, boot_addr); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set partition boot parameters */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_set_boot_parm(sc_rm_pt_t caller_pt, sc_rsrc_t resource_cpu, + sc_faddr_t boot_addr, sc_rsrc_t resource_mu, sc_rsrc_t resource_dev) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check ownership of CPU */ + OWNED(resource_cpu); + + /* Conditionally check ownership of MU */ + if (resource_mu != 0U) + { + OWNED(resource_mu); + } + + /* Conditionally check ownership of boot device */ + if (resource_dev != 0U) + { + OWNED(resource_dev); + } + + if (err == SC_ERR_NONE) + { + /* Record info */ + pm_part_data[caller_pt].boot_cpu = resource_cpu; + pm_part_data[caller_pt].boot_mu = resource_mu; + pm_part_data[caller_pt].boot_dev = resource_dev; + pm_part_data[caller_pt].boot_addr = boot_addr; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get partition boot parameters */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_boot_parm(sc_rm_pt_t caller_pt, sc_rsrc_t *resource_cpu, + sc_faddr_t *boot_addr, sc_rsrc_t *resource_mu, sc_rsrc_t *resource_dev) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Return info */ + *resource_cpu = pm_part_data[caller_pt].boot_cpu; + *resource_mu = pm_part_data[caller_pt].boot_mu; + *resource_dev = pm_part_data[caller_pt].boot_dev; + *boot_addr = pm_part_data[caller_pt].boot_addr; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reboot caller's partition */ +/*--------------------------------------------------------------------------*/ +void pm_reboot(sc_rm_pt_t caller_pt, sc_pm_reset_type_t type) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Reboot partition */ + (void) pm_reboot_part(caller_pt, caller_pt, type, + SC_PM_RESET_REASON_SW, SC_PM_PW_MODE_OFF); + } +} + +/*--------------------------------------------------------------------------*/ +/* Get reset reason */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_reset_reason(sc_rm_pt_t caller_pt, sc_pm_reset_reason_t *reason) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Return reason */ + *reason = pm_part_data[caller_pt].reason; + if (*reason == SC_PM_RESET_REASON_POR) + { + *reason = soc_reset_reason(); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get partition causing reset */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_get_reset_part(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Return part */ + *pt = pm_part_data[caller_pt].reason_pt; + if (pm_part_data[caller_pt].reason == SC_PM_RESET_REASON_POR) + { + *pt = soc_reset_part(); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Start/stop a CPU */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_cpu_start(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t enable, sc_faddr_t address) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t owner_pt = 0U; + sc_rm_idx_t idx = 0U; + sc_pm_power_mode_t mode = SC_PM_PW_MODE_OFF; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Check ownership */ + rm_get_ridx_owner(idx, &owner_pt); + ASRT_ERR(rm_is_parent(caller_pt, owner_pt) || (caller_pt == owner_pt), + SC_ERR_NOACCESS); + } + + if (err == SC_ERR_NONE) + { + /* Check power */ + pm_get_rsrc_power_mode(idx, &mode); + if (enable) + { + ASRT_ERR(mode > SC_PM_PW_MODE_STBY, SC_ERR_NOPOWER); + } + } + + if (err == SC_ERR_NONE) + { + /* Start/stop CPU */ + err = ss_cpu_start(idx, enable, address); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset a CPU */ +/*--------------------------------------------------------------------------*/ +void pm_cpu_reset(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_faddr_t address) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t owner_pt = 0U; + sc_rm_idx_t idx = 0U; + sc_pm_power_mode_t mode = SC_PM_PW_MODE_OFF; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Check ownership */ + rm_get_ridx_owner(idx, &owner_pt); + ASRT_ERR(rm_is_parent(caller_pt, owner_pt) || (caller_pt == owner_pt) + || rm_is_sys_access(caller_pt), SC_ERR_NOACCESS); + } + + if (err == SC_ERR_NONE) + { + /* Check power */ + pm_get_rsrc_power_mode(idx, &mode); + ASRT_ERR(mode > SC_PM_PW_MODE_STBY, SC_ERR_NOPOWER); + } + + if (err == SC_ERR_NONE) + { + /* Stop and start CPU */ + (void) ss_cpu_start(idx, SC_FALSE, address); + (void) ss_cpu_start(idx, SC_TRUE, address); + } +} + +/*--------------------------------------------------------------------------*/ +/* Reset a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_resource_reset(sc_rsrc_t mu, sc_rsrc_t resource) +{ + sc_err_t err; + sc_rm_idx_t idx= 0U; + sc_rm_pt_t caller_pt; + + /* Get calling partition */ + err = rm_get_resource_owner(SC_PT, mu, &caller_pt); + + /* Check to insure not resetting MU we are calling on */ + ASRT_ERR(mu != resource, SC_ERR_PARM); + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check ownership */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + err = ss_rsrc_reset(idx, SC_PT_ALL, SC_FALSE); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reboot a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_reboot_partition(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_reset_type_t type) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + ASRT_ERR(type == SC_PM_RESET_TYPE_COLD, SC_ERR_PARM); + USED_PT(pt); + + /* Check permissions */ + if (rm_get_control_partition(pt) != caller_pt) + { + ASRT_ERR(rm_is_sys_access(caller_pt) || rm_is_parent(caller_pt, pt), + SC_ERR_NOACCESS); + } + + /* Reboot partition */ + if (err == SC_ERR_NONE) + { + err = pm_reboot_part(caller_pt, pt, type, SC_PM_RESET_REASON_SW, + SC_PM_PW_MODE_OFF); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reset system */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_reset(sc_rm_pt_t caller_pt, sc_pm_reset_type_t type) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(type <= SC_PM_RESET_TYPE_BOARD, SC_ERR_PARM); + + /* Check permissions */ + SYSTEM(caller_pt); + + /* Do reset */ + if (err == SC_ERR_NONE) + { + err = board_reset(type, SC_PM_RESET_REASON_SW, caller_pt); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reboot a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_reboot_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_pm_power_mode_t mode) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t boot_cpu_idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + USED_PT(pt); + + /* Bounds check */ + ASRT_ERR(type == SC_PM_RESET_TYPE_COLD, SC_ERR_PARM); + ASRT_ERR(reason <= SC_PM_RESET_REASON_SCFW_FAULT, SC_ERR_PARM); + + /* Check if booted */ + ASRT_ERR(pm_part_data[pt].boot_cpu < SC_NUM_RESOURCE, SC_ERR_FAIL); + + /* Check partition to reboot is isolated */ + ASRT_ERR(rm_is_partition_isolated(pt) != SC_FALSE, + SC_ERR_NOACCESS); + + /* Get boot CPU index */ + BOUND_RSRC(pm_part_data[pt].boot_cpu, boot_cpu_idx); + + if (err == SC_ERR_NONE) + { + /* Prep partition for power off */ + (void) pm_part_off(pt, PM_PART_INIT | PM_PART_REBOOT); + + /* Notify about reboot */ + ss_irq_trigger(SC_IRQ_GROUP_REBOOT, BIT(pt), + SC_PT_ALL); + + /* Call board to allow change in reset or other action */ + board_reboot_part(pt, &type, &reason, &mode, + &pm_part_data[pt].reboot_mask); + + /* Record info */ + pm_part_data[pt].reason = reason; + pm_part_data[pt].reason_pt = caller_pt; + pm_part_data[pt].type = type; + pm_part_data[pt].mode = mode; + + if (pm_part_data[pt].reboot_mask == 0U) + { + /* Continue the reboot now */ + err = pm_reboot_cont(pt); + } + else + { + uint64_t to = U64(board_parameter(BOARD_PARM_REBOOT_TIME)) + * 1000ULL; + + /* Configure timer for timeout */ + err = timer_set_sysctr_alarm(SC_PT, SYSCTR_GetCounter64() + + SYSCTR_USEC_TO_TICKS64(to)); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Indicate okay to conntinue reboot */ +/*--------------------------------------------------------------------------*/ +sc_err_t pm_reboot_continue(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check parms */ + BOUND_PT(pt); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + pm_part_data[pt].reboot_mask &= ~(BIT32(caller_pt)); + + /* Check reboot mask */ + if (pm_part_data[pt].reboot_mask == 0U) + { + /* Cancel timers */ + (void) timer_cancel_sysctr_alarm(SC_PT); + + /* Continue reboot */ + (void) pm_reboot_cont(pt); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Indicate okay to conntinue reboot */ +/*--------------------------------------------------------------------------*/ +void pm_reboot_continue_all(void) +{ + sc_rm_pt_t p; + + (void) timer_cancel_sysctr_alarm(SC_PT); + + /* Notify users of alarm */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (pm_part_data[p].reboot_mask != 0U) + { + pm_part_data[p].reboot_mask = 0U; + + switch (board_reboot_timeout(p)) + { + + case BOARD_REBOOT_TO_NONE : + break; + case BOARD_REBOOT_TO_FORCE : + (void) pm_reboot_cont(p); + break; + case BOARD_REBOOT_TO_FAULT : + (void) board_fault(SC_FALSE, BOARD_BFAULT_REBOOT, p); + break; + default : + ; /* Intentional empty default */ + break; + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the boolean indicating that partition has booted */ +/* this is called by AP ROM code via MISC service */ +/*--------------------------------------------------------------------------*/ +void pm_set_booted(sc_rm_pt_t pt, sc_bool_t booted) +{ + pm_part_data[pt].booted = booted; +} + +/*--------------------------------------------------------------------------*/ +/* Get boolean indicating that partition has booted */ +/*--------------------------------------------------------------------------*/ +sc_bool_t pm_get_booted(sc_rm_pt_t pt) +{ + return pm_part_data[pt].booted; +} + +/*--------------------------------------------------------------------------*/ +/* Get boolean indicating that a partition was started */ +/*--------------------------------------------------------------------------*/ +sc_bool_t pm_is_partition_started(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(pt); + + if ((err == SC_ERR_NONE) && (pm_part_data[pt].boot_cpu + < SC_NUM_RESOURCE)) + { + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Dump PM state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) && defined(DEBUG_PM) + void pm_dump(sc_rm_pt_t pt) + { + } +#endif + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Stop all CPUs owned by a partition */ +/*--------------------------------------------------------------------------*/ +static void ss_cpu_stop_all(sc_rm_pt_t pt) +{ + uint8_t cpu = 15U; + + /* List of CPU resources */ + static const sc_rsrc_t cpu_list[15] = + { + /* AP 0 cores */ + SC_R_AP_0_0, + SC_R_AP_0_1, + SC_R_AP_0_2, + SC_R_AP_0_3, + /* AP 1 cores */ + SC_R_AP_1_0, + SC_R_AP_1_1, + /* AP 2 cores */ + SC_R_AP_2_0, + SC_R_AP_2_1, + SC_R_AP_2_2, + SC_R_AP_2_3, + /* MCU cores */ + SC_R_MCU_0_PID0, + SC_R_MCU_1_PID0, + /* Clusters */ + SC_R_AP_0, + SC_R_AP_1, + SC_R_AP_2 + }; + + /* Loop over all CPUs */ + while (cpu > 0U) + { + sc_rm_idx_t idx; + + cpu--; + + /* Check for existance */ + if (rm_check_map_ridx(cpu_list[cpu], &idx) != SC_FALSE) + { + sc_rm_pt_t owner_pt = SC_PT; + + /* Check ownership */ + rm_get_ridx_owner(idx, &owner_pt); + if (owner_pt == pt) + { + if (soc_cluster_link_off(cpu_list[cpu], pt) == SC_FALSE) + { + (void) ss_cpu_start(idx, SC_FALSE, 0ULL); + } + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Reboot a partition */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pm_reboot_cont(sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_rsrc_t boot_cpu = pm_part_data[pt].boot_cpu; + sc_rsrc_t boot_mu = pm_part_data[pt].boot_mu; + sc_rsrc_t boot_dev = pm_part_data[pt].boot_dev; + sc_faddr_t boot_addr = pm_part_data[pt].boot_addr; + + /* Check boot CPU */ + if (rm_check_map_ridx(boot_cpu, NULL) == SC_FALSE) + { + err = SC_ERR_PARM; + } + + if (err == SC_ERR_NONE) + { + /* Allow board file to disable UART */ + board_disable_debug_uart(); + } + + if ((err == SC_ERR_NONE) + && (pm_part_data[pt].type != SC_PM_RESET_TYPE_WARM)) + { + /* Check power state */ + if (pm_part_data[pt].sys_mode != SC_PM_PW_MODE_OFF) + { + base_nopoweroff = SC_TRUE; + + /* Turn off */ + err = pm_part_off(pt, PM_PART_FINAL| PM_PART_REBOOT); + } + + /* Power on partition */ + if (err == SC_ERR_NONE) + { + err = pm_update_partition_power_mode(SC_PT, pt, + SC_PM_PW_MODE_ON); + } + + /* Call board to allow change in boot or other action */ + if (err == SC_ERR_NONE) + { + board_reboot_part_cont(pt, &boot_cpu, &boot_mu, &boot_dev, + &boot_addr); + } + + /* Check for error */ + if (err == SC_ERR_NONE) + { + uint32_t indx; + + /* Power on boot peripherals */ + main_prep_cpu(boot_cpu, boot_mu); + + /* Power on boot memory (FSPI, OCRAM, TCM) */ + if (main_get_mem_ss(boot_addr, &indx) == SC_ERR_NONE) + { + sc_rsrc_t rsrc = rom_boot_addr[indx].rsrc; + + if (rsrc != SC_R_DRC_0) + { + pm_force_resource_power_mode_v( + rom_boot_addr[indx].rsrc, SC_PM_PW_MODE_ON); + } + } + } + + base_nopoweroff = SC_FALSE; + } + + /* Allow board file to re-enable UART */ + board_config_debug_uart(SC_TRUE); + board_config_debug_uart(SC_FALSE); + + if (err == SC_ERR_NONE) + { + sc_rm_idx_t boot_cpu_idx, boot_mu_idx; + + /* Get boot CPU index */ + BOUND_RSRC(boot_cpu, boot_cpu_idx); + + /* Set cold boot flag in MU */ + if (rm_check_map_ridx(boot_mu, &boot_mu_idx) + != SC_FALSE) + { + ss_mu_irq(boot_mu_idx, SC_RPC_MU_GIR_BOOT); + } + + ss_irq_trigger(SC_IRQ_GROUP_REBOOTED, BIT(pt), + SC_PT_ALL); + + /* Restart CPU */ + if (err == SC_ERR_NONE) + { + err = ss_cpu_start(boot_cpu_idx, SC_TRUE, boot_addr); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Power off a partition */ +/*--------------------------------------------------------------------------*/ +static sc_err_t pm_part_off(sc_rm_pt_t pt, uint32_t flags) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check current power state */ + if (pm_part_data[pt].sys_mode != SC_PM_PW_MODE_OFF) + { + /* Power off init phase */ + if ((flags & PM_PART_INIT) != 0U) + { + /* Cancel watchdog */ + timer_halt_wdog(pt); + + /* Cancel alarms */ + (void) timer_cancel_rtc_alarm(pt); + (void) timer_cancel_sysctr_alarm(pt); + + /* Stop all CPUs owned by this partition */ + ss_cpu_stop_all(pt); + + /* Send off notice if not rebooting */ + if ((flags & PM_PART_REBOOT) == 0U) + { + ss_irq_trigger(SC_IRQ_GROUP_OFF, BIT(pt), + SC_PT_ALL);; + } + } + + /* Power off final phase */ + if ((flags & PM_PART_FINAL) != 0U) + { + soc_no_reset = SC_TRUE; + base_noflushl2 = SC_TRUE; + base_gic_noblock = SC_TRUE; + + /* Reset resources that need power on */ + (void) ss_rsrc_reset(0U, pt, SC_TRUE); + + /* Power off */ + err = pm_update_partition_power_mode(SC_PT, pt, + SC_PM_PW_MODE_OFF); + + if (err == SC_ERR_NONE) + { + sc_rm_pt_t p; + + /* Free all child partitions */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if ((rm_is_partition_used(p) != SC_FALSE) + && (rm_is_parent(pt, p) != SC_FALSE)) + { + /* Stop all CPUs */ + ss_cpu_stop_all(p); + + /* Power off partition */ + (void) pm_update_partition_power_mode(SC_PT, + p, SC_PM_PW_MODE_OFF); + + /* Free partition */ + (void) rm_partition_free(SC_PT, p); + } + } + + /* Power off all peripherals */ + (void) pm_set_resource_power_mode_pt(pt, SC_R_ALL, + SC_PM_PW_MODE_OFF); + + /* Reset partition resources still on */ + (void) ss_rsrc_reset(0U, pt, SC_FALSE); + } + + soc_no_reset = SC_FALSE; + base_noflushl2 = SC_FALSE; + base_gic_noblock = SC_FALSE; + + if ((flags & PM_PART_REBOOT) == 0U) + { + /* Unless partition is rebooting, update HMP power state to + * remove requests for HMP nodes powered off. + * + * NOTE: must be done after soc_no_reset set FALSE to avoid + * skip of OCMEM system interfaces + */ + soc_update_hmp_sys_power_mode(); + + /* Send off complete notice if not rebooting */ + ss_irq_trigger(SC_IRQ_GROUP_OFFED, BIT(pt), + SC_PT_ALL);; + } + } + } + + return err; +} + +/** @} */ + diff --git a/platform/svc/pm/svc.h b/platform/svc/pm/svc.h new file mode 100755 index 0000000..7616e14 --- /dev/null +++ b/platform/svc/pm/svc.h @@ -0,0 +1,564 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/pm/svc.h + * + * Header file containing the API for the System Controller (SC) Power + * Management (PM) function. This includes functions for power state + * control, clock control, reset control, and wake-up event control. + * + * @addtogroup PM_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_PM_SVC_H +#define SC_PM_SVC_H + +/* Includes */ + +#include "main/main.h" +#include "svc/pm/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/* + * Internal SC function that sets the boolean indicating that partition has booted. + * + * @param[in] pt handle of partition to set + * @param[in] booted boolean: true indicates that partition has booted + */ +void pm_set_booted(sc_rm_pt_t pt, sc_bool_t booted); + +/* + * Internal SC function that gets boolean indicating that partition has booted. + * + * @param[in] caller_pt handle of partition to check + * + * @return Returns a boolean that indicates if partition has booted + */ +sc_bool_t pm_get_booted(sc_rm_pt_t pt); + +/*! + * Internal SC function to initializes the PM service. + * + * @param[in] api_phase init phase + * + * Initializes the API if /a api_phase = SC_TRUE, otherwise initializes the HW + * managed by the PM service. API must be initialized before anything else is + * done with the service. + */ +void pm_init(sc_bool_t api_phase); + +/*! + * This function initializes a new partition. + * + * @param[in] caller_pt handle of caller partition + * @param[in] pt handle of partition + * + * Note this function should only be called by the resource manager when + * a new partition is allocated. The default power mode is on. + */ +void pm_init_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to set the power mode of the system. + * + * @see sc_pm_set_sys_power_mode(). + */ +sc_err_t pm_set_sys_power_mode(sc_rm_pt_t caller_pt, + sc_pm_power_mode_t mode); + +/*! + * This function initializes a partition to off. + * + * @param[in] pt handle of partition + * + * Note this function should only be called immediatly after creating a new + * partition that should be off (default after creating is on). + */ +void pm_init_partition_power_off(sc_rm_pt_t pt); + +/*! + * Internal SC function to set the power mode of a partition. + * + * @see sc_pm_set_partition_power_mode(). + */ +sc_err_t pm_set_partition_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to set the power mode of a partition. + * + * @see sc_pm_partition_power_off(). + */ +void pm_partition_power_off(sc_rm_pt_t caller_pt); + +/*! + * Internal function to updates the power mode of a partition. + * + * @param[in] caller_pt handle of partition to update + * @param[in] pt handle of partition + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition or mode, + * - SC_ERR_NOACCESS if caller's partition is not the owner or + * parent of \a pt + * + * The power mode of the partitions is a max power any resource will + * be set to. Calling this will result in all resources owned + * by \a pt to have their power changed to the lower of \a mode or the + * individual resource mode set using sc_pm_set_resource_power_mode(). + */ +sc_err_t pm_update_partition_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to send wake interrupt to a partition. + * + * @see sc_pm_partition_wake(). + */ +sc_err_t pm_partition_wake(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to get the power mode of a partition. + * + * @see sc_pm_get_sys_power_mode(). + */ +sc_err_t pm_get_sys_power_mode(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_power_mode_t *mode); + +/*! + * Internal SC function to update the power state of a resource. + * + * @param[in] idx unified resource index + * + * Used to update when a partition changes state or resource is moved. + */ +void pm_update_ridx(sc_rm_idx_t idx); + +/*! + * Internal SC function to get the functional state of a resource. + * + * @param[in] resource unified resource index + * + * @return Returns a boolean (SC_TRUE = functional). + * + * Used to see if a resource is ready to be used. + */ +sc_bool_t pm_is_resource_accessible(sc_rsrc_t resource); + +/*! + * Internal SC function to init the power mode of a resource just after ROM boot + */ +void pm_init_rsrc_power_mode(sc_rsrc_t rsrc, sc_pm_power_mode_t mode); + +/*! + * Internal SC function to set the power mode of a resource via MU. + * + * @see sc_pm_set_resource_power_mode(). + */ +sc_err_t pm_set_resource_power_mode(sc_rsrc_t mu, + sc_rsrc_t resource, sc_pm_power_mode_t mode); + +/*! + * Internal function set the power mode of a resource based via pt. + * + * @param[in] pt partition of resource + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * @see sc_pm_set_resource_power_mode(). + */ +sc_err_t pm_set_resource_power_mode_pt(sc_rm_pt_t caller_pt, + sc_rsrc_t resource, sc_pm_power_mode_t mode); + +/*! + * Internal SC function to set power mode for all resources in a child + * partition. + * + * @see sc_pm_set_resource_power_mode_all(). + */ +sc_err_t pm_set_resource_power_mode_all(sc_rm_pt_t caller_pt, + sc_rm_pt_t pt, sc_pm_power_mode_t mode, sc_rsrc_t exclude); + +/*! + * This function sets the power mode of a resource index. + * + * @param[in] idx index of the resource + * @param[in] mode power mode to apply + */ +void pm_set_rsrc_power_mode(sc_rm_idx_t idx, + sc_pm_power_mode_t mode); + +/*! + * This function updates the power mode of a resource index. + * + * @param[in] idx index of the resource + * @param[in] mode power mode to apply + */ +void pm_set_active_rsrc_power_mode(sc_rm_idx_t idx, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to force the power mode of a resource. It + * should only be called by the SC during initial configuration. + * + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid resource or mode + * + * Note only SC_PM_PW_MODE_OFF and SC_PM_PW_MODE_ON are valid. Other modes + * will return an error. Resources set to SC_PM_PW_MODE_ON will reflect the + * power mode of the partition and will change as that changes. + * + * @see sc_pm_set_partition_power_mode(). + */ +sc_err_t pm_force_resource_power_mode(sc_rsrc_t resource, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to force the power mode of a resource. It + * should only be called by the SC during initial configuration. + * + * @param[in] resource ID of the resource + * @param[in] mode power mode to apply + * + * @see sc_pm_set_partition_power_mode(). + */ +void pm_force_resource_power_mode_v(sc_rsrc_t resource, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to get the power mode of a resource. + * + * @see sc_pm_get_resource_power_mode(). + */ +sc_err_t pm_get_resource_power_mode(sc_rm_pt_t caller_pt, + sc_rsrc_t resource, sc_pm_power_mode_t *mode); + +/*! + * This function gets the power mode of a resource index. + * + * @param[in] idx index of the resource + * @param[in] mode power mode to apply + */ +void pm_get_rsrc_power_mode(sc_rm_idx_t idx, + sc_pm_power_mode_t *mode); + +/*! + * This function gets the active power mode of a resource index. + * + * @param[in] idx index of the resource + * @param[in] mode active power mode for the resource + */ +void pm_get_active_rsrc_power_mode(sc_rm_idx_t idx, + sc_pm_power_mode_t *mode); + +/*! + * Internal SC function to request the power mode a resource can enter + * in some low power conditions. + * + * @see sc_pm_req_low_power_mode(). + */ +sc_err_t pm_req_low_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to request low-power mode for a CPU. + * + * @see sc_pm_req_cpu_low_power_mode(). + */ +sc_err_t pm_req_cpu_low_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_power_mode_t mode, sc_pm_wake_src_t wake_src); + +/*! + * Internal SC function to set the resume address of a CPU. + * + * @see sc_pm_set_cpu_resume_addr(). + */ +sc_err_t pm_set_cpu_resume_addr(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_faddr_t address); + +/*! + * Internal SC function to set the resume parameters of a CPU. + * + * @see sc_pm_set_cpu_resume(). + */ +sc_err_t pm_set_cpu_resume(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t isPrimary, sc_faddr_t address); + +/*! + * Internal SC function to request power mode for system-level interfaces. + * + * @see pm_req_sys_if_power_mode(). + */ +sc_err_t pm_req_sys_if_power_mode(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_sys_if_t sys_if, sc_pm_power_mode_t hpm, sc_pm_power_mode_t lpm); + +/*! + * Internal SC function to set the rate of a resource's clock/PLL. + * + * @see sc_pm_set_clock_rate(). + */ +sc_err_t pm_set_clock_rate(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); + +/*! + * Internal SC function to get the rate of a resource's clock/PLL. + * + * @see sc_pm_get_clock_rate(). + */ +sc_err_t pm_get_clock_rate(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clock_rate_t *rate); + +/*! + * Internal SC function to enable/disable a resource's clock. + * + * @see sc_pm_clock_enable(). + */ +sc_err_t pm_clock_enable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog); + +/*! + * Internal SC function to force a resource's clock to be enabled. + * + * @param[in] resource ID of the resource + * @param[in] clk clock to affect + * @param[in] enable enable if SC_TRUE; otherwise depends on + * state from pm_clock_enable() + * + * Refer to the [Clock List](@ref CLOCKS) for valid clock values. + */ +void pm_force_clock_enable(sc_rsrc_t resource, sc_pm_clk_t clk, + sc_bool_t enable); + +/*! + * Internal SC function to set a clock parent. + * + * @see sc_pm_set_clock_parent(). + */ +sc_err_t pm_set_clock_parent(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t parent); + +/*! + * Internal SC function to get a clock parent. + * + * @see sc_pm_get_clock_parent(). + */ +sc_err_t pm_get_clock_parent(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_pm_clk_t clk, sc_pm_clk_parent_t *parent); + +/*! + * Internal SC function to boot a partition. + * + * @see sc_pm_boot(). + */ +sc_err_t pm_boot(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, + sc_rsrc_t resource_mu, sc_rsrc_t resource_dev); + +/*! + * Internal SC function to set a partition's boot parameters. + * + * @see sc_pm_set_boot_parm(). + */ +sc_err_t pm_set_boot_parm(sc_rm_pt_t caller_pt, + sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, + sc_rsrc_t resource_mu, sc_rsrc_t resource_dev); + +/*! + * Internal SC function used to get the boot parameters for a partition. + * + * @param[in] caller_pt calling partition + * @param[out] resource_cpu pointer to return the ID of the CPU resource to start + * @param[out] boot_addr pointer to return the 64-bit boot address + * @param[out] resource_mu pointer to return the ID of the MU that must be powered (0=none) + * @param[out] resource_dev pointer to return the ID of the boot device that must be powered (0=none) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid caller_pt + */ +sc_err_t pm_get_boot_parm(sc_rm_pt_t caller_pt, + sc_rsrc_t *resource_cpu, sc_faddr_t *boot_addr, + sc_rsrc_t *resource_mu, sc_rsrc_t *resource_dev); + +/*! + * Internal SC function to reboot the caller's partition. + * + * @see sc_pm_reboot(). + */ +void pm_reboot(sc_rm_pt_t caller_pt, sc_pm_reset_type_t type); + +/*! + * Internal SC function to get the reset reason. + * + * @see sc_pm_reset_reason(). + */ +sc_err_t pm_reset_reason(sc_rm_pt_t caller_pt, + sc_pm_reset_reason_t *reason); + +/*! + * Internal SC function to get the partition that caused a reset. + * + * @see sc_pm_get_reset_part(). + */ +sc_err_t pm_get_reset_part(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt); + +/*! + * Internal SC function to start/stop a CPU. + * + * @see sc_pm_cpu_start(). + */ +sc_err_t pm_cpu_start(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t enable, sc_faddr_t address); + +/*! + * Internal SC function to reset a CPU. + * + * @see sc_pm_cpu_reset(). + */ +void pm_cpu_reset(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_faddr_t address); + +/*! + * Internal SC function to reset a resource. + * + * @see sc_pm_resource_reset(). + */ + sc_err_t pm_resource_reset(sc_rsrc_t mu, sc_rsrc_t resource); + +/*! + * Internal SC function to reboot a partition. + * + * @see sc_pm_reboot_partition(). + */ +sc_err_t pm_reboot_partition(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_reset_type_t type); + +/*! + * Internal SC function to conntinue reboot. + * + * @see sc_reboot_continue(). + */ +sc_err_t pm_reboot_continue(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! +* Internal SC function to force the conntinue of all reboots. +*/ +void pm_reboot_continue_all(void); + +/*! + * Internal SC function to reset the system. + * + * @see sc_pm_reset(). + */ +sc_err_t pm_reset(sc_rm_pt_t caller_pt, sc_pm_reset_type_t type); + +/*! + * Internal SC function used to reboot a partition. + * + * @param[in] caller_pt calling partition + * @param[in] pt handle of partition to reboot + * @param[in] type reset type + * @param[in] reason reset reason + * @param[in] mode power mode to go down to as part of reboot + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid partition or reason + * + * Most peripherals owned by the partition will be reset if + * possible. SC state (partitions, power, clocks, etc.) is reset. The + * boot SW of the booting CPU must be able to handle peripherals that + * that are not reset. + */ +sc_err_t pm_reboot_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pm_reset_type_t type, sc_pm_reset_reason_t reason, + sc_pm_power_mode_t mode); + +/*! + * Internal SC function to get boolean indicating that a partition was + * started. + * + * @see sc_pm_is_partition_started(). + */ +sc_bool_t pm_is_partition_started(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/** @} */ + +#if defined(DEBUG) && defined(DEBUG_PM) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal state of the PM service. + * + * @param[in] pt partition to dump + */ + void pm_dump(sc_rm_pt_t pt); + + /** @} */ +#endif + +#endif /* SC_PM_SVC_H */ + +/** @} */ + diff --git a/platform/svc/rm/Makefile b/platform/svc/rm/Makefile new file mode 100755 index 0000000..1876cc6 --- /dev/null +++ b/platform/svc/rm/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/rm/svc.o + +RPCS += $(OUT)/svc/rm/rpc_srv.o + +RPCL += $(OUT)/svc/rm/rpc_clnt.o + +RPCH += $(SRC)/svc/rm/rpc.h + +RPCC += $(SRC)/svc/rm/rpc_srv.c \ + $(SRC)/svc/rm/rpc_clnt.c \ + $(SRC)/svc/rm/rpc_xlate.c + +RPCHDR += $(SRC)/svc/rm/rpc_header.h + +DIRS += $(OUT)/svc/rm + diff --git a/platform/svc/rm/api.h b/platform/svc/rm/api.h new file mode 100755 index 0000000..1d2e5e4 --- /dev/null +++ b/platform/svc/rm/api.h @@ -0,0 +1,972 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/rm/api.h + * + * Header file containing the public API for the System Controller (SC) + * Resource Management (RM) function. This includes functions for + * partitioning resources, pads, and memory regions. + * + * @addtogroup RM_SVC RM: Resource Management Service + * + * @brief Module for the Resource Management (RM) service. + * + * @includedoc rm/details.dox + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_RM_API_H +#define SC_RM_API_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_RM_PARTITION_W 5U /*!< Width of sc_rm_pt_t */ +#define SC_RM_MEMREG_W 6U /*!< Width of sc_rm_mr_t */ +#define SC_RM_DID_W 4U /*!< Width of sc_rm_did_t */ +#define SC_RM_SID_W 6U /*!< Width of sc_rm_sid_t */ +#define SC_RM_SPA_W 2U /*!< Width of sc_rm_spa_t */ +#define SC_RM_PERM_W 3U /*!< Width of sc_rm_perm_t */ +#define SC_RM_DET_W 1U /*!< Width of sc_rm_det_t */ +#define SC_RM_RMSG_W 4U /*!< Width of sc_rm_rmsg_t */ +/** @} */ + +/*! + * @name Defines for ALL parameters + */ +/** @{ */ +#define SC_RM_PT_ALL ((sc_rm_pt_t) UINT8_MAX) /*!< All partitions */ +#define SC_RM_MR_ALL ((sc_rm_mr_t) UINT8_MAX) /*!< All memory regions */ +/** @} */ + +/*! + * @name Defines for sc_rm_spa_t + */ +/** @{ */ +#define SC_RM_SPA_PASSTHRU 0U /*!< Pass through (attribute driven by master) */ +#define SC_RM_SPA_PASSSID 1U /*!< Pass through and output on SID */ +#define SC_RM_SPA_ASSERT 2U /*!< Assert (force to be secure/privileged) */ +#define SC_RM_SPA_NEGATE 3U /*!< Negate (force to be non-secure/user) */ +/** @} */ + +/*! + * @name Defines for sc_rm_perm_t + */ +/** @{ */ +#define SC_RM_PERM_NONE 0U /*!< No access */ +#define SC_RM_PERM_SEC_R 1U /*!< Secure RO */ +#define SC_RM_PERM_SECPRIV_RW 2U /*!< Secure privilege R/W */ +#define SC_RM_PERM_SEC_RW 3U /*!< Secure R/W */ +#define SC_RM_PERM_NSPRIV_R 4U /*!< Secure R/W, non-secure privilege RO */ +#define SC_RM_PERM_NS_R 5U /*!< Secure R/W, non-secure RO */ +#define SC_RM_PERM_NSPRIV_RW 6U /*!< Secure R/W, non-secure privilege R/W */ +#define SC_RM_PERM_FULL 7U /*!< Full access */ +/** @} */ + +/* Types */ + +/*! + * This type is used to declare a resource partition. + */ +typedef uint8_t sc_rm_pt_t; + +/*! + * This type is used to declare a memory region. + */ +typedef uint8_t sc_rm_mr_t; + +/*! + * This type is used to declare a resource domain ID used by the + * isolation HW. + */ +typedef uint8_t sc_rm_did_t; + +/*! + * This type is used to declare an SMMU StreamID. + */ +typedef uint16_t sc_rm_sid_t; + +/*! + * This type is a used to declare master transaction attributes. + */ +typedef uint8_t sc_rm_spa_t; + +/*! + * This type is used to declare a resource/memory region access permission. + * Refer to the XRDC2 Block Guide for more information. + */ +typedef uint8_t sc_rm_perm_t; + +/*! + * This type is used to indicate memory region transactions should detour + * to the IEE. + */ +typedef uint8_t sc_rm_det_t; + +/*! + * This type is used to assign an RMSG value to a memory region. This value + * is sent to the IEE. + */ +typedef uint8_t sc_rm_rmsg_t; + +/* Functions */ + +/*! + * @name Partition Functions + * @{ + */ + +/*! + * This function requests that the SC create a new resource partition. + * + * @param[in] ipc IPC handle + * @param[out] pt return handle for partition; + used for subsequent function + * calls associated with this partition + * @param[in] secure boolean indicating if this partition should be secure; + only valid if caller is secure + * @param[in] isolated boolean indicating if this partition should be HW isolated + * via XRDC; set SC_TRUE if new DID is desired + * @param[in] restricted boolean indicating if this partition should be restricted; + * set SC_TRUE if masters in this partition cannot create new partitions + * @param[in] grant boolean indicating if this partition should always grant + * access and control to the parent + * @param[in] coherent boolean indicating if this partition is coherent; + * set SC_TRUE if only this partition will contain both AP clusters + * and they will be coherent via the CCI + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_ERR_PARM if caller's partition is not secure but a new secure partition is requested, + * - SC_ERR_LOCKED if caller's partition is locked, + * - SC_ERR_UNAVAILABLE if partition table is full (no more allocation space) + * + * Marking as non-secure prevents subsequent functions from configuring masters in this + * partition to assert the secure signal. Basically, if TrustZone SW is used, the Cortex-A + * cores and peripherals the TZ SW will use should be in a secure partition. Almost all + * other partitions (for a non-secure OS or MCU cores) should be in non-secure partitions. + * + * Isolated should be true for almost all partitions. The exception is the non-secure + * partition for a Cortex-A core used to run a non-secure OS. This isn't isolated by + * domain but is instead isolated by the TZ security hardware. + * + * If restricted then the new partition is limited in what functions it can call, + * especially those associated with managing partitions. + * + * The grant option is usually used to isolate a bus master's traffic to specific + * memory without isolating the peripheral interface of the master or the API + * controls of that master. This is only used when creating a sub-partition with + * no CPU. It's useful to separate out a master and the memory it uses. + */ +/* IDL: E8 PARTITION_ALLOC(UO8 pt, IB secure, IB isolated, IB restricted, IB grant, IB coherent) #1 */ +sc_err_t sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure, + sc_bool_t isolated, sc_bool_t restricted, sc_bool_t grant, sc_bool_t coherent); + +/*! + * This function makes a partition confidential. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition that is granting + * @param[in] retro retroactive + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if \a pt out of range, + * - SC_ERR_NOACCESS if caller's not allowed to change \a pt + * - SC_ERR_LOCKED if partition \a pt is locked + * + * Call to make a partition confidential. Confidential means only this + * partition should be able to grant access permissions to this partition. + * + * If retroactive, then all resources owned by other partitions will have + * access rights for this partition removed, even if locked. + */ +/* IDL: E8 SET_CONFIDENTIAL(UI8 pt, IB retro) #31 */ +sc_err_t sc_rm_set_confidential(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t retro); + +/*! + * This function frees a partition and assigns all resources to the caller. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to free + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if \a pt out of range or invalid, + * - SC_ERR_NOACCESS if \a pt is the SC partition, + * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt, + * - SC_ERR_LOCKED if \a pt or caller's partition is locked + * + * All resources, memory regions, and pads are assigned to the caller/parent. + * The partition watchdog is disabled (even if locked). DID is freed. + */ +/* IDL: E8 PARTITION_FREE(UI8 pt) #2 */ +sc_err_t sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt); + +/*! + * This function returns the DID of a partition. + * + * @param[in] ipc IPC handle + * + * @return Returns the domain ID (DID) of the caller's partition. + * + * The DID is a SoC-specific internal ID used by the HW resource + * protection mechanism. It is only required by clients when using the + * SEMA42 module as the DID is sometimes connected to the master ID. + */ +/* IDL: UR8 GET_DID() #26 */ +sc_rm_did_t sc_rm_get_did(sc_ipc_t ipc); + +/*! + * This function forces a partition to use a specific static DID. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to assign \a did + * @param[in] did static DID to assign + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if \a pt or \a did out of range, + * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt, + * - SC_ERR_LOCKED if \a pt is locked + * + * Assumes no assigned resources or memory regions yet! The number of static + * DID is fixed by the SC at boot. + */ +/* IDL: E8 PARTITION_STATIC(UI8 pt, UI8 did) #3 */ +sc_err_t sc_rm_partition_static(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_rm_did_t did); + +/*! + * This function locks a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to lock + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if \a pt out of range, + * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt + * + * If a partition is locked it cannot be freed, have resources/pads assigned + * to/from it, memory regions created/assigned, DID changed, or parent changed. + */ +/* IDL: E8 PARTITION_LOCK(UI8 pt) #4 */ +sc_err_t sc_rm_partition_lock(sc_ipc_t ipc, sc_rm_pt_t pt); + +/*! + * This function gets the partition handle of the caller. + * + * @param[in] ipc IPC handle + * @param[out] pt return handle for caller's partition + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 GET_PARTITION(UO8 pt) #5 */ +sc_err_t sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt); + +/*! + * This function sets a new parent for a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition for which parent is to be changed + * @param[in] pt_parent handle of partition to set as parent + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt, + * - SC_ERR_LOCKED if either partition is locked + */ +/* IDL: E8 SET_PARENT(UI8 pt, UI8 pt_parent) #6 */ +sc_err_t sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_rm_pt_t pt_parent); + +/*! + * This function moves all movable resources/pads owned by a source partition + * to a destination partition. It can be used to more quickly set up a new + * partition if a majority of the caller's resources are to be moved to a + * new partition. + * + * @param[in] ipc IPC handle + * @param[in] pt_src handle of partition from which resources should be moved from + * @param[in] pt_dst handle of partition to which resources should be moved to + * @param[in] move_rsrc boolean to indicate if resources should be moved + * @param[in] move_pads boolean to indicate if pads should be moved + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * By default, all resources are movable. This can be changed using the + * sc_rm_set_resource_movable() function. Note all masters defaulted to SMMU + * bypass. + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not \a pt_src or the + * parent of \a pt_src, + * - SC_ERR_LOCKED if either partition is locked + */ +/* IDL: E8 MOVE_ALL(UI8 pt_src, UI8 pt_dst, IB move_rsrc, IB move_pads) #7 */ +sc_err_t sc_rm_move_all(sc_ipc_t ipc, sc_rm_pt_t pt_src, sc_rm_pt_t pt_dst, + sc_bool_t move_rsrc, sc_bool_t move_pads); + +/** @} */ + +/*! + * @name Resource Functions + * @{ + */ + +/*! + * This function assigns ownership of a resource to a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition to which resource should be assigned + * @param[in] resource resource to assign + * + * This function assigned a resource to a partition. This partition is then + * the owner. All resources always have an owner (one owner). The owner + * has various rights to make API calls affecting the resource. Ownership + * does not imply access to the peripheral itself (that is based on access + * rights). + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * This action resets the resource's master and peripheral attributes. + * Privilege attribute will be PASSTHRU, security attribute will be + * ASSERT if the partition is secure and NEGATE if it is not, and + * masters will defaulted to SMMU bypass. Access permissions will reset + * to SEC_RW for the owning partition only for secure partitions, FULL for + * non-secure. Default is no access by other partitions. + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition or \a pt is locked + */ +/* IDL: E8 ASSIGN_RESOURCE(UI8 pt, UI16 resource) #8 */ +sc_err_t sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_rsrc_t resource); + +/*! + * This function flags resources as movable or not. + * + * @param[in] ipc IPC handle + * @param[in] resource_fst first resource for which flag should be set + * @param[in] resource_lst last resource for which flag should be set + * @param[in] movable movable flag (SC_TRUE is movable) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if resources are out of range, + * - SC_ERR_NOACCESS if caller's partition is not a parent of a resource owner, + * - SC_ERR_LOCKED if the owning partition is locked + * + * This function is used to determine the set of resources that will be + * moved using the sc_rm_move_all() function. All resources are movable + * by default so this function is normally used to prevent a set of + * resources from moving. + */ +/* IDL: E8 SET_RESOURCE_MOVABLE(UI16 resource_fst, UI16 resource_lst, IB movable) #9 */ +sc_err_t sc_rm_set_resource_movable(sc_ipc_t ipc, sc_rsrc_t resource_fst, + sc_rsrc_t resource_lst, sc_bool_t movable); + +/*! + * This function flags all of a subsystem's resources as movable + * or not. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to use to identify subsystem + * @param[in] movable movable flag (SC_TRUE is movable) + * + * A subsystem is a physical grouping within the chip of related resources; + * this is SoC specific. This function is used to optimize moving resource + * for these groupings, for instance, an MCU core and its associated resources. + * The list of subsystems and associated resources can be found in the + * SoC-specific API document [Resources](@ref RESOURCES) chapter. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if a function argument is out of range + * + * Note \a resource is used to find the associated subsystem. Only + * resources owned by the caller are set. + */ +/* IDL: E8 SET_SUBSYS_RSRC_MOVABLE(UI16 resource, IB movable) #28 */ +sc_err_t sc_rm_set_subsys_rsrc_movable(sc_ipc_t ipc, sc_rsrc_t resource, + sc_bool_t movable); + +/*! + * This function sets attributes for a resource which is a bus master (i.e. + * capable of DMA). + * + * @param[in] ipc IPC handle + * @param[in] resource master resource for which attributes should apply + * @param[in] sa security attribute + * @param[in] pa privilege attribute + * @param[in] smmu_bypass SMMU bypass mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not a parent of the resource owner, + * - SC_ERR_LOCKED if the owning partition is locked + * + * Masters are IP blocks that generate bus transactions. This function configures + * how the isolation HW will define these bus transactions from the specified master. + * Note the security attribute will only be changed if the caller's partition is + * secure. + * + * Note an IP block can be both a master and peripheral (have both a programming model + * and generate bus transactions). + */ +/* IDL: E8 SET_MASTER_ATTRIBUTES(UI16 resource, UI8 sa, UI8 pa, IB smmu_bypass) #10 */ +sc_err_t sc_rm_set_master_attributes(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_spa_t sa, sc_rm_spa_t pa, sc_bool_t smmu_bypass); + +/*! + * This function sets the StreamID for a resource which is a bus master (i.e. + * capable of DMA). + * + * @param[in] ipc IPC handle + * @param[in] resource master resource for which attributes should apply + * @param[in] sid StreamID + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition is locked + * + * This function configures the SID attribute associated with all bus transactions + * from this master. Note 0 is not a valid SID as it is reserved to indicate + * bypass. + */ +/* IDL: E8 SET_MASTER_SID(UI16 resource, UI16 sid) #11 */ +sc_err_t sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_sid_t sid); + +/*! + * This function sets access permissions for a peripheral resource. + * + * @param[in] ipc IPC handle + * @param[in] resource peripheral resource for which permissions should apply + * @param[in] pt handle of partition \a perm should by applied for + * @param[in] perm permissions to apply to \a resource for \a pt + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition is locked + * - SC_ERR_LOCKED if the \a pt is confidential and the caller isn't \a pt + * + * Peripherals are IP blocks that have a programming model that can be + * accessed. + * + * This function configures how the isolation HW will restrict access to a + * peripheral based on the attributes of a transaction from bus master. It + * also allows the access permissions of SC_R_SYSTEM to be set. + * + * Note an IP block can be both a master and peripheral (have both a programming + * model and generate bus transactions). + */ +/* IDL: E8 SET_PERIPHERAL_PERMISSIONS(UI16 resource, UI8 pt, UI8 perm) #12 */ +sc_err_t sc_rm_set_peripheral_permissions(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_pt_t pt, sc_rm_perm_t perm); + +/*! + * This function gets ownership status of a resource. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to check + * + * @return Returns a boolean (SC_TRUE if caller's partition owns the resource). + * + * If \a resource is out of range then SC_FALSE is returned. + */ +/* IDL: RB IS_RESOURCE_OWNED(UI16 resource) #13 */ +sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource); + +/*! + * This function is used to get the owner of a resource. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to check + * @param[out] pt pointer to return owning partition + * + * @return Returns a boolean (SC_TRUE if the resource is a bus master). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid + * + * If \a resource is out of range then SC_ERR_PARM is returned. + */ +/* IDL: E8 GET_RESOURCE_OWNER(UI16 resource, UO8 pt) #33 */ +sc_err_t sc_rm_get_resource_owner(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_pt_t *pt); + +/*! + * This function is used to test if a resource is a bus master. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to check + * + * Masters are IP blocks that generate bus transactions. Note an IP block + * can be both a master and peripheral (have both a programming model + * and generate bus transactions). + * + * @return Returns a boolean (SC_TRUE if the resource is a bus master). + * + * If \a resource is out of range then SC_FALSE is returned. + */ +/* IDL: RB IS_RESOURCE_MASTER(UI16 resource) #14 */ +sc_bool_t sc_rm_is_resource_master(sc_ipc_t ipc, sc_rsrc_t resource); + +/*! + * This function is used to test if a resource is a peripheral. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to check + * + * Peripherals are IP blocks that have a programming model that can be + * accessed. Note an IP block can be both a master and peripheral (have + * both a programming model and generate bus transactions) + * + * @return Returns a boolean (SC_TRUE if the resource is a peripheral). + * + * If \a resource is out of range then SC_FALSE is returned. + */ +/* IDL: RB IS_RESOURCE_PERIPHERAL(UI16 resource) #15 */ +sc_bool_t sc_rm_is_resource_peripheral(sc_ipc_t ipc, sc_rsrc_t resource); + +/*! + * This function is used to obtain info about a resource. + * + * @param[in] ipc IPC handle + * @param[in] resource resource to inquire about + * @param[out] sid pointer to return StreamID + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if \a resource is out of range + */ +/* IDL: E8 GET_RESOURCE_INFO(UI16 resource, UO16 sid) #16 */ +sc_err_t sc_rm_get_resource_info(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_sid_t *sid); + +/** @} */ + +/*! + * @name Memory Region Functions + * @{ + */ + +/*! + * This function requests that the SC create a new memory region. + * + * @param[in] ipc IPC handle + * @param[out] mr return handle for region; + used for subsequent function calls + * associated with this region + * @param[in] addr_start start address of region (physical) + * @param[in] addr_end end address of region (physical) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if the new memory region is misaligned, + * - SC_ERR_LOCKED if caller's partition is locked, + * - SC_ERR_PARM if the new memory region spans multiple existing regions, + * - SC_ERR_NOACCESS if caller's partition does not own the memory containing + * the new region, + * - SC_ERR_UNAVAILABLE if memory region table is full (no more allocation + * space) + * + * This function will create a new memory region. The area covered by the + * new region must already exist in a memory region owned by the caller. The + * result will be two memory regions, the new one overlapping the existing + * one. The priority resolution is based on the region index which is hard + * to predict. It could also be different between first creation and reload + * after a resume. Almost always better to use sc_rm_memreg_split() or + * sc_rm_memreg_frag() to create non-overlapping regions. The value of this + * function is mostly for initial region creation by the SCFW itself. + */ +/* IDL: E8 MEMREG_ALLOC(UO8 mr, UI64 addr_start, UI64 addr_end) #17 */ +sc_err_t sc_rm_memreg_alloc(sc_ipc_t ipc, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * This function requests that the SC split an existing memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region to split + * @param[out] mr_ret return handle for new region; + used for subsequent function calls + * associated with this region + * @param[in] addr_start start address of region (physical) + * @param[in] addr_end end address of region (physical) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if the new memory region is not start/end part of mr, + * - SC_ERR_LOCKED if caller's partition is locked, + * - SC_ERR_PARM if the new memory region spans multiple existing regions, + * - SC_ERR_NOACCESS if caller's partition does not own the memory containing + * the new region, + * - SC_ERR_BUSY if the region is coincident with another region, + * - SC_ERR_UNAVAILABLE if memory region table is full (no more allocation + * space) + * + * This function will take an existing region and split it into two, + * non-overlapping regions. Note the new region must start or end on the + * split region. Permissions will mirror the parent region. + */ +/* IDL: E8 MEMREG_SPLIT(UI8 mr, UO8 mr_ret, UI64 addr_start, UI64 addr_end) #29 */ +sc_err_t sc_rm_memreg_split(sc_ipc_t ipc, sc_rm_mr_t mr, + sc_rm_mr_t *mr_ret, sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * This function requests that the SC fragment a memory region. + * + * @param[in] ipc IPC handle + * @param[out] mr_ret return handle for new region; + used for subsequent function calls + * associated with this region + * @param[in] addr_start start address of region (physical) + * @param[in] addr_end end address of region (physical) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_LOCKED if caller's partition is locked, + * - SC_ERR_PARM if the new memory region spans multiple existing regions, + * - SC_ERR_NOACCESS if caller's partition does not own the memory containing + * the new region, + * - SC_ERR_BUSY if the region is coincident with another region, + * - SC_ERR_UNAVAILABLE if memory region table is full (no more allocation + * space) + * + * This function finds the memory region containing the address range. + * It then splits it as required and returns the extracted region. The + * result is 2-3 non-overlapping regions, depending on how the new region + * aligns with existing regions. Permissions will mirror the parent region. + */ +/* IDL: E8 MEMREG_FRAG(UO8 mr_ret, UI64 addr_start, UI64 addr_end) #32 */ +sc_err_t sc_rm_memreg_frag(sc_ipc_t ipc, sc_rm_mr_t *mr_ret, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * This function frees a memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region to free + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if \a mr out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not a parent of \a mr, + * - SC_ERR_LOCKED if the owning partition of \a mr is locked + */ +/* IDL: E8 MEMREG_FREE(UI8 mr) #18 */ +sc_err_t sc_rm_memreg_free(sc_ipc_t ipc, sc_rm_mr_t mr); + +/*! + * Internal SC function to find a memory region. + * + * @see sc_rm_find_memreg(). + */ +/*! + * This function finds a memory region. + * + * @param[in] ipc IPC handle + * @param[out] mr return handle for region; + used for subsequent function calls + * associated with this region + * @param[in] addr_start start address of region to search for + * @param[in] addr_end end address of region to search for + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOTFOUND if region not found, + * + * Searches only for regions owned by the caller. Finds first + * region containing the range specified. + */ +/* IDL: E8 FIND_MEMREG(UO8 mr, UI64 addr_start, UI64 addr_end) #30 */ +sc_err_t sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * This function assigns ownership of a memory region. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition + to which memory region should be assigned + * @param[in] mr handle of memory region to assign + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * This function assigns a memory region to a partition. This partition is then + * the owner. All regions always have an owner (one owner). The owner + * has various rights to make API calls affecting the region. Ownership + * does not imply access to the memory itself (that is based on access + * rights). + * + * Note that the process of assigning a partition makes some implicit changes + * to the access permissions. The receiving partition will automatically be + * given SC_RM_PERM_SEC_RW or SC_RM_PERM_FULL rights depending on the security + * state of the receiving partition. + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the \a mr owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition or \a pt is locked + */ +/* IDL: E8 ASSIGN_MEMREG(UI8 pt, UI8 mr) #19 */ +sc_err_t sc_rm_assign_memreg(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_mr_t mr); + +/*! + * This function sets access permissions for a memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region + for which permissions should apply + * @param[in] pt handle of partition \a perm should by + * applied for + * @param[in] perm permissions to apply to \a mr for \a pt + * + * This operates on the memory region specified. If SC_RM_PT_ALL is specified + * then it operates on all the regions owned by the caller that exist at the + * time of the call. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the region owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition is locked + * - SC_ERR_LOCKED if the \a pt is confidential and the caller isn't \a pt + * + * This function configures how the HW isolation will restrict access to a + * memory region based on the attributes of a transaction from bus master. + */ +/* IDL: E8 SET_MEMREG_PERMISSIONS(UI8 mr, UI8 pt, UI8 perm) #20 */ +sc_err_t sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr, + sc_rm_pt_t pt, sc_rm_perm_t perm); + +/*! + * This function configures the IEE parameters for a memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region to check + * @param[in] det 0 = normal, 1 = encrypted + * @param[in] rmsg IEE region (0-7) + * + * Caller must own SC_R_IEE_Rn where n is rmsg. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_LOCKED if the owning partition is locked + * - SC_ERR_NOACCESS if caller's partition is not the region owner or parent + * of the owner + * - SC_ERR_UNAVAILABLE if caller's partition is not the IEE region resource + * owner + */ +/* IDL: E8 SET_MEMREG_IEE(UI8 mr, UI8 det, UI8 rmsg) #34 */ +sc_err_t sc_rm_set_memreg_iee(sc_ipc_t ipc, sc_rm_mr_t mr, + sc_rm_det_t det, sc_rm_rmsg_t rmsg); + +/*! + * This function gets ownership status of a memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region to check + * + * @return Returns a boolean (SC_TRUE if caller's partition owns the + * memory region). + * + * If \a mr is out of range then SC_FALSE is returned. + */ +/* IDL: RB IS_MEMREG_OWNED(UI8 mr) #21 */ +sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr); + +/*! + * This function is used to obtain info about a memory region. + * + * @param[in] ipc IPC handle + * @param[in] mr handle of memory region to inquire about + * @param[out] addr_start pointer to return start address + * @param[out] addr_end pointer to return end address + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if \a mr is out of range + */ +/* IDL: E8 GET_MEMREG_INFO(UI8 mr, UO64 addr_start, UO64 addr_end) #22 */ +sc_err_t sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, + sc_faddr_t *addr_start, sc_faddr_t *addr_end); + +/** @} */ + +/*! + * @name Pad Functions + * @{ + */ + +/*! + * This function assigns ownership of a pad to a partition. + * + * @param[in] ipc IPC handle + * @param[in] pt handle of partition + to which pad should be assigned + * @param[in] pad pad to assign + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is restricted, + * - SC_PARM if arguments out of range or invalid, + * - SC_ERR_NOACCESS if caller's partition is not the pad owner or parent + * of the owner, + * - SC_ERR_LOCKED if the owning partition or \a pt is locked + */ +/* IDL: E8 ASSIGN_PAD(UI8 pt, UI16 pad) #23 */ +sc_err_t sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad); + +/*! + * This function flags pads as movable or not. + * + * @param[in] ipc IPC handle + * @param[in] pad_fst first pad for which flag should be set + * @param[in] pad_lst last pad for which flag should be set + * @param[in] movable movable flag (SC_TRUE is movable) + * + * This function assigned a pad to a partition. This partition is then + * the owner. All pads always have an owner (one owner). The owner + * has various rights to make API calls affecting the pad. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_PARM if pads are out of range, + * - SC_ERR_NOACCESS if caller's partition is not a parent of a pad owner, + * - SC_ERR_LOCKED if the owning partition is locked + * + * This function is used to determine the set of pads that will be + * moved using the sc_rm_move_all() function. All pads are movable + * by default so this function is normally used to prevent a set of + * pads from moving. + */ +/* IDL: E8 SET_PAD_MOVABLE(UI16 pad_fst, UI16 pad_lst, IB movable) #24 */ +sc_err_t sc_rm_set_pad_movable(sc_ipc_t ipc, sc_pad_t pad_fst, + sc_pad_t pad_lst, sc_bool_t movable); + +/*! + * This function gets ownership status of a pad. + * + * @param[in] ipc IPC handle + * @param[in] pad pad to check + * + * @return Returns a boolean (SC_TRUE if caller's partition owns the pad). + * + * If \a pad is out of range then SC_FALSE is returned. + */ +/* IDL: RB IS_PAD_OWNED(UI16 pad) #25 */ +sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad); + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * This function dumps the RM state for debug. + * + * @param[in] ipc IPC handle + */ +/* IDL: R0 DUMP() #27 */ +void sc_rm_dump(sc_ipc_t ipc); + +/** @} */ + +#endif /* SC_RM_API_H */ + +/** @} */ + diff --git a/platform/svc/rm/rpc.h b/platform/svc/rm/rpc.h new file mode 100644 index 0000000..e14e988 --- /dev/null +++ b/platform/svc/rm/rpc.h @@ -0,0 +1,113 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the RM RPC implementation. + * + * @addtogroup RM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_RM_RPC_H +#define SC_RM_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC RM function calls + */ +/** @{ */ +#define RM_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define RM_FUNC_PARTITION_ALLOC 1U /*!< Index for sc_rm_partition_alloc() RPC call */ +#define RM_FUNC_SET_CONFIDENTIAL 31U /*!< Index for sc_rm_set_confidential() RPC call */ +#define RM_FUNC_PARTITION_FREE 2U /*!< Index for sc_rm_partition_free() RPC call */ +#define RM_FUNC_GET_DID 26U /*!< Index for sc_rm_get_did() RPC call */ +#define RM_FUNC_PARTITION_STATIC 3U /*!< Index for sc_rm_partition_static() RPC call */ +#define RM_FUNC_PARTITION_LOCK 4U /*!< Index for sc_rm_partition_lock() RPC call */ +#define RM_FUNC_GET_PARTITION 5U /*!< Index for sc_rm_get_partition() RPC call */ +#define RM_FUNC_SET_PARENT 6U /*!< Index for sc_rm_set_parent() RPC call */ +#define RM_FUNC_MOVE_ALL 7U /*!< Index for sc_rm_move_all() RPC call */ +#define RM_FUNC_ASSIGN_RESOURCE 8U /*!< Index for sc_rm_assign_resource() RPC call */ +#define RM_FUNC_SET_RESOURCE_MOVABLE 9U /*!< Index for sc_rm_set_resource_movable() RPC call */ +#define RM_FUNC_SET_SUBSYS_RSRC_MOVABLE 28U /*!< Index for sc_rm_set_subsys_rsrc_movable() RPC call */ +#define RM_FUNC_SET_MASTER_ATTRIBUTES 10U /*!< Index for sc_rm_set_master_attributes() RPC call */ +#define RM_FUNC_SET_MASTER_SID 11U /*!< Index for sc_rm_set_master_sid() RPC call */ +#define RM_FUNC_SET_PERIPHERAL_PERMISSIONS 12U /*!< Index for sc_rm_set_peripheral_permissions() RPC call */ +#define RM_FUNC_IS_RESOURCE_OWNED 13U /*!< Index for sc_rm_is_resource_owned() RPC call */ +#define RM_FUNC_GET_RESOURCE_OWNER 33U /*!< Index for sc_rm_get_resource_owner() RPC call */ +#define RM_FUNC_IS_RESOURCE_MASTER 14U /*!< Index for sc_rm_is_resource_master() RPC call */ +#define RM_FUNC_IS_RESOURCE_PERIPHERAL 15U /*!< Index for sc_rm_is_resource_peripheral() RPC call */ +#define RM_FUNC_GET_RESOURCE_INFO 16U /*!< Index for sc_rm_get_resource_info() RPC call */ +#define RM_FUNC_MEMREG_ALLOC 17U /*!< Index for sc_rm_memreg_alloc() RPC call */ +#define RM_FUNC_MEMREG_SPLIT 29U /*!< Index for sc_rm_memreg_split() RPC call */ +#define RM_FUNC_MEMREG_FRAG 32U /*!< Index for sc_rm_memreg_frag() RPC call */ +#define RM_FUNC_MEMREG_FREE 18U /*!< Index for sc_rm_memreg_free() RPC call */ +#define RM_FUNC_FIND_MEMREG 30U /*!< Index for sc_rm_find_memreg() RPC call */ +#define RM_FUNC_ASSIGN_MEMREG 19U /*!< Index for sc_rm_assign_memreg() RPC call */ +#define RM_FUNC_SET_MEMREG_PERMISSIONS 20U /*!< Index for sc_rm_set_memreg_permissions() RPC call */ +#define RM_FUNC_SET_MEMREG_IEE 34U /*!< Index for sc_rm_set_memreg_iee() RPC call */ +#define RM_FUNC_IS_MEMREG_OWNED 21U /*!< Index for sc_rm_is_memreg_owned() RPC call */ +#define RM_FUNC_GET_MEMREG_INFO 22U /*!< Index for sc_rm_get_memreg_info() RPC call */ +#define RM_FUNC_ASSIGN_PAD 23U /*!< Index for sc_rm_assign_pad() RPC call */ +#define RM_FUNC_SET_PAD_MOVABLE 24U /*!< Index for sc_rm_set_pad_movable() RPC call */ +#define RM_FUNC_IS_PAD_OWNED 25U /*!< Index for sc_rm_is_pad_owned() RPC call */ +#define RM_FUNC_DUMP 27U /*!< Index for sc_rm_dump() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming RM RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void rm_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_RM_RPC_H */ + +/** @} */ + diff --git a/platform/svc/rm/rpc_clnt.c b/platform/svc/rm/rpc_clnt.c new file mode 100644 index 0000000..aedf378 --- /dev/null +++ b/platform/svc/rm/rpc_clnt.c @@ -0,0 +1,1014 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the RM service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup RM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "../../main/rpc.h" +#include "svc/rm/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 PARTITION_ALLOC(UO8 pt, IB secure, IB isolated, IB restricted, IB grant, IB coherent) #1 */ +sc_err_t sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure, + sc_bool_t isolated, sc_bool_t restricted, sc_bool_t grant, + sc_bool_t coherent) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_PARTITION_ALLOC); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = B2U8(secure); + RPC_U8(&msg, 1U) = B2U8(isolated); + RPC_U8(&msg, 2U) = B2U8(restricted); + RPC_U8(&msg, 3U) = B2U8(grant); + RPC_U8(&msg, 4U) = B2U8(coherent); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (pt != NULL) + { + *pt = (sc_rm_pt_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_CONFIDENTIAL(UI8 pt, IB retro) #31 */ +sc_err_t sc_rm_set_confidential(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t retro) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_CONFIDENTIAL); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = B2U8(retro); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 PARTITION_FREE(UI8 pt) #2 */ +sc_err_t sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_PARTITION_FREE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: UR8 GET_DID() #26 */ +sc_rm_did_t sc_rm_get_did(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_rm_did_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_GET_DID); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_rm_did_t) RPC_R8(&msg); + + /* Return result */ + return result; +} + +/* IDL: E8 PARTITION_STATIC(UI8 pt, UI8 did) #3 */ +sc_err_t sc_rm_partition_static(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_did_t did) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_PARTITION_STATIC); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(did); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 PARTITION_LOCK(UI8 pt) #4 */ +sc_err_t sc_rm_partition_lock(sc_ipc_t ipc, sc_rm_pt_t pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_PARTITION_LOCK); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_PARTITION(UO8 pt) #5 */ +sc_err_t sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_GET_PARTITION); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (pt != NULL) + { + *pt = (sc_rm_pt_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_PARENT(UI8 pt, UI8 pt_parent) #6 */ +sc_err_t sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_PARENT); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(pt_parent); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 MOVE_ALL(UI8 pt_src, UI8 pt_dst, IB move_rsrc, IB move_pads) #7 */ +sc_err_t sc_rm_move_all(sc_ipc_t ipc, sc_rm_pt_t pt_src, sc_rm_pt_t pt_dst, + sc_bool_t move_rsrc, sc_bool_t move_pads) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_MOVE_ALL); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt_src); + RPC_U8(&msg, 1U) = U8(pt_dst); + RPC_U8(&msg, 2U) = B2U8(move_rsrc); + RPC_U8(&msg, 3U) = B2U8(move_pads); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 ASSIGN_RESOURCE(UI8 pt, UI16 resource) #8 */ +sc_err_t sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_ASSIGN_RESOURCE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RESOURCE_MOVABLE(UI16 resource_fst, UI16 resource_lst, IB movable) #9 */ +sc_err_t sc_rm_set_resource_movable(sc_ipc_t ipc, sc_rsrc_t resource_fst, + sc_rsrc_t resource_lst, sc_bool_t movable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_RESOURCE_MOVABLE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource_fst); + RPC_U16(&msg, 2U) = U16(resource_lst); + RPC_U8(&msg, 4U) = B2U8(movable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_SUBSYS_RSRC_MOVABLE(UI16 resource, IB movable) #28 */ +sc_err_t sc_rm_set_subsys_rsrc_movable(sc_ipc_t ipc, sc_rsrc_t resource, + sc_bool_t movable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_SUBSYS_RSRC_MOVABLE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = B2U8(movable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MASTER_ATTRIBUTES(UI16 resource, UI8 sa, UI8 pa, IB smmu_bypass) #10 */ +sc_err_t sc_rm_set_master_attributes(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_spa_t sa, sc_rm_spa_t pa, sc_bool_t smmu_bypass) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_MASTER_ATTRIBUTES); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(sa); + RPC_U8(&msg, 3U) = U8(pa); + RPC_U8(&msg, 4U) = B2U8(smmu_bypass); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MASTER_SID(UI16 resource, UI16 sid) #11 */ +sc_err_t sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_MASTER_SID); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U16(&msg, 2U) = U16(sid); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_PERIPHERAL_PERMISSIONS(UI16 resource, UI8 pt, UI8 perm) #12 */ +sc_err_t sc_rm_set_peripheral_permissions(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_pt_t pt, sc_rm_perm_t perm) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_PERIPHERAL_PERMISSIONS); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + RPC_U8(&msg, 2U) = U8(pt); + RPC_U8(&msg, 3U) = U8(perm); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RB IS_RESOURCE_OWNED(UI16 resource) #13 */ +sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_IS_RESOURCE_OWNED); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/* IDL: E8 GET_RESOURCE_OWNER(UI16 resource, UO8 pt) #33 */ +sc_err_t sc_rm_get_resource_owner(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_pt_t *pt) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_GET_RESOURCE_OWNER); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (pt != NULL) + { + *pt = (sc_rm_pt_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: RB IS_RESOURCE_MASTER(UI16 resource) #14 */ +sc_bool_t sc_rm_is_resource_master(sc_ipc_t ipc, sc_rsrc_t resource) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_IS_RESOURCE_MASTER); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/* IDL: RB IS_RESOURCE_PERIPHERAL(UI16 resource) #15 */ +sc_bool_t sc_rm_is_resource_peripheral(sc_ipc_t ipc, sc_rsrc_t resource) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_IS_RESOURCE_PERIPHERAL); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/* IDL: E8 GET_RESOURCE_INFO(UI16 resource, UO16 sid) #16 */ +sc_err_t sc_rm_get_resource_info(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_sid_t *sid) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_GET_RESOURCE_INFO); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(resource); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (sid != NULL) + { + *sid = (sc_rm_sid_t) RPC_U16(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 MEMREG_ALLOC(UO8 mr, UI64 addr_start, UI64 addr_end) #17 */ +sc_err_t sc_rm_memreg_alloc(sc_ipc_t ipc, sc_rm_mr_t *mr, sc_faddr_t addr_start, + sc_faddr_t addr_end) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 5U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_MEMREG_ALLOC); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr_start >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr_start); + RPC_U32(&msg, 8U) = U32(addr_end >> 32ULL); + RPC_U32(&msg, 12U) = U32(addr_end); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mr != NULL) + { + *mr = (sc_rm_mr_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 MEMREG_SPLIT(UI8 mr, UO8 mr_ret, UI64 addr_start, UI64 addr_end) #29 */ +sc_err_t sc_rm_memreg_split(sc_ipc_t ipc, sc_rm_mr_t mr, sc_rm_mr_t *mr_ret, + sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 6U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_MEMREG_SPLIT); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr_start >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr_start); + RPC_U32(&msg, 8U) = U32(addr_end >> 32ULL); + RPC_U32(&msg, 12U) = U32(addr_end); + RPC_U8(&msg, 16U) = U8(mr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mr_ret != NULL) + { + *mr_ret = (sc_rm_mr_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 MEMREG_FRAG(UO8 mr_ret, UI64 addr_start, UI64 addr_end) #32 */ +sc_err_t sc_rm_memreg_frag(sc_ipc_t ipc, sc_rm_mr_t *mr_ret, + sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 5U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_MEMREG_FRAG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr_start >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr_start); + RPC_U32(&msg, 8U) = U32(addr_end >> 32ULL); + RPC_U32(&msg, 12U) = U32(addr_end); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mr_ret != NULL) + { + *mr_ret = (sc_rm_mr_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 MEMREG_FREE(UI8 mr) #18 */ +sc_err_t sc_rm_memreg_free(sc_ipc_t ipc, sc_rm_mr_t mr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_MEMREG_FREE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 FIND_MEMREG(UO8 mr, UI64 addr_start, UI64 addr_end) #30 */ +sc_err_t sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr, sc_faddr_t addr_start, + sc_faddr_t addr_end) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 5U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_FIND_MEMREG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr_start >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr_start); + RPC_U32(&msg, 8U) = U32(addr_end >> 32ULL); + RPC_U32(&msg, 12U) = U32(addr_end); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (mr != NULL) + { + *mr = (sc_rm_mr_t) RPC_U8(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 ASSIGN_MEMREG(UI8 pt, UI8 mr) #19 */ +sc_err_t sc_rm_assign_memreg(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_mr_t mr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_ASSIGN_MEMREG); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(mr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MEMREG_PERMISSIONS(UI8 mr, UI8 pt, UI8 perm) #20 */ +sc_err_t sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr, sc_rm_pt_t pt, + sc_rm_perm_t perm) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_MEMREG_PERMISSIONS); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mr); + RPC_U8(&msg, 1U) = U8(pt); + RPC_U8(&msg, 2U) = U8(perm); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MEMREG_IEE(UI8 mr, UI8 det, UI8 rmsg) #34 */ +sc_err_t sc_rm_set_memreg_iee(sc_ipc_t ipc, sc_rm_mr_t mr, sc_rm_det_t det, + sc_rm_rmsg_t rmsg) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_MEMREG_IEE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mr); + RPC_U8(&msg, 1U) = U8(det); + RPC_U8(&msg, 2U) = U8(rmsg); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RB IS_MEMREG_OWNED(UI8 mr) #21 */ +sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_IS_MEMREG_OWNED); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/* IDL: E8 GET_MEMREG_INFO(UI8 mr, UO64 addr_start, UO64 addr_end) #22 */ +sc_err_t sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, + sc_faddr_t *addr_start, sc_faddr_t *addr_end) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_GET_MEMREG_INFO); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (addr_start != NULL) + { + *addr_start = (sc_faddr_t) RPC_U64(&msg, 0U); + } + if (addr_end != NULL) + { + *addr_end = (sc_faddr_t) RPC_U64(&msg, 8U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 ASSIGN_PAD(UI8 pt, UI16 pad) #23 */ +sc_err_t sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_ASSIGN_PAD); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + RPC_U8(&msg, 2U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_PAD_MOVABLE(UI16 pad_fst, UI16 pad_lst, IB movable) #24 */ +sc_err_t sc_rm_set_pad_movable(sc_ipc_t ipc, sc_pad_t pad_fst, sc_pad_t pad_lst, + sc_bool_t movable) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_SET_PAD_MOVABLE); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad_fst); + RPC_U16(&msg, 2U) = U16(pad_lst); + RPC_U8(&msg, 4U) = B2U8(movable); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: RB IS_PAD_OWNED(UI16 pad) #25 */ +sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad) +{ + sc_rpc_msg_t msg; + sc_bool_t result; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_IS_PAD_OWNED); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(pad); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + result = (sc_bool_t) U2B(RPC_R8(&msg)); + + /* Return result */ + return result; +} + +/* IDL: R0 DUMP() #27 */ +void sc_rm_dump(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_RM); + RPC_FUNC(&msg) = U8(RM_FUNC_DUMP); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); +} + +/** @} */ + diff --git a/platform/svc/rm/rpc_srv.c b/platform/svc/rm/rpc_srv.c new file mode 100644 index 0000000..e0668ca --- /dev/null +++ b/platform/svc/rm/rpc_srv.c @@ -0,0 +1,702 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the RM service. + * + * @addtogroup RM_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/rm/svc.h" +#include "svc/rm/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void rm_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case RM_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch partition_alloc() */ + case RM_FUNC_PARTITION_ALLOC : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) 0U); + sc_bool_t secure = U2B(RPC_U8(msg, 0U)); + sc_bool_t isolated = U2B(RPC_U8(msg, 1U)); + sc_bool_t restricted = U2B(RPC_U8(msg, 2U)); + sc_bool_t grant = U2B(RPC_U8(msg, 3U)); + sc_bool_t coherent = U2B(RPC_U8(msg, 4U)); + + /* Call function */ + err = rm_partition_alloc(caller_pt, &pt, secure, isolated, + restricted, grant, coherent); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(pt); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_confidential() */ + case RM_FUNC_SET_CONFIDENTIAL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_bool_t retro = U2B(RPC_U8(msg, 1U)); + + /* Call function */ + err = rm_set_confidential(caller_pt, pt, retro); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch partition_free() */ + case RM_FUNC_PARTITION_FREE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = rm_partition_free(caller_pt, pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_did() */ + case RM_FUNC_GET_DID : + { + /* Declare return and parameters */ + sc_rm_did_t result; + + /* Call function */ + result = rm_get_did(caller_pt); + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch partition_static() */ + case RM_FUNC_PARTITION_STATIC : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_rm_did_t did = ((sc_rm_did_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = rm_partition_static(caller_pt, pt, did); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch partition_lock() */ + case RM_FUNC_PARTITION_LOCK : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = rm_partition_lock(caller_pt, pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_partition() */ + case RM_FUNC_GET_PARTITION : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) 0U); + + /* Call function */ + err = rm_get_partition(caller_pt, &pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(pt); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_parent() */ + case RM_FUNC_SET_PARENT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_rm_pt_t pt_parent = ((sc_rm_pt_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = rm_set_parent(caller_pt, pt, pt_parent); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch move_all() */ + case RM_FUNC_MOVE_ALL : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt_src = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_rm_pt_t pt_dst = ((sc_rm_pt_t) RPC_U8(msg, 1U)); + sc_bool_t move_rsrc = U2B(RPC_U8(msg, 2U)); + sc_bool_t move_pads = U2B(RPC_U8(msg, 3U)); + + /* Call function */ + err = rm_move_all(caller_pt, pt_src, pt_dst, move_rsrc, + move_pads); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch assign_resource() */ + case RM_FUNC_ASSIGN_RESOURCE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 2U)); + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = rm_assign_resource(caller_pt, pt, resource); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_resource_movable() */ + case RM_FUNC_SET_RESOURCE_MOVABLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource_fst = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rsrc_t resource_lst = ((sc_rsrc_t) RPC_U16(msg, 2U)); + sc_bool_t movable = U2B(RPC_U8(msg, 4U)); + + /* Call function */ + err = rm_set_resource_movable(caller_pt, resource_fst, + resource_lst, movable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_subsys_rsrc_movable() */ + case RM_FUNC_SET_SUBSYS_RSRC_MOVABLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_bool_t movable = U2B(RPC_U8(msg, 2U)); + + /* Call function */ + err = rm_set_subsys_rsrc_movable(caller_pt, resource, movable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_master_attributes() */ + case RM_FUNC_SET_MASTER_ATTRIBUTES : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rm_spa_t sa = ((sc_rm_spa_t) RPC_U8(msg, 2U)); + sc_rm_spa_t pa = ((sc_rm_spa_t) RPC_U8(msg, 3U)); + sc_bool_t smmu_bypass = U2B(RPC_U8(msg, 4U)); + + /* Call function */ + err = rm_set_master_attributes(caller_pt, resource, sa, pa, + smmu_bypass); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_master_sid() */ + case RM_FUNC_SET_MASTER_SID : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rm_sid_t sid = ((sc_rm_sid_t) RPC_U16(msg, 2U)); + + /* Call function */ + err = rm_set_master_sid(caller_pt, resource, sid); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_peripheral_permissions() */ + case RM_FUNC_SET_PERIPHERAL_PERMISSIONS : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 2U)); + sc_rm_perm_t perm = ((sc_rm_perm_t) RPC_U8(msg, 3U)); + + /* Call function */ + err = rm_set_peripheral_permissions(caller_pt, resource, pt, + perm); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch is_resource_owned() */ + case RM_FUNC_IS_RESOURCE_OWNED : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + result = rm_is_resource_owned(caller_pt, resource); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_resource_owner() */ + case RM_FUNC_GET_RESOURCE_OWNER : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rm_pt_t pt = ((sc_rm_pt_t) 0U); + + /* Call function */ + err = rm_get_resource_owner(caller_pt, resource, &pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(pt); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch is_resource_master() */ + case RM_FUNC_IS_RESOURCE_MASTER : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + result = rm_is_resource_master(caller_pt, resource); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch is_resource_peripheral() */ + case RM_FUNC_IS_RESOURCE_PERIPHERAL : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + + /* Call function */ + result = rm_is_resource_peripheral(caller_pt, resource); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_resource_info() */ + case RM_FUNC_GET_RESOURCE_INFO : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rsrc_t resource = ((sc_rsrc_t) RPC_U16(msg, 0U)); + sc_rm_sid_t sid = ((sc_rm_sid_t) 0U); + + /* Call function */ + err = rm_get_resource_info(caller_pt, resource, &sid); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U16(msg, 0U) = U16(sid); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch memreg_alloc() */ + case RM_FUNC_MEMREG_ALLOC : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) 0U); + sc_faddr_t addr_start = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t addr_end = ((sc_faddr_t) RPC_U64(msg, 8U)); + + /* Call function */ + err = rm_memreg_alloc(caller_pt, &mr, addr_start, addr_end); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mr); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch memreg_split() */ + case RM_FUNC_MEMREG_SPLIT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 16U)); + sc_rm_mr_t mr_ret = ((sc_rm_mr_t) 0U); + sc_faddr_t addr_start = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t addr_end = ((sc_faddr_t) RPC_U64(msg, 8U)); + + /* Call function */ + err = rm_memreg_split(caller_pt, mr, &mr_ret, addr_start, + addr_end); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mr_ret); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch memreg_frag() */ + case RM_FUNC_MEMREG_FRAG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr_ret = ((sc_rm_mr_t) 0U); + sc_faddr_t addr_start = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t addr_end = ((sc_faddr_t) RPC_U64(msg, 8U)); + + /* Call function */ + err = rm_memreg_frag(caller_pt, &mr_ret, addr_start, addr_end); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mr_ret); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch memreg_free() */ + case RM_FUNC_MEMREG_FREE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 0U)); + + /* Call function */ + err = rm_memreg_free(caller_pt, mr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch find_memreg() */ + case RM_FUNC_FIND_MEMREG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) 0U); + sc_faddr_t addr_start = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t addr_end = ((sc_faddr_t) RPC_U64(msg, 8U)); + + /* Call function */ + err = rm_find_memreg(caller_pt, &mr, addr_start, addr_end); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 0U) = U8(mr); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch assign_memreg() */ + case RM_FUNC_ASSIGN_MEMREG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = rm_assign_memreg(caller_pt, pt, mr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_memreg_permissions() */ + case RM_FUNC_SET_MEMREG_PERMISSIONS : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 0U)); + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 1U)); + sc_rm_perm_t perm = ((sc_rm_perm_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = rm_set_memreg_permissions(caller_pt, mr, pt, perm); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_memreg_iee() */ + case RM_FUNC_SET_MEMREG_IEE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 0U)); + sc_rm_det_t det = ((sc_rm_det_t) RPC_U8(msg, 1U)); + sc_rm_rmsg_t rmsg = ((sc_rm_rmsg_t) RPC_U8(msg, 2U)); + + /* Call function */ + err = rm_set_memreg_iee(caller_pt, mr, det, rmsg); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch is_memreg_owned() */ + case RM_FUNC_IS_MEMREG_OWNED : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 0U)); + + /* Call function */ + result = rm_is_memreg_owned(caller_pt, mr); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_memreg_info() */ + case RM_FUNC_GET_MEMREG_INFO : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_mr_t mr = ((sc_rm_mr_t) RPC_U8(msg, 0U)); + sc_faddr_t addr_start = ((sc_faddr_t) 0U); + sc_faddr_t addr_end = ((sc_faddr_t) 0U); + + /* Call function */ + err = rm_get_memreg_info(caller_pt, mr, &addr_start, &addr_end); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(addr_start >> 32ULL); + RPC_U32(msg, 4U) = U32(addr_start); + RPC_U32(msg, 8U) = U32(addr_end >> 32ULL); + RPC_U32(msg, 12U) = U32(addr_end); + RPC_SIZE(msg) = 5U; + break; + } + /* Dispatch assign_pad() */ + case RM_FUNC_ASSIGN_PAD : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 2U)); + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = rm_assign_pad(caller_pt, pt, pad); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_pad_movable() */ + case RM_FUNC_SET_PAD_MOVABLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_pad_t pad_fst = ((sc_pad_t) RPC_U16(msg, 0U)); + sc_pad_t pad_lst = ((sc_pad_t) RPC_U16(msg, 2U)); + sc_bool_t movable = U2B(RPC_U8(msg, 4U)); + + /* Call function */ + err = rm_set_pad_movable(caller_pt, pad_fst, pad_lst, movable); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch is_pad_owned() */ + case RM_FUNC_IS_PAD_OWNED : + { + /* Declare return and parameters */ + sc_bool_t result; + sc_pad_t pad = ((sc_pad_t) RPC_U16(msg, 0U)); + + /* Call function */ + result = rm_is_pad_owned(caller_pt, pad); + + /* Copy in return parameters */ + RPC_R8(msg) = B2U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch dump() */ + case RM_FUNC_DUMP : + { + /* Declare return and parameters */ + + /* Call function */ + rm_dump(caller_pt); + + /* Copy in return parameters */ + RPC_SIZE(msg) = 1U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=rm, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=rm, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/rm/svc.c b/platform/svc/rm/svc.c new file mode 100755 index 0000000..33b69e0 --- /dev/null +++ b/platform/svc/rm/svc.c @@ -0,0 +1,3718 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/rm/svc.c + * + * File containing the implementation of the System Controller (SC) Resource + * Management (RM) function. This includes functions for partitioning + * resources, pads, and memory regions. + * + * @addtogroup RM_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/soc.h" +#include "main/board.h" +#include "svc/rm/svc.h" +#include "svc/pm/svc.h" +#include "svc/timer/svc.h" +#include "ss/inf/inf.h" +#include "ss_ver.h" +#if SS_VER_BASE == 1 +#include "ss/base/v1/ss.h" +#endif +#include "drivers/sysctr/fsl_sysctr.h" + +/* Local Defines */ + +#if 0 + /*! Define to enable RM timing */ + #define PROF_RM +#endif + +/*! Define for MRC alignment */ +#define MRC_ALIGN 0xFFFULL + +/*! + * @name Parameter checking macros + */ +/** @{ */ +#define USED_MR(X) ASRT_ERR(rm_mreg_data[(X)].used != SC_FALSE, SC_ERR_PARM) +#define USED_MR_C(X) ASRT_C(rm_mreg_data[(X)].used != SC_FALSE) +#define NOT_RESTRICTED(X) ASRT_ERR(rm_part_data[(X)].restricted == SC_FALSE, SC_ERR_NOACCESS) +#define NOT_LOCKED(X) ASRT_ERR(rm_part_data[(X)].locked == SC_FALSE, SC_ERR_LOCKED) +#define NOT_LOCKED_C(X) ASRT_C(rm_part_data[(X)].locked == SC_FALSE) +#define PARENT(X) ASRT_ERR(caller_pt == rm_part_data[(X)].parent, SC_ERR_NOACCESS) +/** @} */ + +#ifdef PROF_RM + #define START_TIMER(X) \ + uint32_t (X) = SYSCTR_GetCounter32() +#else + #define START_TIMER(X) NOP +#endif + +#ifdef PROF_RM + #define STOP_TIMER(X) \ + (X) = SYSCTR_GetCounter32() - (X) +#else + #define STOP_TIMER(X) NOP +#endif + +/* Local Types */ + +/*! + * This type is used to store compressed permissions. + */ +typedef uint8_t permz_t; + +/*! + * This type is used to store dynamic info needed to track partition + * specific data for the resource management service. + */ +typedef struct +{ + sc_rm_pt_t parent : SC_RM_PARTITION_W; + sc_rm_pt_t control : SC_RM_PARTITION_W; + sc_rm_did_t did : SC_RM_DID_W; + sc_bool_t used : SC_BOOL_W; + sc_bool_t secure : SC_BOOL_W; + sc_bool_t restricted : SC_BOOL_W; + sc_bool_t isolated : SC_BOOL_W; + sc_bool_t locked : SC_BOOL_W; + sc_bool_t confidential : SC_BOOL_W; + sc_bool_t grant : SC_BOOL_W; + sc_bool_t sys_access : SC_BOOL_W; +} rm_part_data_t; + +/*! + * This type is used to store dynamic info needed to track + * resource state. + */ +typedef struct +{ + permz_t perms[SC_RM_NUM_DOMAIN / 2]; + sc_rm_sid_t sid : SC_RM_SID_W; + sc_ss_idx_t ss_idx : SC_SS_IDX_W; + sc_sub_t ss : SC_SUBSYS_W; + sc_rm_spa_t sa : SC_RM_PERM_W; + sc_rm_spa_t pa : SC_RM_PERM_W; + sc_rm_pt_t owner : SC_RM_PARTITION_W; + sc_bool_t movable : SC_BOOL_W; + sc_bool_t block : SC_BOOL_W; +} rm_rsrc_data_t; + +/*! + * This type is used to store dynamic info needed to track + * pad state. + */ +typedef struct +{ + sc_rm_pt_t owner : SC_RM_PARTITION_W; + sc_bool_t movable : SC_BOOL_W; +} rm_pad_data_t; + +/*! + * This type is used to store dynamic info needed to track + * memory region state. + */ +typedef struct +{ + sc_faddr_t start; + sc_faddr_t end; + sc_rm_mr_t parent : SC_RM_MEMREG_W; + sc_rm_pt_t owner : SC_RM_PARTITION_W; + sc_rm_rmsg_t rmsg : SC_RM_RMSG_W; + sc_rm_det_t det : SC_RM_DET_W; + sc_bool_t used : SC_BOOL_W; + permz_t perms[SC_RM_NUM_DOMAIN / 2]; +} rm_mreg_data_t; + +/* Local Functions */ + +/*! + * @name Private Functions + * @{ + */ +static void clear_perms(permz_t *perms); +static void copy_perms(sc_rm_mr_t mr_src, sc_rm_mr_t mr_dst); +static void set_perms(permz_t *perms, sc_rm_did_t did, + sc_rm_perm_t perm); +static void get_perms(const permz_t *perms, sc_rm_did_t did, + sc_rm_perm_t *perm); +static void update_rdc_resource(sc_rm_idx_t idx, sc_bool_t master, + sc_bool_t peripheral); +static sc_err_t update_rdc_memreg(sc_rm_mr_t mr, sc_faddr_t old_start, + sc_faddr_t old_end, sc_faddr_t new_start, sc_faddr_t new_end); +/** @} */ + +/*! + * @name Local Variables + * + * @{ + */ +static rm_part_data_t rm_part_data[SC_RM_NUM_PARTITION]; +static sc_rm_idx_t rm_rsrc_map_data[SC_NUM_RESOURCE]; +static sc_rm_idx_t rm_ss_map_data[SC_NUM_SUBSYS]; +static rm_rsrc_data_t rm_rsrc_data[SC_NUM_RSRC]; +static rm_pad_data_t rm_pad_data[SC_NUM_PAD]; +static rm_mreg_data_t rm_mreg_data[SC_RM_NUM_MEMREG]; +static sc_rm_mr_t rm_mreg_list[SC_RM_NUM_MEMREG]; +static sc_rm_mr_t rm_mreg_list_count = 0U; +static sc_bool_t did_used[SC_RM_NUM_DOMAIN]; +static sc_rm_pt_t dynamic_pt_first; +static sc_rm_did_t dynamic_did_first; +static sc_bool_t blocking = SC_FALSE; +/** @} */ + +/* Global Variables */ + +/*! Max domain used */ +uint8_t rm_max_did = SC_DID; + +#if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + /*! Partition name pointers */ + const char *rm_part_names[SC_RM_NUM_PARTITION]; +#endif + +/*--------------------------------------------------------------------------*/ +/* Init the resource management service */ +/*--------------------------------------------------------------------------*/ +void rm_init(sc_bool_t api_phase) +{ + if (api_phase != SC_FALSE) + { + sc_sub_t s; + sc_rm_idx_t r; + uint8_t loop; + sc_pad_t n; + + /* Init index mapping info */ + for (r = 0; r < (sc_rm_idx_t) SC_NUM_RESOURCE; r++) + { + rm_rsrc_map_data[r] = SC_NUM_RSRC; + } + + /* Allocate SC DID */ + did_used[SC_DID] = SC_TRUE; + + /* Parition SC_PT allocated to SC */ + rm_part_data[SC_PT].used = SC_TRUE; + #if SC_PT != 0 + rm_part_data[SC_PT].parent = SC_PT; + rm_part_data[SC_PT].control = SC_PT; + #endif + rm_part_data[SC_PT].secure = SC_TRUE; + rm_part_data[SC_PT].isolated = SC_TRUE; + #if SC_DID != 0 + rm_part_data[SC_PT].did = SC_DID; + #endif + rm_part_data[SC_PT].sys_access = SC_FALSE; + + /* All resources owned by SC */ + for (r = 0; r < SC_NUM_RSRC; r++) + { + #if SC_PT != 0 + rm_rsrc_data[r].owner = SC_PT; + #endif + #if SC_BYPASS_SID != 0 + rm_rsrc_data[r].sid = SC_BYPASS_SID; + #endif + rm_rsrc_data[r].sa = SC_SA; + rm_rsrc_data[r].pa = SC_PA; + rm_rsrc_data[r].movable = SC_TRUE; + rm_rsrc_data[r].block = SC_TRUE; + set_perms(rm_rsrc_data[r].perms, SC_DID, SC_RM_PERM_SEC_RW); + } + + /* Fill in SS mapping info */ + r = 0; + for (s = 0; s < SC_NUM_SUBSYS; s++) + { + sc_ss_inst_t inst = sc_ss_info[s].inst; + + rm_ss_map_data[s] = r; + + #ifdef SIMU + if (r >= SC_NUM_RSRC) + { + error_print("error: Rsrc map ovfl: %s\n", + snames[s]); + break; + } + #endif + + for (loop = 0; loop < ss_base_info[s]->num_rsrc; loop++) + { + sc_rm_idx_t idx = (inst * ss_base_info[s]->num_rsrc) + loop; + + /* Check for mapping error */ + #ifdef SIMU + if (rm_rsrc_map_data[ss_base_info[s]->rsrc_map[idx].resource] + != SC_NUM_RSRC) + { + error_print("error: Rsrc map: %s #%d\n", + snames[s], loop); + break; + } + #endif + + /* Fill in resource to index info */ + rm_rsrc_map_data[ss_base_info[s]->rsrc_map[idx].resource] + = r; + + /* Fill in index to ss info */ + rm_rsrc_data[r].ss = s; + rm_rsrc_data[r].ss_idx = loop; + r++; + } + } + + /* Fill in board mapping info */ + for (loop = 0; loop < board_num_rsrc; loop++) + { + #ifdef SIMU + if (r >= SC_NUM_RSRC) + { + error_print("error: Rsrc map ovfl: board\n"); + break; + } + #endif + + /* Check for mapping error */ + #ifdef SIMU + if (rm_rsrc_map_data[board_rsrc_map[loop].resource] + != SC_NUM_RSRC) + { + error_print("error: Rsrc map: BOARD #%d\n", + loop); + } + #endif + + /* Fill in resource to index info */ + rm_rsrc_map_data[board_rsrc_map[loop].resource] + = r; + + /* Fill in index to board info */ + rm_rsrc_data[r].ss = SC_SUBSYS_NA; + rm_rsrc_data[r].ss_idx = loop; + r++; + } + + /* All pads owned by SC */ + for (n = 0; n < SC_NUM_PAD; n++) + { + #if SC_PT != 0 + rm_pad_data[n].owner = SC_PT; + #endif + rm_pad_data[n].movable = SC_TRUE; + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Define number of static partitions */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_reserve_static_pt(sc_rm_pt_t num) +{ + /* Set first dynamic */ + dynamic_pt_first = num; + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Define number of static domains */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_reserve_static_did(sc_rm_did_t num) +{ + SIMU_ASRT(num < SC_RM_NUM_PARTITION, + "bad pt"); + + /* Set first dynamic */ + dynamic_did_first = num; + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Allocate a new resource partition and return a handle */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_partition_alloc(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt, + sc_bool_t secure, sc_bool_t isolated, sc_bool_t restricted, sc_bool_t grant, + sc_bool_t coherent) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + NOT_LOCKED(caller_pt); + NOT_RESTRICTED(caller_pt); + ASRT_ERR((secure == SC_FALSE) || (rm_part_data[caller_pt].secure != SC_FALSE), + SC_ERR_NOACCESS); + + if (err == SC_ERR_NONE) + { + sc_rm_pt_t p; + + /* Find unallocated partition */ + err = SC_ERR_UNAVAILABLE; + for (p = dynamic_pt_first; p < SC_RM_NUM_PARTITION; p++) + { + if (rm_part_data[p].used == SC_FALSE) + { + /* Init parameters */ + rm_part_data[p].used = SC_TRUE; + rm_part_data[p].parent = caller_pt; + rm_part_data[p].secure = secure; + rm_part_data[p].isolated = isolated; + rm_part_data[p].restricted = restricted; + rm_part_data[p].grant = grant; + rm_part_data[p].locked = SC_FALSE; + rm_part_data[p].sys_access = SC_FALSE; + rm_part_data[p].control = SC_PT; + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + rm_part_names[p] = NULL; + #endif + /* Init power and timer state */ + pm_init_part(caller_pt, p); + timer_init_part(caller_pt, p); + + /* Allocate a DID */ + if (isolated != SC_FALSE) + { + /* Coherent? */ + if (coherent != SC_FALSE) + { + /* Use DID 0 if available */ + if (did_used[0] == SC_FALSE) + { + did_used[0] = SC_TRUE; + rm_part_data[p].did = 0; + err = SC_ERR_NONE; + } + } + else + { + sc_rm_did_t d; + + /* Search for an unused DID */ + for (d = dynamic_did_first; d < SC_RM_NUM_DOMAIN; d++) + { + /* Found unused? */ + if (did_used[d] == SC_FALSE) + { + did_used[d] = SC_TRUE; + rm_part_data[p].did = d; + rm_max_did = MAX(rm_max_did, d); + err = SC_ERR_NONE; + + break; + } + } + } + } + else + { + /* Reuse caller DID */ + rm_part_data[p].did = rm_part_data[caller_pt].did; + err = SC_ERR_NONE; + } + + if (err == SC_ERR_NONE) + { + *pt = p; + } + else + { + /* No DID found so unallocate */ + rm_part_data[p].used = SC_FALSE; + } + + break; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Make partition confidential */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_confidential(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_bool_t retro) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + NOT_LOCKED(pt); + PARENT(pt); + + if (err == SC_ERR_NONE) + { + /* Mark partition */ + rm_part_data[pt].confidential= SC_TRUE; + + /* Remove permissions */ + if (retro != SC_FALSE) + { + sc_rm_idx_t r; + sc_rm_mr_t m; + + /* Loop through all resources */ + for (r = 0; r < SC_NUM_RSRC; r++) + { + if (rm_rsrc_data[r].owner != pt) + { + set_perms(rm_rsrc_data[r].perms, rm_part_data[pt].did, + SC_RM_PERM_NONE); + } + } + + /* Loop through all memory regions */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if (rm_mreg_data[m].owner != pt) + { + set_perms(rm_mreg_data[m].perms, rm_part_data[pt].did, + SC_RM_PERM_NONE); + } + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Free a resource partition and return resources to the parent partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_partition_free(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + NOT_SC_PT(pt); + + /* Check more parameters if caller not SC */ + if (caller_pt != SC_PT) + { + NOT_LOCKED(caller_pt); + NOT_LOCKED(pt); + NOT_RESTRICTED(caller_pt); + PARENT(pt); + } + + if (err == SC_ERR_NONE) + { + sc_rm_idx_t r; + sc_pad_t n; + sc_rm_mr_t m; + sc_rm_pt_t p; + + /* Call timer service to stop wdog */ + timer_halt_wdog(pt); + + /* Free all child partitions */ + for (p = 0; p < SC_RM_NUM_PARTITION; p++) + { + /* Used and belongs to this partition? */ + if ((rm_part_data[p].used != SC_FALSE) && (rm_part_data[p].parent == pt)) + { + rm_part_data[p].locked = SC_FALSE; + (void) rm_partition_free(rm_part_data[p].parent, p); + } + } + + /* Return all resources to parent */ + for (r = 0; r < SC_NUM_RSRC; r++) + { + /* Is available? */ + if (rm_is_ridx_avail(r) == SC_FALSE) + { + continue; + } + + /* Owned by this partiton? */ + if (rm_rsrc_data[r].owner == pt) + { + /* Return attributes to the default */ + rm_rsrc_data[r].owner = rm_part_data[pt].parent; + pm_update_ridx(r); + rm_rsrc_data[r].pa = SC_RM_SPA_PASSTHRU; + rm_rsrc_data[r].movable = SC_TRUE; + clear_perms(rm_rsrc_data[r].perms); + SIMU_ASRT(rm_rsrc_data[r].owner < SC_RM_NUM_PARTITION, + "bad owner pt"); + if (rm_part_data[rm_rsrc_data[r].owner].secure != SC_FALSE) + { + /* Make secure when returned */ + rm_rsrc_data[r].sa = SC_RM_SPA_ASSERT; + set_perms(rm_rsrc_data[r].perms, + rm_part_data[rm_rsrc_data[r].owner].did, + SC_RM_PERM_SEC_RW); + } + else + { + /* Make not-secure when returned */ + rm_rsrc_data[r].sa = SC_RM_SPA_NEGATE; + set_perms(rm_rsrc_data[r].perms, + rm_part_data[rm_rsrc_data[r].owner].did, + SC_RM_PERM_FULL); + } + + /* Update the resource */ + update_rdc_resource(r, SC_TRUE, SC_TRUE); + } + } + + /* Return all pads to parent */ + for (n = 0; n < SC_NUM_PAD; n++) + { + /* Owned by this partiton? */ + if (rm_pad_data[n].owner == pt) + { + rm_pad_data[n].owner = rm_part_data[pt].parent; + rm_pad_data[n].movable = SC_TRUE; + } + } + + /* Delete child memory regions */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + /* Owned by this partiton? */ + if (rm_mreg_data[m].owner == pt) + { + sc_rm_mr_t m_parent = rm_mreg_data[m].parent; + + /* Check parms */ + SIMU_ASRT(m_parent < SC_RM_NUM_PARTITION, + "bad parent pt"); + + if (rm_mreg_data[m].parent == m) + { + continue; + } + + if (rm_mreg_data[m_parent].owner == pt) + { + (void) rm_memreg_free(SC_PT, m); + } + if (rm_mreg_data[m_parent].owner == rm_part_data[pt].parent) + { + (void) rm_memreg_free(SC_PT, m); + } + } + } + + /* Return all remaining memory regions */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + /* Owned by this partiton? */ + if (rm_mreg_data[m].owner == pt) + { + (void) rm_assign_memreg(SC_PT, rm_part_data[pt].parent, m); + } + } + + /* Free DID */ + SIMU_ASRT(rm_part_data[pt].did < SC_RM_NUM_DOMAIN, + "bad DID"); + if (rm_part_data[pt].isolated != SC_FALSE) + { + did_used[rm_part_data[pt].did] = SC_FALSE; + } + + /* Free partition */ + rm_part_data[pt].used = SC_FALSE; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get partition of caller */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_get_partition(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + *pt = caller_pt; + + SIMU_ASRT(*pt < SC_RM_NUM_PARTITION, + "bad pt"); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get enable state of a partition */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_partition_used(sc_rm_pt_t pt) +{ + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + + return rm_part_data[pt].used; +} + +/*--------------------------------------------------------------------------*/ +/* Get security state of a partition */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_secure_partition(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + rtn = rm_part_data[caller_pt].secure; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Get isolation state of a partition */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_partition_isolated(sc_rm_pt_t pt) +{ + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + + return rm_part_data[pt].isolated; +} + +/*--------------------------------------------------------------------------*/ +/* Get system access state of a partition */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_sys_access(sc_rm_pt_t pt) +{ + sc_bool_t rtn; + + /* Check parms */ + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + + /* Is SC? */ + if (pt == SC_PT) + { + rtn = SC_TRUE; + } + /* Own SYSTEM? */ + else if (rm_is_resource_owned(pt, SC_R_SYSTEM) != SC_FALSE) + { + rtn = SC_TRUE; + } + /* Access to SYSTEM? */ + else + { + rtn = rm_part_data[pt].sys_access; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Set partition that can control a partition */ +/*--------------------------------------------------------------------------*/ +void rm_set_control_partition(sc_rm_pt_t pt, sc_rm_pt_t control) +{ + /* Check parms */ + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + SIMU_ASRT(control < SC_RM_NUM_PARTITION, + "bad pt"); + + rm_part_data[pt].control = control; +} + +/*--------------------------------------------------------------------------*/ +/* Get control partition */ +/*--------------------------------------------------------------------------*/ +sc_rm_pt_t rm_get_control_partition(sc_rm_pt_t pt) +{ + return rm_part_data[pt].control; +} + +/*--------------------------------------------------------------------------*/ +/* Get parent of a partition */ +/*--------------------------------------------------------------------------*/ +sc_rm_pt_t rm_get_partition_parent(sc_rm_pt_t pt) +{ + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + + SIMU_ASRT(rm_part_data[pt].parent < SC_RM_NUM_PARTITION, + "bad pt"); + + return rm_part_data[pt].parent; +} + +/*--------------------------------------------------------------------------*/ +/* Get resource domain of caller */ +/*--------------------------------------------------------------------------*/ +sc_rm_did_t rm_get_did(sc_rm_pt_t caller_pt) +{ + sc_rm_did_t did = SC_DID; + + SIMU_ASRT(caller_pt < SC_RM_NUM_PARTITION, + "bad caller_pt"); + + if (caller_pt < SC_RM_NUM_PARTITION) + { + did = rm_part_data[caller_pt].did; + } + + SIMU_ASRT(did < SC_RM_NUM_DOMAIN, + "bad did"); + + return did; +} + +/*--------------------------------------------------------------------------*/ +/* Force a partition onto a static DID (assumes no assigned resources */ +/* or mem regions) */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_partition_static(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rm_did_t did) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + ASRT_ERR(did < dynamic_did_first, SC_ERR_PARM); + + /* Check parameters */ + USED_PT(pt); + NOT_LOCKED(pt); + NOT_RESTRICTED(caller_pt); + + /* Check access rights */ + PARENT(pt); + ASRT_ERR(did_used[did] == SC_FALSE, SC_ERR_UNAVAILABLE); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Check parms */ + SIMU_ASRT(rm_part_data[pt].did < SC_RM_NUM_DOMAIN, + "bad DID"); + + /* Swap DIDs */ + did_used[rm_part_data[pt].did] = SC_FALSE; + rm_part_data[pt].did = did; + rm_max_did = MAX(rm_max_did, did); + did_used[rm_part_data[pt].did] = SC_TRUE; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Lock a partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_partition_lock(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + PARENT(pt); + + if (err == SC_ERR_NONE) + { + /* Lock partition */ + rm_part_data[pt].locked = SC_TRUE; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set new parent for partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_parent(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rm_pt_t pt_parent) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_pt_t p; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + BOUND_PT(pt_parent); + + /* Check parameters */ + USED_PT(pt); + USED_PT(pt_parent); + NOT_LOCKED(pt); + NOT_LOCKED(pt_parent); + NOT_RESTRICTED(caller_pt); + PARENT(pt); + NOT_SC_PT(pt); + + /* Check for circular relationship */ + p = pt_parent; + while ((err == SC_ERR_NONE) && (p != SC_PT)) + { + if (rm_part_data[p].parent == pt) + { + err = SC_ERR_PARM; + } + + p = rm_part_data[p].parent; + } + + /* Check for error */ + if (err == SC_ERR_NONE) + { + sc_rm_idx_t r; + sc_rm_mr_t m; + + /* Update parent */ + rm_part_data[pt].parent = pt_parent; + + /* Update all resources */ + for (r = 0; r < SC_NUM_RSRC; r++) + { + /* Resource owned by this partition? */ + if (rm_rsrc_data[r].owner == pt) + { + /* Update resource */ + update_rdc_resource(r, SC_FALSE, SC_TRUE); + } + } + + /* Update all memory regions */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + /* Mem region owned by this partition? */ + if ((rm_mreg_data[m].used != SC_FALSE) + && (rm_mreg_data[m].owner == pt)) + { + /* Update memory region */ + (void) update_rdc_memreg(m, rm_mreg_data[m].start, + rm_mreg_data[m].end, rm_mreg_data[m].start, + rm_mreg_data[m].end); + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check if caller is the parent of a partition */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_parent(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + if (err == SC_ERR_NONE) + { + /* Check parent */ + rtn = (caller_pt == rm_part_data[pt].parent); + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if caller is an ancestor of owner */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_check_ancestor(sc_rm_pt_t caller_pt, sc_rm_pt_t pt_owner) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt_owner); + + if (err == SC_ERR_NONE) + { + sc_rm_pt_t pt; + + /* SCU always ancestor */ + if (caller_pt == SC_PT) + { + rtn = SC_TRUE; + } + + /* Loop looking for ancestor */ + pt = pt_owner; + while ((rtn == SC_FALSE) && (pt != SC_PT)) + { + if (caller_pt == pt) + { + rtn = SC_TRUE; + } + + pt = rm_part_data[pt].parent; + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Move all resources/pads owned by src partition to dst partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_move_all(sc_rm_pt_t caller_pt, sc_rm_pt_t pt_src, + sc_rm_pt_t pt_dst, sc_bool_t move_rsrc, sc_bool_t move_pads) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt_src); + BOUND_PT(pt_dst); + + /* Check parameters */ + USED_PT(pt_src); + USED_PT(pt_dst); + NOT_LOCKED(pt_src); + NOT_LOCKED(pt_dst); + NOT_RESTRICTED(caller_pt); + ASRT_ERR(pt_src != pt_dst, SC_ERR_PARM); + ANCESTOR(pt_src); + + if (err == SC_ERR_NONE) + { + /* Move all resources from src to dst */ + if (move_rsrc != SC_FALSE) + { + sc_rm_idx_t r; + sc_rm_idx_t jr1 = SC_NUM_RESOURCE, jr3 = SC_NUM_RESOURCE; + + /* Get CAAM indexes */ + rm_check_map_ridx_v(SC_R_CAAM_JR1_OUT, &jr1); + rm_check_map_ridx_v(SC_R_CAAM_JR3_OUT, &jr3); + + /* Loop over all resources */ + for (r = 0; r < SC_NUM_RSRC; r++) + { + /* Check if available */ + if (rm_is_ridx_avail(r) == SC_FALSE) + { + continue; + } + + /* Is movable? */ + if ((rm_rsrc_data[r].movable != SC_FALSE) + && ((rm_rsrc_data[r].owner == pt_src) + || (caller_pt == SC_PT))) + { + /* Only allow JR_OUT resources to be assigned to child */ + if ((r >= jr1) + && (r <= jr3)) + { + ANCESTOR_C(pt_dst); + } + + /* Update owner */ + rm_rsrc_data[r].owner = pt_dst; + pm_update_ridx(r); + + /* Update attributes */ + rm_rsrc_data[r].pa = SC_RM_SPA_PASSTHRU; + clear_perms(rm_rsrc_data[r].perms); + if (rm_part_data[pt_dst].secure != SC_FALSE) + { + /* Secure */ + rm_rsrc_data[r].sa = SC_RM_SPA_ASSERT; + set_perms(rm_rsrc_data[r].perms, + rm_part_data[pt_dst].did, SC_RM_PERM_SEC_RW); + } + else + { + /* Not secure */ + rm_rsrc_data[r].sa = SC_RM_SPA_NEGATE; + set_perms(rm_rsrc_data[r].perms, + rm_part_data[pt_dst].did, SC_RM_PERM_FULL); + } + + /* Update SID */ + rm_rsrc_data[r].sid = SC_BYPASS_SID; + update_rdc_resource(r, SC_TRUE, SC_TRUE); + } + } + + /* Update memory regions that might now be in different MRCs */ + rm_load_memrg(); + } + + /* Move all pads from src to dst */ + if (move_pads != SC_FALSE) + { + sc_pad_t n; + + for (n = 0; n < SC_NUM_PAD; n++) + { + /* Is movable? */ + if ((rm_pad_data[n].movable != SC_FALSE) + && ((rm_pad_data[n].owner == pt_src) + || (caller_pt == SC_PT))) + { + rm_pad_data[n].owner = pt_dst; + } + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Assign a resource to a resource partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_assign_resource(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rsrc_t r0, rN; + sc_bool_t sync_mem = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + NOT_LOCKED(caller_pt); + NOT_LOCKED(pt); + NOT_RESTRICTED(caller_pt); + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + /* Check parameters */ + BOUND_RSRC(resource, idx); + ANCESTOR(rm_rsrc_data[idx].owner); + NOT_LOCKED(rm_rsrc_data[idx].owner); + + /* Only allow JR_OUT resources to be assigned to child */ + if ((resource >= SC_R_CAAM_JR1_OUT) + && (resource <= SC_R_CAAM_JR3_OUT)) + { + ANCESTOR(pt); + } + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + } + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + sc_rm_did_t old_did; + + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + + /* Check ownership */ + ANCESTOR_C(rm_rsrc_data[idx].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_rsrc_data[idx].owner); + + /* Only allow JR_OUT resources to be assigned to child */ + if ((r >= SC_R_CAAM_JR1_OUT) + && (r <= SC_R_CAAM_JR3_OUT)) + { + ANCESTOR_C(pt); + } + } + + /* Keep old DID */ + SIMU_ASRT(rm_rsrc_data[idx].owner < SC_RM_NUM_PARTITION, + "bad owner"); + old_did = rm_part_data[rm_rsrc_data[idx].owner].did; + + /* Assign resource */ + rm_rsrc_data[idx].owner = pt; + pm_update_ridx(idx); + + /* Default access permissions */ + rm_rsrc_data[idx].pa = SC_RM_SPA_PASSTHRU; + clear_perms(rm_rsrc_data[idx].perms); + if (rm_part_data[pt].secure != SC_FALSE) + { + rm_rsrc_data[idx].sa = SC_RM_SPA_ASSERT; + set_perms(rm_rsrc_data[idx].perms, rm_part_data[pt].did, + SC_RM_PERM_SEC_RW); + } + else + { + rm_rsrc_data[idx].sa = SC_RM_SPA_NEGATE; + set_perms(rm_rsrc_data[idx].perms, rm_part_data[pt].did, + SC_RM_PERM_FULL); + } + rm_rsrc_data[idx].movable = SC_TRUE; + + /* Set SID */ + rm_rsrc_data[idx].sid = SC_BYPASS_SID; + + /* Update resource */ + update_rdc_resource(idx, SC_TRUE, SC_TRUE); + + /* Check if MRC might change */ + if ((rm_is_ridx_master(idx) != SC_FALSE) + && (old_did != rm_part_data[pt].did)) + { + sync_mem = SC_TRUE; + } + } + } + + /* Update memory regions that might now be in different MRCs */ + if ((err == SC_ERR_NONE) && (sync_mem != SC_FALSE)) + { + rm_load_memrg(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Flag resource as movable or not */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_resource_movable(sc_rm_pt_t caller_pt, + sc_rsrc_t resource_fst, sc_rsrc_t resource_lst, sc_bool_t movable) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rsrc_t r0, rN; + sc_rsrc_t new_resource_fst = resource_fst; + sc_rsrc_t new_resource_lst = resource_lst; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Is one or all resources? */ + if ((new_resource_fst == SC_R_ALL) || (new_resource_lst == SC_R_ALL)) + { + /* Set range to cover all resources */ + r0 = 0; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + if (new_resource_fst > new_resource_lst) + { + sc_rsrc_t temp = new_resource_fst; + new_resource_fst = new_resource_lst; + new_resource_lst = temp; + } + + /* Check parameters */ + if (new_resource_lst >= SC_NUM_RESOURCE) + { + err = SC_ERR_PARM; + } + else if (new_resource_fst > new_resource_lst) + { + err = SC_ERR_PARM; + } + else + { + ; /* Intentional empty else */ + } + + /* Set range to cover only the specified resource */ + r0 = new_resource_fst; + rN = new_resource_lst; + } + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + + /* Check ownership */ + ANCESTOR_C(rm_rsrc_data[idx].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_rsrc_data[idx].owner); + + /* Set flag */ + rm_rsrc_data[idx].movable = movable; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Flag resource group as movable or not */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_subsys_rsrc_movable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t movable) +{ + sc_err_t err = SC_ERR_NONE; + sc_sub_t ss; + sc_ss_idx_t ss_idx; + sc_rm_idx_t idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + /* Get subsystem */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + + /* Loop through all resources and flag */ + for (idx = 0; idx < SC_NUM_RSRC; idx++) + { + ANCESTOR_C(rm_rsrc_data[idx].owner); + + if (rm_rsrc_data[idx].ss == ss) + { + rm_rsrc_data[idx].movable = movable; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set attributes for a master resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_master_attributes(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_spa_t sa, sc_rm_spa_t pa, sc_bool_t smmu_bypass) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rsrc_t r0, rN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + NOT_RESTRICTED(caller_pt); + ASRT_ERR(sa <= SC_RM_SPA_NEGATE, SC_ERR_PARM); + ASRT_ERR(pa <= SC_RM_SPA_NEGATE, SC_ERR_PARM); + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + /* Check parameters */ + BOUND_RSRC(resource, idx); + MASTER(idx); + ANCESTOR(rm_rsrc_data[idx].owner); + if ((err == SC_ERR_NONE) && (caller_pt != SC_PT) && (caller_pt + == rm_rsrc_data[idx].owner)) + { + err = SC_ERR_NOACCESS; + } + + /* Check permissions */ + NOT_LOCKED(rm_rsrc_data[idx].owner); + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + } + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + MASTER_C(idx); + + /* Check ownership */ + ANCESTOR_C(rm_rsrc_data[idx].owner); + ASRT_C((caller_pt == SC_PT) || (caller_pt != rm_rsrc_data[idx].owner)); + + /* Check permissions */ + NOT_LOCKED_C(rm_rsrc_data[idx].owner); + } + + /* Change attributes */ + if (rm_part_data[caller_pt].secure != SC_FALSE) + { + rm_rsrc_data[idx].sa = sa; + } + rm_rsrc_data[idx].pa = pa; + + if (smmu_bypass != SC_FALSE) + { + rm_rsrc_data[idx].sid = SC_BYPASS_SID; + } + + update_rdc_resource(idx, SC_TRUE, SC_FALSE); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set streamID for a master resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_master_sid(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_sid_t sid) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rsrc_t r0, rN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + NOT_RESTRICTED(caller_pt); + ASRT_ERR((sid != 0U) && ((sid & ~SC_RM_SID_MASK) == 0U), SC_ERR_PARM); + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + /* Check parameters */ + BOUND_RSRC(resource, idx); + MASTER(idx); + ANCESTOR(rm_rsrc_data[idx].owner); + NOT_LOCKED(rm_rsrc_data[idx].owner); + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + } + + if (err == SC_ERR_NONE) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + MASTER_C(idx); + + /* Check ownership */ + ANCESTOR_C(rm_rsrc_data[idx].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_rsrc_data[idx].owner); + } + + /* Update resource */ + rm_rsrc_data[idx].sid = sid; + update_rdc_resource(idx, SC_TRUE, SC_FALSE); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update master */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_update_master(sc_rm_idx_t idx) +{ + SIMU_ASRT(idx < SC_NUM_RSRC, "bad rsrc idx") + + update_rdc_resource(idx, SC_TRUE, SC_FALSE); + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Set access permissions for a peripheral resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_peripheral_permissions(sc_rm_pt_t caller_pt, + sc_rsrc_t resource, sc_rm_pt_t pt, sc_rm_perm_t perm) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + sc_rsrc_t r0, rN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + ASRT_ERR((pt < SC_RM_NUM_PARTITION) || (pt == SC_RM_PT_ALL), SC_ERR_PARM); + ASRT_ERR((pt >= SC_RM_NUM_PARTITION) || (rm_part_data[pt].used != SC_FALSE), + SC_ERR_PARM); + ASRT_ERR(perm <= SC_RM_PERM_FULL, SC_ERR_PARM); + + /* Check permissions */ + ASRT_ERR((pt >= SC_RM_NUM_PARTITION) || (rm_part_data[pt].confidential + == SC_FALSE) || (pt == caller_pt), SC_ERR_LOCKED); + + /* Is one or all resources? */ + if (resource == SC_R_ALL) + { + /* Set range to cover all resources */ + r0 = 0; + rN = SC_NUM_RESOURCE - 1U; + } + else + { + /* Check parameters */ + BOUND_RSRC(resource, idx); + + /* Check permissions */ + ANCESTOR(rm_rsrc_data[idx].owner); + NOT_LOCKED(rm_rsrc_data[idx].owner); + + /* Update SYSTEM */ + if ((err == SC_ERR_NONE) && (resource == SC_R_SYSTEM)) + { + sc_bool_t access; + + /* Grant access if permission is not none */ + if (perm == SC_RM_PERM_NONE) + { + access = SC_FALSE; + } + else + { + access = SC_TRUE; + } + + /* Do one or all partitions? */ + if (pt == SC_RM_PT_ALL) + { + sc_rm_pt_t p; + + /* Loop through all partitions */ + for (p = 0; p < SC_RM_NUM_PARTITION; p++) + { + rm_part_data[p].sys_access = access; + } + } + else + { + rm_part_data[pt].sys_access = access; + } + } + else + { + /* Check parameters */ + PERIPHERAL(idx); + } + + /* Set range to cover only the specified resource */ + r0 = resource; + rN = resource; + } + + if ((err == SC_ERR_NONE) && (resource != SC_R_SYSTEM)) + { + sc_rsrc_t r; + + /* Process range of resources */ + for (r = r0; r <= rN; r++) + { + if (resource == SC_R_ALL) + { + /* Check parameters */ + BOUND_RSRC_C(r, idx); + PERIPHERAL_C(idx); + + /* Check ownership */ + ANCESTOR_C(rm_rsrc_data[idx].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_rsrc_data[idx].owner); + } + + /* Do one or all partitions? */ + if (pt == SC_RM_PT_ALL) + { + sc_rm_did_t d; + + /* Loop through all domains */ + for (d = 0; d < SC_RM_NUM_DOMAIN; d++) + { + (void) set_perms(rm_rsrc_data[idx].perms, d, perm); + } + } + else + { + (void) set_perms(rm_rsrc_data[idx].perms, rm_part_data[pt].did, + perm); + } + + (void) update_rdc_resource(idx, SC_FALSE, SC_TRUE); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Update peripheral */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_update_peripheral(sc_rm_idx_t idx) +{ + SIMU_ASRT(idx < SC_NUM_RSRC, "bad rsrc idx") + + update_rdc_resource(idx, SC_FALSE, SC_TRUE); + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Update resoruce */ +/*--------------------------------------------------------------------------*/ +void rm_update_resource(sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + update_rdc_resource(idx, SC_TRUE, SC_TRUE); + } +} + +/*--------------------------------------------------------------------------*/ +/* Get resource subsystem info */ +/*--------------------------------------------------------------------------*/ +void rm_get_ridx_ss_info(sc_rm_idx_t idx, sc_sub_t *ss, + sc_ss_idx_t *ss_idx) +{ + SIMU_ASRT(idx < SC_NUM_RSRC, "bad rsrc idx"); + + *ss = rm_rsrc_data[idx].ss; + *ss_idx = rm_rsrc_data[idx].ss_idx; + + SIMU_ASRT(*ss <= SC_SUBSYS_NA, "bad ss") +} + +/*--------------------------------------------------------------------------*/ +/* Check resource range and return the unified resource index */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_check_map_ridx(sc_rsrc_t resource, sc_rm_idx_t *idx) +{ + sc_bool_t rtn; + + /* Check parameters */ + if (resource >= SC_NUM_RESOURCE) + { + rtn = SC_FALSE; + } + else if (rm_rsrc_map_data[resource] == SC_NUM_RSRC) + { + rtn = SC_FALSE; + } + + /* Check if available */ + else if (soc_rsrc_avail(resource) == SC_FALSE) + { + rtn = SC_FALSE; + } + else + { + /* Return index */ + if (idx != NULL) + { + *idx = rm_rsrc_map_data[resource]; + + SIMU_ASRT(*idx < SC_NUM_RSRC, + "bad rsrc idx"); + + } + rtn = SC_TRUE; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check resource range and return the unified resource index */ +/*--------------------------------------------------------------------------*/ +void rm_check_map_ridx_v(sc_rsrc_t resource, sc_rm_idx_t *idx) +{ + /* Check parameters */ + if ((resource < SC_NUM_RESOURCE) && (rm_rsrc_map_data[resource] + != SC_NUM_RSRC)) + { + /* Return index */ + *idx = rm_rsrc_map_data[resource]; + + SIMU_ASRT(*idx < SC_NUM_RSRC, + "bad rsrc idx"); + } +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource owned */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_resource_owned(sc_rm_pt_t caller_pt, sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + rtn = rm_is_ridx_owned(caller_pt, idx); + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource index owned */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_ridx_owned(sc_rm_pt_t caller_pt, sc_rm_idx_t idx) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + + /* Check availability */ + if (rm_is_ridx_avail(idx) != SC_FALSE) + { + rtn = (rm_rsrc_data[idx].owner == caller_pt); + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource available */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_resource_avail(sc_rsrc_t resource) +{ + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0U; + + if (resource < SC_NUM_RESOURCE) + { + rtn = rm_check_map_ridx(resource, &idx); + } + + /* Check table */ + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Convert resource index to resource */ +/*--------------------------------------------------------------------------*/ +sc_rsrc_t rm_get_resource(sc_rm_idx_t idx) +{ + sc_sub_t ss = 0U; + ss_idx_t ss_idx = 0U; + + SIMU_ASRT(idx < SC_NUM_RSRC, "bad rsrc idx"); + + /* Convert RM index to SS info */ + rm_get_ridx_ss_info(idx, &ss, &ss_idx); + + /* Convert to resource */ + return ss_get_resource(ss, ss_idx); +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource index available */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_ridx_avail(sc_rm_idx_t idx) +{ + /* Check if available */ + return soc_rsrc_avail(rm_get_resource(idx)); +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource access allowed */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_resource_access_allowed(sc_rm_pt_t caller_pt, + sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + rtn = rm_is_ridx_access_allowed(caller_pt, idx); + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource index access allowed */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_ridx_access_allowed(sc_rm_pt_t caller_pt, sc_rm_idx_t idx) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + SIMU_ASRT(rm_rsrc_data[idx].owner < SC_RM_NUM_PARTITION, + "bad owner pt"); + + if (err == SC_ERR_NONE) + { + /* Check if available */ + if (rm_is_ridx_avail(idx) == SC_FALSE) + { + rtn = SC_FALSE; + } + /* Check parent grant */ + else if ((rm_part_data[rm_rsrc_data[idx].owner].grant != SC_FALSE) + && (rm_part_data[rm_rsrc_data[idx].owner].parent == caller_pt)) + { + rtn = SC_TRUE; + } + else + { + rtn = (rm_rsrc_data[idx].owner == caller_pt); + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Return the owner partition for a resource */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_get_resource_owner(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_pt_t *pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + rm_get_ridx_owner(idx, pt); + + SIMU_ASRT(*pt < SC_RM_NUM_PARTITION, "bad pt"); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Return the owner partition for a rsrc */ +/*--------------------------------------------------------------------------*/ +void rm_get_ridx_owner(sc_rm_idx_t idx, sc_rm_pt_t *pt) +{ + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + + if (idx < SC_NUM_RSRC) + { + *pt= rm_rsrc_data[idx].owner; + } + else + { + *pt = SC_PT; + } + + SIMU_ASRT(*pt < SC_RM_NUM_PARTITION, "bad pt"); +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource is a master */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_resource_master(sc_rm_pt_t caller_pt, sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + if (rm_is_ridx_owned(caller_pt, idx) != SC_FALSE) + { + rtn = rm_is_ridx_master(idx); + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource is a master */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_ridx_master(sc_rm_idx_t idx) +{ + sc_bool_t rtn; + + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + + /* Check if board */ + if (rm_rsrc_data[idx].ss > SC_SUBSYS_LAST) + { + rtn = SC_FALSE; + } + + /* Check if available */ + else if (rm_is_ridx_avail(idx) == SC_FALSE) + { + rtn = SC_FALSE; + } + else + { + SIMU_ASRT(rm_rsrc_data[idx].ss < SC_NUM_SUBSYS, + "bad ss"); + + rtn = ss_base_info[rm_rsrc_data[idx].ss] + ->rsrc[rm_rsrc_data[idx].ss_idx].master; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource is a peripheral */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_resource_peripheral(sc_rm_pt_t caller_pt, sc_rsrc_t resource) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + BOUND_RSRC(resource, idx); + + if (err == SC_ERR_NONE) + { + if (rm_is_ridx_owned(caller_pt, idx) != SC_FALSE) + { + rtn = rm_is_ridx_peripheral(idx); + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Check if resource is a peripheral */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_ridx_peripheral(sc_rm_idx_t idx) +{ + sc_bool_t rtn; + + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + + /* Check if board */ + if (rm_rsrc_data[idx].ss > SC_SUBSYS_LAST) + { + rtn = SC_FALSE; + } + + /* Check if available */ + else if (rm_is_ridx_avail(idx) == SC_FALSE) + { + rtn = SC_FALSE; + } + else + { + SIMU_ASRT(rm_rsrc_data[idx].ss < SC_NUM_SUBSYS, + "bad ss"); + + rtn = ss_base_info[rm_rsrc_data[idx].ss]-> + rsrc[rm_rsrc_data[idx].ss_idx].peripheral; + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Return resource info */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_get_resource_info(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_sid_t *sid) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx = 0; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_RSRC(resource, idx); + + /* Check parameters */ + ACCESS_ALLOWED(caller_pt, idx); + + if (err == SC_ERR_NONE) + { + /* Return info */ + if (sid != NULL) + { + *sid = rm_rsrc_data[idx].sid; + + /* Check SID */ + SIMU_ASRT((*sid & ~SC_RM_SID_MASK) == 0U, "bad sid"); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set resource block state */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_ridx_block(sc_rm_idx_t idx, sc_bool_t block) +{ + /* Check parms */ + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + + sc_bool_t rtn = rm_rsrc_data[idx].block; + + rm_rsrc_data[idx].block = block; + + /* Update resource */ + update_rdc_resource(idx, SC_FALSE, SC_TRUE); + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Allocate a memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_memreg_alloc(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t m, m_found; + sc_bool_t found = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Check parameters */ + if ((addr_start & MRC_ALIGN) != 0ULL) + { + err = SC_ERR_PARM; + } + else if ((addr_end & MRC_ALIGN) != MRC_ALIGN) + { + err = SC_ERR_PARM; + } + else + { + ; /* Intentional empty else */ + } + } + + /* Check permissions */ + NOT_LOCKED(caller_pt); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Check if spanning across multiple existing regions */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if ((rm_mreg_data[m].used != SC_FALSE) + && ((addr_start >= rm_mreg_data[m].start) + && (addr_start <= rm_mreg_data[m].end)) + && !((addr_end >= rm_mreg_data[m].start) + && (addr_end <= rm_mreg_data[m].end))) + { + err = SC_ERR_PARM; + } + else if ((rm_mreg_data[m].used != SC_FALSE) + && !((addr_start >= rm_mreg_data[m].start) + && (addr_start <= rm_mreg_data[m].end)) + && ((addr_end >= rm_mreg_data[m].start) + && (addr_end <= rm_mreg_data[m].end))) + { + err = SC_ERR_PARM; + } + else + { + ; /* Intentional empty else */ + } + } + } + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Find parent memory space */ + found = SC_FALSE; + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if ((rm_mreg_data[m].used != SC_FALSE) + && (rm_mreg_data[m].owner == caller_pt) + && (addr_start >= rm_mreg_data[m].start) + && (addr_start <= rm_mreg_data[m].end)) + { + found = SC_TRUE; + m_found = m; + break; + } + } + } + + /* Check if found */ + ASRT_ERR((caller_pt == SC_PT) || (found != SC_FALSE), SC_ERR_NOACCESS); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Find unallocated memory region */ + err = SC_ERR_UNAVAILABLE; + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if (rm_mreg_data[m].used == SC_FALSE) + { + rm_mreg_data[m].used = SC_TRUE; + rm_mreg_data[m].owner = caller_pt; + rm_mreg_data[m].start = addr_start; + rm_mreg_data[m].end = addr_end; + rm_mreg_data[m].det = 0; + rm_mreg_data[m].rmsg = 0; + + /* Found? */ + if (found != SC_FALSE) + { + rm_mreg_data[m].parent = m_found; + copy_perms(m_found, m); + } + else + { + rm_mreg_data[m].parent = m; + + /* Update perms */ + clear_perms(rm_mreg_data[m].perms); + if (rm_part_data[caller_pt].secure != SC_FALSE) + { + /* Secure access by default */ + set_perms(rm_mreg_data[m].perms, + rm_part_data[caller_pt].did, SC_RM_PERM_SEC_RW); + } + else + { + /* Full access by default */ + set_perms(rm_mreg_data[m].perms, + rm_part_data[caller_pt].did, SC_RM_PERM_FULL); + } + } + + /* Update mem region */ + err = update_rdc_memreg(m, rm_mreg_data[m].start, + rm_mreg_data[m].end, rm_mreg_data[m].start, + rm_mreg_data[m].end); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + if (mr != NULL) + { + /* Return memory region index */ + *mr = m; + + /* Update in-order memory list */ + rm_mreg_list[rm_mreg_list_count] = m; + rm_mreg_list_count++; + + /* Check mr */ + SIMU_ASRT(*mr < SC_RM_NUM_MEMREG, + "bad mr"); + } + } + else + { + rm_mreg_data[m].used = SC_FALSE; + } + + break; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Split a memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_memreg_split(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_mr_t *mr_ret, sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_err_t err = SC_ERR_NONE; + sc_faddr_t start = 0ULL; + uint32_t num_co = 0U; + sc_rm_mr_t m; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MR(mr); + + /* Check parameters */ + USED_MR(mr); + + /* Check access rights */ + if ((err == SC_ERR_NONE) && (caller_pt != SC_PT)) + { + NOT_LOCKED(rm_mreg_data[mr].owner); + ANCESTOR(rm_mreg_data[mr].owner); + } + + /* Cannot split coincident region */ + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if ((rm_mreg_data[m].used) + && (rm_mreg_data[m].start == rm_mreg_data[mr].start) + && (rm_mreg_data[m].end == rm_mreg_data[mr].end)) + { + num_co++; + } + } + ASRT_ERR((caller_pt == SC_PT) || (num_co <= 1U), SC_ERR_BUSY); + + /* Check address */ + if (err == SC_ERR_NONE) + { + sc_faddr_t end; + + start = rm_mreg_data[mr].start; + end = rm_mreg_data[mr].end; + if ((addr_start == start) && (addr_end == end)) + { + err = SC_ERR_PARM; + } + else if ((addr_start < start) || (addr_end > end)) + { + err = SC_ERR_PARM; + } + else if ((addr_start != start) && (addr_end != end)) + { + err = SC_ERR_PARM; + } + else + { + ; /* Intentional empty else */ + } + } + + if (err == SC_ERR_NONE) + { + /* Allocate new region (also checks many parameters) */ + if (caller_pt != SC_PT) + { + /* Allocate as caller */ + err = rm_memreg_alloc(caller_pt, mr_ret, addr_start, + addr_end); + } + else + { + /* Allocate as current region owner */ + err = rm_memreg_alloc(rm_mreg_data[mr].owner, mr_ret, + addr_start, addr_end); + } + } + + if (err == SC_ERR_NONE) + { + sc_faddr_t new_start, new_end; + + if (rm_mreg_data[mr].parent == mr) + { + rm_mreg_data[*mr_ret].parent = *mr_ret; + } + else + { + rm_mreg_data[*mr_ret].parent = rm_mreg_data[mr].parent; + } + + /* Copy new */ + new_start = rm_mreg_data[mr].start; + new_end = rm_mreg_data[mr].end; + + /* Split */ + if (addr_start == start) + { + new_start = addr_end + 1ULL; + } + else + { + new_end = addr_start - 1ULL; + } + + /* Update HW */ + err = update_rdc_memreg(mr, rm_mreg_data[mr].start, + rm_mreg_data[mr].end, new_start, new_end); + + /* Update data */ + rm_mreg_data[mr].start = new_start; + rm_mreg_data[mr].end = new_end; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Fragment memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_memreg_frag(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr_ret, + sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t mr; + sc_faddr_t mr_start, mr_end; + + /* Find memory region */ + FUNC_ERR(rm_find_memreg(caller_pt, &mr, addr_start, + addr_end)); + + FUNC_ERR(rm_get_memreg_info(caller_pt, mr, &mr_start, &mr_end)); + + if (err == SC_ERR_NONE) + { + /* Coincident? */ + if ((addr_start == mr_start) && (addr_end == mr_end)) + { + *mr_ret = mr; + } + else + { + /* Front */ + if (addr_start == mr_start) + { + sc_rm_mr_t temp_mr; + + FUNC_ERR(rm_memreg_split(caller_pt, mr, &temp_mr, + addr_end + 1ULL, mr_end)); + + if (err == SC_ERR_NONE) + { + *mr_ret = mr; + } + } + /* End */ + else if (addr_end == mr_end) + { + FUNC_ERR(rm_memreg_split(caller_pt, mr, mr_ret, addr_start, + addr_end)); + } + /* Middle */ + else + { + sc_rm_mr_t temp_mr; + + FUNC_ERR(rm_memreg_split(caller_pt, mr, &temp_mr, + addr_end + 1ULL, mr_end)); + + FUNC_ERR(rm_memreg_split(caller_pt, mr, mr_ret, addr_start, + addr_end)); + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Free a memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_memreg_free(sc_rm_pt_t caller_pt, sc_rm_mr_t mr) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t m0, mN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Is one or all regions? */ + if (mr == SC_RM_MR_ALL) + { + /* Set range to cover all regions */ + m0 = 0; + mN = SC_RM_NUM_MEMREG - 1U; + } + else + { + /* Check parameters */ + BOUND_MR(mr); + USED_MR(mr); + if ((err == SC_ERR_NONE) && (caller_pt != SC_PT)) + { + NOT_LOCKED(rm_mreg_data[mr].owner); + ANCESTOR(rm_mreg_data[mr].owner); + } + + /* Set range to cover only the specified region */ + m0 = mr; + mN = mr; + } + + if (err == SC_ERR_NONE) + { + sc_rm_mr_t m; + sc_rm_mr_t mi; + + /* Process range of regions */ + for (m = m0; m <= mN; m++) + { + if (mr != SC_RM_MR_ALL) + { + /* Check parameters */ + USED_MR_C(m); + + if (caller_pt != SC_PT) + { + /* Check ownership */ + ANCESTOR_C(rm_mreg_data[m].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_mreg_data[m].owner); + } + } + + /* Free region */ + rm_mreg_data[m].used = SC_FALSE; + + /* Update RDC */ + (void) update_rdc_memreg(m, rm_mreg_data[m].start, + rm_mreg_data[m].end, rm_mreg_data[m].start, + rm_mreg_data[m].end); + + /* Find entry in memory list */ + for (mi = 0U; mi < rm_mreg_list_count; mi++) + { + if (rm_mreg_list[mi] == m) + { + break; + } + } + + /* Roll entries down in the list */ + while ((mi + 1U) < rm_mreg_list_count) + { + rm_mreg_list[mi] = rm_mreg_list[mi + 1U]; + + mi++; + } + + /* Update the memory list count */ + rm_mreg_list_count--; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Find a memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_find_memreg(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Loop over regions */ + if (err == SC_ERR_NONE) + { + sc_rm_mr_t m; + + err = SC_ERR_NOTFOUND; + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if (caller_pt != SC_PT) + { + /* Owned? */ + ASRT_C(rm_is_memreg_owned(caller_pt, m) != SC_FALSE); + } + + /* Region containing? */ + if ((addr_start >= rm_mreg_data[m].start) + && (addr_end <= rm_mreg_data[m].end)) + { + *mr = m; + err = SC_ERR_NONE; + + SIMU_ASRT(*mr < SC_RM_NUM_MEMREG, + "bad mr"); + + break; + } + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Assign a memory region to another partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_assign_memreg(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, sc_rm_mr_t mr) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t m0, mN; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + NOT_LOCKED(pt); + + /* Is one or all regions? */ + if (mr == SC_RM_MR_ALL) + { + /* Set range to cover all regions */ + m0 = 0; + mN = SC_RM_NUM_MEMREG - 1U; + } + else + { + /* Check parameters */ + BOUND_MR(mr); + USED_MR(mr); + if ((err == SC_ERR_NONE) && (caller_pt != SC_PT)) + { + NOT_LOCKED(rm_mreg_data[mr].owner); + ANCESTOR(rm_mreg_data[mr].owner); + } + + /* Set range to cover only the specified region */ + m0 = mr; + mN = mr; + } + + if (err == SC_ERR_NONE) + { + sc_rm_mr_t m; + + /* Process range of regions */ + for (m = m0; m <= mN; m++) + { + if (mr != SC_RM_MR_ALL) + { + /* Check parameters */ + USED_MR_C(m); + + /* Check ownership */ + ANCESTOR_C(rm_mreg_data[m].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_mreg_data[m].owner); + } + + /* Assign region */ + rm_mreg_data[m].owner = pt; + clear_perms(rm_mreg_data[m].perms); + + if (rm_part_data[pt].secure != SC_FALSE) + { + set_perms(rm_mreg_data[m].perms, rm_part_data[pt].did, + SC_RM_PERM_SEC_RW); + } + else + { + set_perms(rm_mreg_data[m].perms, rm_part_data[pt].did, + SC_RM_PERM_FULL); + } + + /* Update RDC */ + (void) update_rdc_memreg(m, rm_mreg_data[m].start, + rm_mreg_data[m].end, rm_mreg_data[m].start, + rm_mreg_data[m].end); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set access permissions for a memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_memreg_permissions(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_pt_t pt, sc_rm_perm_t perm) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_mr_t m0, mN; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + ASRT_ERR((pt < SC_RM_NUM_PARTITION) || (pt == SC_RM_PT_ALL), SC_ERR_PARM); + ASRT_ERR((pt >= SC_RM_NUM_PARTITION) || (rm_part_data[pt].used != SC_FALSE), + SC_ERR_PARM); + + /* Check permissions */ + if ((err == SC_ERR_NONE) && (pt != SC_RM_PT_ALL)) + { + if ((rm_part_data[pt].confidential != SC_FALSE) + && (pt != caller_pt)) + { + err = SC_ERR_LOCKED; + } + } + + /* Is one or all regions? */ + if (mr == SC_RM_MR_ALL) + { + /* Set range to cover all regions */ + m0 = 0; + mN = SC_RM_NUM_MEMREG - 1U; + } + else + { + /* Check parameters */ + BOUND_MR(mr); + USED_MR(mr); + NOT_LOCKED(rm_mreg_data[mr].owner); + ANCESTOR(rm_mreg_data[mr].owner); + + /* Set range to cover only the specified region */ + m0 = mr; + mN = mr; + } + + if (err == SC_ERR_NONE) + { + sc_rm_mr_t m; + + /* Process range of regions */ + for (m = m0; m <= mN; m++) + { + if (mr != SC_RM_MR_ALL) + { + /* Check parameters */ + USED_MR_C(m); + + /* Check ownership */ + ANCESTOR_C(rm_mreg_data[m].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_mreg_data[m].owner); + } + + /* Do one or all partitions? */ + if (pt == SC_RM_PT_ALL) + { + sc_rm_pt_t p; + + /* Loop through all partitions */ + for (p = 0; p < SC_RM_NUM_PARTITION; p++) + { + /* Check access? */ + if ((rm_part_data[p].confidential == SC_FALSE) + || (p == caller_pt)) + { + /* Set permissions */ + set_perms(rm_mreg_data[m].perms, rm_part_data[p].did, + perm); + } + } + } + else + { + set_perms(rm_mreg_data[m].perms, rm_part_data[pt].did, + perm); + } + + /* Update RDC */ + (void) update_rdc_memreg(m, rm_mreg_data[m].start, + rm_mreg_data[m].end, rm_mreg_data[m].start, + rm_mreg_data[m].end); + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set IEE parameters for memory region */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_memreg_iee(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_det_t det, sc_rm_rmsg_t rmsg) +{ + sc_err_t err = SC_ERR_NONE; + sc_rsrc_t resource = U16(SC_R_IEE_R0) + U16(rmsg); + sc_rm_idx_t idx; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MR(mr); + + /* Check parameters */ + ASRT_ERR(det <= 1U, SC_ERR_PARM); + ASRT_ERR(rmsg <= 7U, SC_ERR_PARM); + BOUND_RSRC(resource, idx); + USED_MR(mr); + + /* Check access rights */ + NOT_LOCKED(rm_mreg_data[mr].owner); + ANCESTOR(rm_mreg_data[mr].owner); + + /* Check for error */ + if (err == SC_ERR_NONE) + { + /* Update data */ + rm_mreg_data[mr].det = det; + rm_mreg_data[mr].rmsg = rmsg; + + /* Update resource */ + (void) update_rdc_memreg(mr, rm_mreg_data[mr].start, + rm_mreg_data[mr].end, rm_mreg_data[mr].start, + rm_mreg_data[mr].end); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check if mememory region owned */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_memreg_owned(sc_rm_pt_t caller_pt, sc_rm_mr_t mr) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MR(mr); + + if (err == SC_ERR_NONE) + { + /* Check parameters */ + if (rm_mreg_data[mr].used == SC_FALSE) + { + rtn = SC_FALSE; + } + else if (rm_mreg_data[mr].owner == caller_pt) + { + rtn = SC_TRUE; + } + else + { + ; /* Intentional empty else */ + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Return memory region info */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_get_memreg_info(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_faddr_t *addr_start, sc_faddr_t *addr_end) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_MR(mr); + + /* Check parameters */ + USED_MR(mr); + + if (err == SC_ERR_NONE) + { + /* Return info */ + *addr_start = rm_mreg_data[mr].start; + *addr_end = rm_mreg_data[mr].end; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Assign a pad to a resource partition */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_assign_pad(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, sc_pad_t pad) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + /* Check parameters */ + USED_PT(pt); + NOT_LOCKED(pt); + NOT_RESTRICTED(caller_pt); + + /* Is one or all pads? */ + if (pad == SC_P_ALL) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + /* Check parameters */ + BOUND_PAD(pad); + NOT_LOCKED(rm_pad_data[pad].owner); + ANCESTOR(rm_pad_data[pad].owner); + + /* Set range to cover only the specified region */ + p0 = pad; + pN = pad; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + if (pad == SC_P_ALL) + { + /* Check ownership */ + ANCESTOR_C(rm_pad_data[p].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_pad_data[p].owner); + } + + /* Assign pad */ + rm_pad_data[p].owner = pt; + rm_pad_data[p].movable = SC_TRUE; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Flag pad as movable or not */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_set_pad_movable(sc_rm_pt_t caller_pt, sc_pad_t pad_first, + sc_pad_t pad_last, sc_bool_t movable) +{ + sc_err_t err = SC_ERR_NONE; + sc_pad_t p0, pN; + sc_pad_t new_pad_first = pad_first; + sc_pad_t new_pad_last = pad_last; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check permissions */ + NOT_RESTRICTED(caller_pt); + + /* Is one or all pads? */ + if ((new_pad_first == SC_P_ALL) || (new_pad_last == SC_P_ALL)) + { + /* Set range to cover all pads */ + p0 = 0U; + pN = SC_NUM_PAD - 1U; + } + else + { + if (new_pad_first > new_pad_last) + { + sc_pad_t temp = new_pad_first; + new_pad_first = new_pad_last; + new_pad_last = temp; + } + + /* Check parameters */ + BOUND_PAD(new_pad_last); + ASRT_ERR(new_pad_first <= new_pad_last, SC_ERR_PARM); + + /* Set range to cover only the specified region */ + p0 = new_pad_first; + pN = new_pad_last; + } + + if (err == SC_ERR_NONE) + { + sc_pad_t p; + + /* Process range of pads */ + for (p = p0; p <= pN; p++) + { + /* Check ownership */ + ANCESTOR_C(rm_pad_data[p].owner); + + /* Check permissions */ + NOT_LOCKED_C(rm_pad_data[p].owner); + + /* Set flag */ + rm_pad_data[p].movable = movable; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Check if pad owned */ +/*--------------------------------------------------------------------------*/ +sc_bool_t rm_is_pad_owned(sc_rm_pt_t caller_pt, sc_pad_t pad) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t rtn = SC_FALSE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Check parameters */ + if (pad >= SC_NUM_PAD) + { + rtn = SC_FALSE; + } + else if (rm_pad_data[pad].owner == caller_pt) + { + rtn = SC_TRUE; + } + else + { + ; /* Intentional empty else */ + } + } + + return rtn; +} + +/*--------------------------------------------------------------------------*/ +/* Return the owner partition for a pad */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_get_pad_owner(sc_pad_t pad, sc_rm_pt_t *pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check parameters */ + BOUND_PAD(pad); + + if (err == SC_ERR_NONE) + { + *pt = rm_pad_data[pad].owner; + + SIMU_ASRT(*pt < SC_RM_NUM_PARTITION, + "bad pt"); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Create a new resource partition and assign resources */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_partition_create(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt, + sc_bool_t secure, sc_bool_t isolated, sc_bool_t restricted, + sc_bool_t grant, sc_bool_t coherent, sc_rsrc_t resource, + const sc_rsrc_t *rsrc_lst, uint32_t rsrc_cnt, + const sc_pad_t *pad_lst, uint32_t pad_cnt, + const sc_rm_mem_list_t *mem_lst, uint32_t mem_cnt) +{ + sc_err_t err = SC_ERR_NONE; + uint32_t idx; + + /* Allocate partition */ + FUNC_ERR(rm_partition_alloc(caller_pt, pt, secure, isolated, + restricted, grant, coherent)); + + /* Mark all resources and pads as not movable */ + FUNC_ERR(rm_set_resource_movable(caller_pt, SC_R_ALL, SC_R_ALL, + SC_FALSE)); + FUNC_ERR(rm_set_pad_movable(caller_pt, SC_P_ALL, SC_P_ALL, + SC_FALSE)); + + /* Mark all subsystem resources as movable */ + if (resource < SC_NUM_RESOURCE) + { + FUNC_ERR(rm_set_subsys_rsrc_movable(caller_pt, resource, + SC_TRUE)); + } + + /* Mark all resources in list as movable */ + idx = 0U; + while (idx < rsrc_cnt) + { + sc_rsrc_t first = rsrc_lst[idx]; + sc_rsrc_t last; + + /* Check for range */ + if ((first & RM_RANGE_MASK) != 0U) + { + first &= ~RM_RANGE_MASK; + idx++; + } + last = rsrc_lst[idx]; + + FUNC_ERR(rm_set_resource_movable(caller_pt, first, last, + SC_TRUE)); + + idx++; + } + + /* Mark all pads in list as movable */ + idx = 0U; + while (idx < pad_cnt) + { + sc_pad_t first = pad_lst[idx]; + sc_pad_t last; + + /* Check for range */ + if ((first & RM_RANGE_MASK) != 0U) + { + first &= ~RM_RANGE_MASK; + idx++; + } + last = pad_lst[idx]; + + FUNC_ERR(rm_set_pad_movable(caller_pt, first, last, + SC_TRUE)); + + idx++; + } + + /* Move everything flagged as movable */ + FUNC_ERR(rm_move_all(caller_pt, caller_pt, *pt, SC_TRUE, SC_TRUE)); + + /* Create and assign all memory in list */ + for (idx = 0U; idx < mem_cnt; idx++) + { + sc_rm_mr_t mr; + + /* Fragment memory */ + FUNC_ERR(rm_memreg_frag(caller_pt, &mr, + mem_lst[idx].addr_start, mem_lst[idx].addr_end)); + + /* Assign to new partition */ + FUNC_ERR(rm_assign_memreg(caller_pt, *pt, mr)); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Enable blocking */ +/*--------------------------------------------------------------------------*/ +void rm_enable_blocking(void) +{ + blocking = SC_TRUE; + + (void) rm_init_subsys(SC_SUBSYS_SC, SC_TRUE); +} + +/*--------------------------------------------------------------------------*/ +/* Reload subsystem after a power on */ +/*--------------------------------------------------------------------------*/ +sc_err_t rm_init_subsys(sc_sub_t ss, sc_bool_t block_enb) +{ + #ifdef XRDC_SUPPORT + sc_rm_idx_t r; + + SIMU_ASRT(ss < SC_NUM_SUBSYS, + "bad ss"); + + /* Enable RDC master (if powered) */ + ss_rdc_enable(ss, SC_TRUE); + + /* Load resource info */ + for (r = rm_ss_map_data[ss]; r < SC_NUM_RSRC; r++) + { + if ((block_enb != SC_FALSE) && (rm_rsrc_data[r].owner + == SC_SUBSYS_SC)) + { + continue; + } + + if (rm_rsrc_data[r].ss == ss) + { + (void) update_rdc_resource(r, SC_TRUE, SC_TRUE); + } + else + { + break; + } + } + + /* Load memory region info */ + if (block_enb == SC_FALSE) + { + rm_load_memrg(); + } + + /* Enable RDC and load XRDC defaults (if powered) */ + ss_rdc_enable(ss, SC_FALSE); + + /* Load child subsystems */ + for (sc_sub_t css = 0U; css < SC_NUM_SUBSYS; css++) + { + if ((sc_ss_info[css].parent == ss) + && (ss_is_powered(css) == SC_TRUE)) + { + (void) rm_init_subsys(css, block_enb); + } + } + #endif /* XRDC_SUPPORT */ + + return SC_ERR_NONE; +} + +/*--------------------------------------------------------------------------*/ +/* Reload memory region info */ +/*--------------------------------------------------------------------------*/ +void rm_load_memrg(void) +{ + sc_rm_mr_t m; + + /* Loop over all memory regions in list */ + for (m = 0U; m < rm_mreg_list_count; m++) + { + /* Get region from ordered list */ + sc_rm_mr_t mr = rm_mreg_list[m]; + + /* Update region */ + (void) update_rdc_memreg(mr, rm_mreg_data[mr].start, + rm_mreg_data[mr].end, rm_mreg_data[mr].start, + rm_mreg_data[mr].end); + } +} + +/*--------------------------------------------------------------------------*/ +/* Dump RM state for debug */ +/*--------------------------------------------------------------------------*/ +void rm_dump(sc_rm_pt_t caller_pt) +{ + #ifdef DEBUG + sc_rm_pt_t p; + + debug_print(0, "\n*** Partitions **********************************\n"); + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + rm_dump_partition(p); + } + + debug_print(0, "\n*** Resources ***********************************\n"); + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + rm_dump_resources(p); + } + + debug_print(0, "\n*** Memory Regions ******************************\n"); + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + rm_dump_memregs(p); + } + + debug_print(0, "\n*** Pads ****************************************\n"); + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + rm_dump_pads(p); + } + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Dump RM resource state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) + void rm_dump_partition(sc_rm_pt_t pt) + { + SIMU_ASRT(pt < SC_RM_NUM_PARTITION, + "bad pt"); + + /* Check if partition enabled */ + if (rm_is_partition_used(pt) != SC_FALSE) + { + /* Dump data */ + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + always_print(" Partition: %u", pt); + if (rm_part_names[pt] != NULL) + { + always_print(" (%s)", rm_part_names[pt]); + } + always_print("\n"); + #else + always_print(" Partition: %u\n", pt); + #endif + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + always_print(" Parent: %u", + rm_part_data[pt].parent); + if (rm_part_names[rm_part_data[pt].parent] != NULL) + { + always_print(" (%s)", + rm_part_names[rm_part_data[pt].parent]); + } + always_print("\n"); + #else + always_print(" Parent: %u\n", + rm_part_data[pt].parent); + #endif + always_print(" DID: %u\n", rm_part_data[pt].did); + always_print(" Flags:\n"); + if (rm_part_data[pt].used != SC_FALSE) + { + always_print(" Used\n"); + } + if (rm_part_data[pt].secure != SC_FALSE) + { + always_print(" Secure\n"); + } + if (rm_part_data[pt].restricted != SC_FALSE) + { + always_print(" Restricted\n"); + } + if (rm_part_data[pt].isolated != SC_FALSE) + { + always_print(" Isolated\n"); + } + if (rm_part_data[pt].confidential != SC_FALSE) + { + always_print(" Confidential\n"); + } + if (rm_part_data[pt].locked != SC_FALSE) + { + always_print(" Locked\n"); + } + if (rm_part_data[pt].grant != SC_FALSE) + { + always_print(" Grant\n"); + } + if (rm_is_sys_access(pt)) + { + always_print(" System Access\n"); + } + } + } +#endif + +/*--------------------------------------------------------------------------*/ +/* Dump RM resource state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) + void rm_dump_resources(sc_rm_pt_t pt) + { + /* Check if partition enabled */ + if (rm_is_partition_used(pt) != SC_FALSE) + { + sc_rm_idx_t r; + + /* Dump data */ + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + always_print(" Partition: %u", pt); + if (rm_part_names[pt] != NULL) + { + always_print(" (%s)", rm_part_names[pt]); + } + always_print("\n"); + #else + always_print(" Partition: %u\n", pt); + #endif + for (r = 0; r < SC_NUM_RSRC; r++) + { + if ((rm_rsrc_data[r].owner == pt) + && (rm_is_ridx_avail(r) != SC_FALSE)) + { + always_print(" %s\n", rnames[r]); + + if ((rm_is_ridx_master(r) != SC_FALSE) + && (rm_rsrc_data[r].sid != SC_BYPASS_SID)) + { + always_print(" SID: 0x%X\n", + rm_rsrc_data[r].sid); + } + } + } + } + } +#endif + +/*--------------------------------------------------------------------------*/ +/* Dump RM memreg state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) + void rm_dump_memregs(sc_rm_pt_t pt) + { + /* Check if partition enabled */ + if (rm_is_partition_used(pt) != SC_FALSE) + { + sc_rm_mr_t m; + + /* Dump data */ + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + always_print(" Partition: %u", pt); + if (rm_part_names[pt] != NULL) + { + always_print(" (%s)", rm_part_names[pt]); + } + always_print("\n"); + #else + always_print(" Partition: %u\n", pt); + #endif + for (m = 0; m < SC_RM_NUM_MEMREG; m++) + { + if ((rm_mreg_data[m].used != SC_FALSE) + && (rm_mreg_data[m].owner == pt)) + { + sc_faddr_t start, end; + sc_rm_pt_t p; + + start = rm_mreg_data[m].start; + end = rm_mreg_data[m].end; + always_print(" %03d: 0x%01X", m, + UINT64_H(start)); + always_print("%08X", + UINT64_L(start)); + always_print(" - 0x%01X", + UINT64_H(end)); + always_print("%08X\n", + UINT64_L(end)); + always_print(" "); + always_print("Perms: "); + for (p = 0; p < SC_RM_NUM_PARTITION; p++) + { + sc_rm_did_t d = rm_part_data[p].did; + sc_rm_perm_t perm; + + if (rm_part_data[p].used == SC_FALSE) + { + always_print("x"); + } + else + { + get_perms(rm_mreg_data[m].perms, d, &perm); + always_print("%d", perm); + } + } + always_print("\n"); + if (rm_mreg_data[m].parent != m) + { + always_print(" "); + always_print("Parent: %u\n", rm_mreg_data[m].parent); + } + if (rm_mreg_data[m].rmsg != 0U) + { + always_print(" "); + always_print("RMSG: %u\n", rm_mreg_data[m].rmsg); + } + if (rm_mreg_data[m].det != 0U) + { + always_print(" "); + always_print("DET: %u\n", rm_mreg_data[m].det); + } + } + } + } + } +#endif + +/*--------------------------------------------------------------------------*/ +/* Dump RM pad state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) + void rm_dump_pads(sc_rm_pt_t pt) + { + /* Check if partition enabled */ + if (rm_is_partition_used(pt) != SC_FALSE) + { + sc_pad_t n; + + /* Dump data */ + #if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + always_print(" Partition: %u", pt); + if (rm_part_names[pt] != NULL) + { + always_print(" (%s)", rm_part_names[pt]); + } + always_print("\n"); + #else + always_print(" Partition: %u\n", pt); + #endif + for (n = 0; n < SC_NUM_PAD; n++) + { + if (rm_pad_data[n].owner == pt) + { + always_print(" %s\n", pnames[n]); + } + } + } + } +#endif + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Clear all resource permissions */ +/*--------------------------------------------------------------------------*/ +static void clear_perms(permz_t *perms) +{ + sc_rm_did_t d; + + for (d = 0; d < (SC_RM_NUM_DOMAIN / 2U); d++) + { + perms[d] = 0; + } +} + +/*--------------------------------------------------------------------------*/ +/* Copy memory region permissions */ +/*--------------------------------------------------------------------------*/ +static void copy_perms(sc_rm_mr_t mr_src, sc_rm_mr_t mr_dst) +{ + sc_rm_did_t d; + + SIMU_ASRT(mr_src < SC_RM_NUM_MEMREG, + "bad mr"); + SIMU_ASRT(mr_dst < SC_RM_NUM_MEMREG, + "bad mr"); + + for (d = 0; d < (SC_RM_NUM_DOMAIN / 2U); d++) + { + rm_mreg_data[mr_dst].perms[d] = rm_mreg_data[mr_src].perms[d]; + } +} + +/*--------------------------------------------------------------------------*/ +/* Set resource permission for a domain */ +/*--------------------------------------------------------------------------*/ +static void set_perms(permz_t *perms, sc_rm_did_t did, + sc_rm_perm_t perm) +{ + uint8_t byte = did / 2U; + uint8_t bit = (did % 2U) * 4U; + permz_t data; + + /* Check parms */ + SIMU_ASRT(did < SC_RM_NUM_DOMAIN, + "bad did"); + + /* Encode perm */ + data = perms[byte]; + data &= ~(0x7U << bit); + data |= perm << bit; + perms[byte] = data; +} + +/*--------------------------------------------------------------------------*/ +/* Get permissions for a domain */ +/*--------------------------------------------------------------------------*/ +static void get_perms(const permz_t *perms, sc_rm_did_t did, + sc_rm_perm_t *perm) +{ + uint8_t byte = did / 2U; + uint8_t bit = (did % 2U) * 4U; + + /* Check parms */ + SIMU_ASRT(did < SC_RM_NUM_DOMAIN, + "bad did"); + + /* Extract perm */ + *perm = (perms[byte] >> bit) & 0x7U; +} + +/*--------------------------------------------------------------------------*/ +/* Update RDC resource */ +/*--------------------------------------------------------------------------*/ +static void update_rdc_resource(sc_rm_idx_t idx, sc_bool_t master, + sc_bool_t peripheral) +{ + #ifdef XRDC_SUPPORT + sc_bool_t is_master = SC_FALSE; + sc_bool_t is_peripheral = SC_FALSE; + + SIMU_ASRT(idx < SC_NUM_RSRC, + "bad rsrc idx"); + SIMU_ASRT(rm_rsrc_data[idx].owner < SC_RM_NUM_PARTITION, + "bad owner pt"); + + if (rm_rsrc_data[idx].ss <= SC_SUBSYS_LAST) + { + is_master = ss_base_info[rm_rsrc_data[idx].ss] + ->rsrc[rm_rsrc_data[idx].ss_idx].master; + is_peripheral = ss_base_info[rm_rsrc_data[idx].ss] + ->rsrc[rm_rsrc_data[idx].ss_idx].peripheral; + } + + /* Update Master */ + if ((is_master != SC_FALSE) && (master != SC_FALSE)) + { + sc_rm_spa_t sa = rm_rsrc_data[idx].sa; + sc_rm_spa_t pa = rm_rsrc_data[idx].pa; + sc_rm_did_t did = rm_part_data[rm_rsrc_data[idx].owner].did; + sc_rm_sid_t sid = rm_rsrc_data[idx].sid; + + ss_rdc_set_master(idx, SC_TRUE, SC_FALSE, sa, pa, did, sid, 0xFF); + } + + /* Update Peripheral */ + if ((is_peripheral != SC_FALSE) && (peripheral != SC_FALSE)) + { + sc_rm_did_t d; + sc_rm_perm_t perms[SC_RM_NUM_DOMAIN]; + + /* Extract compressed access perms */ + for (d = 0; d < SC_RM_NUM_DOMAIN; d++) + { + get_perms(rm_rsrc_data[idx].perms, d, &(perms[d])); + } + + /* SC always needs access */ + perms[SC_DID] = SC_RM_PERM_SEC_RW; + + /* Grant parent access */ + if (rm_part_data[rm_rsrc_data[idx].owner].grant != SC_FALSE) + { + sc_rm_did_t did = rm_part_data[rm_rsrc_data[idx].owner].did; + sc_rm_did_t pdid + = rm_part_data[rm_part_data[rm_rsrc_data[idx].owner].parent].did; + + perms[pdid] = MAX(perms[pdid], perms[did]); + } + + /* Block access */ + if ((blocking != SC_FALSE) && (rm_rsrc_data[idx].block != SC_FALSE)) + { + for (d = 0; d < SC_RM_NUM_DOMAIN; d++) + { + perms[d] = SC_RM_PERM_NONE; + } + } + + ss_rdc_set_peripheral(idx, SC_TRUE, SC_FALSE, perms, SC_FALSE); + } + #endif /* XRDC_SUPPORT */ +} + +/*--------------------------------------------------------------------------*/ +/* Update RDC memory region */ +/*--------------------------------------------------------------------------*/ +static sc_err_t update_rdc_memreg(sc_rm_mr_t mr, sc_faddr_t old_start, + sc_faddr_t old_end, sc_faddr_t new_start, sc_faddr_t new_end) +{ + #ifdef XRDC_SUPPORT + sc_rm_did_t d; + sc_rm_perm_t perms[SC_RM_NUM_DOMAIN]; + sc_rm_mr_t m; + sc_bool_t used; + + SIMU_ASRT(mr < SC_RM_NUM_MEMREG, + "bad mr"); + SIMU_ASRT(rm_mreg_data[mr].owner < SC_RM_NUM_PARTITION, + "bad owner pt"); + + /* Prep */ + used = SC_FALSE; + for (d = 0U; d < SC_RM_NUM_DOMAIN; d++) + { + perms[d] = 0U; + } + + /* Extract permissions for all coincident regions */ + for (m = 0U; m < SC_RM_NUM_MEMREG; m++) + { + /* Coincident? */ + if ((rm_mreg_data[m].used != SC_FALSE) + && (rm_mreg_data[m].start == old_start) + && (rm_mreg_data[m].end == old_end)) + { + /* Extract compressed access perms */ + for (d = 0U; d < SC_RM_NUM_DOMAIN; d++) + { + sc_rm_perm_t p; + + /* Get permissions */ + get_perms(rm_mreg_data[m].perms, d, &p); + + /* Take max */ + perms[d] = MAX(perms[d], p); + } + + if (rm_mreg_data[m].used != SC_FALSE) + { + used = SC_TRUE; + } + } + } + + /* SC always needs access */ + perms[SC_DID] = SC_RM_PERM_SEC_RW; + + /* Give SECO access if monitor in use */ + if (has_monitor != SC_FALSE) + { + perms[SECO_DID] = MAX(perms[SECO_DID], SC_RM_PERM_SEC_RW); + } + + /* Grant parent access */ + if (rm_part_data[rm_mreg_data[mr].owner].grant != SC_FALSE) + { + sc_rm_did_t did = rm_part_data[rm_mreg_data[mr].owner].did; + sc_rm_did_t pdid + = rm_part_data[rm_part_data[rm_mreg_data[mr].owner].parent].did; + + perms[pdid] = MAX(perms[pdid], perms[did]); + } + +#ifdef ERR050601_WORKAROUND + /* Update perms to block AP */ + soc_block_ap_memreg(mr, perms); +#endif + + return ss_rdc_set_memory(rm_mreg_data[mr].start, rm_mreg_data[mr].end, + used, perms, rm_mreg_data[mr].det, rm_mreg_data[mr].rmsg, + new_start, new_end); + #else + return SC_ERR_NONE; + #endif /* XRDC_SUPPORT */ +} + +/** @} */ + diff --git a/platform/svc/rm/svc.h b/platform/svc/rm/svc.h new file mode 100755 index 0000000..2bae1d4 --- /dev/null +++ b/platform/svc/rm/svc.h @@ -0,0 +1,757 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/rm/svc.h + * + * Header file containing the API for the System Controller (SC) Resource + * Management (RM) function. This includes functions for partitioning + * resources, pads, and memory regions. + * + * @addtogroup RM_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_RM_SVC_H +#define SC_RM_SVC_H + +/* Includes */ + +#include "main/main.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! Width of SS index */ +#define SC_SS_IDX_W 8U + +/*! Define used to indicate function should apply to all partitions */ +#define SC_PT_ALL SC_RM_NUM_PARTITION + +#define RM_RANGE_MASK U16(0x8000U) +#define RM_RANGE(X,Y) ((X) | RM_RANGE_MASK), (Y) + +/* Types */ + +/*! Type for a ss resource index */ +typedef uint8_t sc_ss_idx_t; + +/*! + * This type is used for a memory list. + */ +typedef struct +{ + sc_faddr_t addr_start; + sc_faddr_t addr_end; +} sc_rm_mem_list_t; + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/*! + * Internal SC function to initialize the RM service. + * + * @param[in] api_phase init phase + * + * Initializes the API if /a api_phase = SC_TRUE, otherwise initializes the HW + * managed by the RM service. API must be initialized before anything else is + * done with the service. + */ +void rm_init(sc_bool_t api_phase); + +/*! + * Internal SC function to specify the number of static partitions. + * + * @param[in] num number of static partitions + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Static partitions will be skipped when a new partition is allocated. + * The minimum possible is 0 and the max possible is SC_RM_NUM_PARTITION. + */ +sc_err_t rm_reserve_static_pt(sc_rm_pt_t num); + +/*! + * Internal SC function to specify the number of static domains. + * + * @param[in] num number of static domains + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Static domains will be skipped when a new partition is allocated. + * The minimum possible is 0 and the max possible is SC_RM_NUM_DOMAIN. + */ +sc_err_t rm_reserve_static_did(sc_rm_did_t num); + +/*! + * Internal SC function to request that the SC create a new resource partition. + * + * @see sc_rm_partition_alloc(). + */ +sc_err_t rm_partition_alloc(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt, + sc_bool_t secure, sc_bool_t isolated, sc_bool_t restricted, sc_bool_t grant, + sc_bool_t coherent); + +/*! + * Internal SC function to make a partition confidential. + * + * @see sc_rm_set_confidential(). + */ +sc_err_t rm_set_confidential(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, sc_bool_t retro); + +/*! + * Internal SC function to free a partition and assigns all resources to the caller. + * + * @see sc_rm_partition_free(). + */ +sc_err_t rm_partition_free(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to get the partition handle of the caller. + * + * @see sc_rm_get_partition(). + */ +sc_err_t rm_get_partition(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt); + +/*! + * Internal SC function to determine if a partition is enabled (used) or not. + * + * @param[in] pt partition to check + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_bool_t rm_is_partition_used(sc_rm_pt_t pt); + +/*! + * Internal SC function to get the security state of partition. + * + * @return Returns SC_TRUE if \a caller's partition is secure. + */ +sc_bool_t rm_is_secure_partition(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to get the isolation state of partition. + * + * @return Returns SC_TRUE if \a caller's partition is isolated. + */ +sc_bool_t rm_is_partition_isolated(sc_rm_pt_t pt); + +/*! + * Internal SC function to return if the partition has system access. + * + * @param[in] pt partition to check + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_bool_t rm_is_sys_access(sc_rm_pt_t pt); + +/*! + * Internal SC function to set the control partition. + * + * @param[in] pt partition to be controlled + * @param[in] control partition that will have control + * + * Allows the following functions to be called by \a control for + * partition \a pt. + * + * - sc_pm_boot() + * - sc_pm_set_partition_power_mode() + * - sc_pm_reboot_partition() + */ +void rm_set_control_partition(sc_rm_pt_t pt, sc_rm_pt_t control); + +/*! + * Internal SC function to return the control partition. + * + * @param[in] pt partition to return + * + * @return Returns the control partition (0 if none). + */ +sc_rm_pt_t rm_get_control_partition(sc_rm_pt_t pt); + +/*! + * Internal SC function to return the parent of a partition. + * + * @param[in] pt partition to check + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_rm_pt_t rm_get_partition_parent(sc_rm_pt_t pt); + +/*! + * Internal SC function to get the DID of the caller's partition. + * + * @see sc_rm_get_did(). + */ +sc_rm_did_t rm_get_did(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to force a partition to use a specific static DID. + * + * @see sc_rm_partition_static(). + */ +sc_err_t rm_partition_static(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rm_did_t did); + +/*! + * Internal SC function to lock a partition. + * + * @see sc_rm_partition_lock(). + */ +sc_err_t rm_partition_lock(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to set a new parent for a partition. + * + * @see sc_rm_set_parent(). + */ +sc_err_t rm_set_parent(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rm_pt_t pt_parent); + +/*! + * Internal SC function to check if caller is the parent of a partition. + * + * @param[in] caller_pt handle of caller partition + * @param[in] pt handle of partition to check + * + * Returns SC_TRUE of the caller is the parent of another partition. + * Used to check access permissions on functions that affect a partition. + */ +sc_bool_t rm_is_parent(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to check if caller is an ancestor of owner. + * + * @param[in] caller_pt handle of caller partition + * @param[in] pt_owner handle of owner partition + * + * Returns SC_TRUE of the caller is the owner or is an ancestor of the + * owner. Used to check access permissions on functions that affect + * a partition. + */ +sc_bool_t rm_check_ancestor(sc_rm_pt_t caller_pt, sc_rm_pt_t pt_owner); + +/*! + * Internal SC function to move all resources/pads owned by a source partition to a + * destination partition. + * + * @see sc_rm_move_all(). + */ +sc_err_t rm_move_all(sc_rm_pt_t caller_pt, sc_rm_pt_t pt_src, + sc_rm_pt_t pt_dst, sc_bool_t move_rsrc, sc_bool_t move_pads); + +/*! + * Internal SC function to assign ownership of a resource to a partition. + * + * @see sc_rm_assign_resource(). + */ +sc_err_t rm_assign_resource(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rsrc_t resource); + +/*! + * Internal SC function to flag resource as movable or not. + * + * @see sc_rm_set_resource_movable(). + */ +sc_err_t rm_set_resource_movable(sc_rm_pt_t caller_pt, + sc_rsrc_t resource_fst, sc_rsrc_t resource_lst, sc_bool_t movable); + +/*! + * Internal SC function to flag all of a subsystem's resources as movable + * or not. + * + * @see sc_rm_set_subsys_rsrc_movable(). + */ + sc_err_t rm_set_subsys_rsrc_movable(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_bool_t movable); + +/*! + * Internal SC function to set attributes for a resource which is a bus master + * (i.e. capable of DMA). + * + * @see sc_rm_set_master_attributes(). + */ +sc_err_t rm_set_master_attributes(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_spa_t sa, sc_rm_spa_t pa, sc_bool_t smmu_bypass); + +/*! + * Internal SC function to set the StreamID for a resource which is a + * bus master (i.e. capable of DMA). + * + * @see sc_rm_set_master_sid(). + */ +sc_err_t rm_set_master_sid(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_sid_t sid); + +/*! + * Internal SC function to update a master resource. It takes a + * resource index as an argument. + * + * @param[in] idx unified resource index + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t rm_update_master(sc_rm_idx_t idx); + +/*! + * Internal SC function to set access permissions for a peripheral resource. + * + * @see sc_rm_set_peripheral_permissions(). + */ +sc_err_t rm_set_peripheral_permissions(sc_rm_pt_t caller_pt, + sc_rsrc_t resource, sc_rm_pt_t pt, sc_rm_perm_t perm); + +/*! + * Internal SC function to update a peripheral resource. It takes a + * resource index as an argument. + * + * @param[in] idx unified resource index + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t rm_update_peripheral(sc_rm_idx_t idx); + +/*! + * Internal SC function to update a resource in HW. + * + * @param[in] resource resource to update + */ +void rm_update_resource(sc_rsrc_t resource); + +/*! + * Internal SC function to return subsystem specific info about a resource. It + * takes a resource index as an argument. + * + * @param[in] idx unified resource index + * @param[out] ss subsystem + * @param[out] ss_idx subsystem relative resource index + */ +void rm_get_ridx_ss_info(sc_rm_idx_t idx, sc_sub_t *ss, sc_ss_idx_t *ss_idx); + +/*! + * Internal SC function to check the validity of a resource and return the + * unified resource index. + * + * @param[in] resource resource to check + * @param[out] idx unified resource index + * + * @return Returns SC_TRUE if \a resource is valid. + * + * The index can be used to index into any resource array of size + * SC_NUM_RSRCS. It is also used for most private RM functions. + */ +sc_bool_t rm_check_map_ridx(sc_rsrc_t resource, sc_rm_idx_t *idx); + +/*! + * Internal SC function to check the validity of a resource and return the + * unified resource index. + * + * @param[in] resource resource to check + * @param[out] idx unified resource index + * + * The index can be used to index into any resource array of size + * SC_NUM_RSRCS. It is also used for most private RM functions. + */ +void rm_check_map_ridx_v(sc_rsrc_t resource, sc_rm_idx_t *idx); + +/*! + * Internal SC function to get ownership status of a resource. + * + * @see sc_rm_is_resource_owned(). + */ +sc_bool_t rm_is_resource_owned(sc_rm_pt_t caller_pt, sc_rsrc_t resource); + +/*! + * Internal SC function to check if a resource is owned by the caller. It takes a + * resource index as an argument. + * + * @param[in] caller_pt handle of caller partition + * @param[in] idx unified resource index + * + * @return Returns SC_TRUE if \a idx is owned. + */ +sc_bool_t rm_is_ridx_owned(sc_rm_pt_t caller_pt, sc_rm_idx_t idx); + +/*! + * Internal SC function to check if a resource is available. It takes a + * resource as an argument. Resource availability is based in hardware, + * fuses, and board. Not based on partition ownership. + * + * @param[in] resource resource to check + * + * @return Returns SC_TRUE if \a resource is available. + */ +sc_bool_t rm_is_resource_avail(sc_rsrc_t resource); + +/*! + * Internal SC function covvert a resource index to a resource. + * + * @param[in] idx unified resource index + * + * @return Returns resource. +*/ +sc_rsrc_t rm_get_resource(sc_rm_idx_t idx); + +/*! + * Internal SC function to check if a resource is available. It takes a + * resource index as an argument. Resource availability is based in + * hardware, fuses, and board. Not based on partition ownership. + * + * @param[in] idx unified resource index + * + * @return Returns SC_TRUE if \a idx is available. + */ +sc_bool_t rm_is_ridx_avail(sc_rm_idx_t idx); + +/*! + * Internal SC function to get access rights of a resource. + * + * @param[in] caller_pt handle of caller partition + * @param[in] resource resource to check + * + * @return Returns SC_TRUE if \a resource is accessible. + */ +sc_bool_t rm_is_resource_access_allowed(sc_rm_pt_t caller_pt, sc_rsrc_t resource); + +/*! + * Internal SC function to check if a resource is controllable by the caller. + * It takes a resource index as an argument. + * + * @param[in] caller_pt handle of caller partition + * @param[in] idx unified resource index + * + * @return Returns SC_TRUE if \a idx access is allowed. + */ +sc_bool_t rm_is_ridx_access_allowed(sc_rm_pt_t caller_pt, sc_rm_idx_t idx); + +/*! + * Internal SC function to return the owner partition for a resource. + * + * @see sc_rm_get_resource_owner(). + */ +sc_err_t rm_get_resource_owner(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_pt_t *pt); + +/*! + * Internal SC function to return the ownering partition for a resource. It takes a + * resource index as an argument. + * + * @param[in] idx unified resource index + * @param[out] pt return handle for partition + */ +void rm_get_ridx_owner(sc_rm_idx_t idx, sc_rm_pt_t *pt); + +/*! + * Internal SC function used to test if a resource is a bus master. + * + * @see sc_rm_is_resource_master(). + */ +sc_bool_t rm_is_resource_master(sc_rm_pt_t caller_pt, sc_rsrc_t resource); + +/*! + * Internal SC function to check if a resource is a master. It takes a + * resource index as an argument. + * + * @param[in] idx unified resource index + * + * @return Returns SC_TRUE if \a idx is a master. + */ +sc_bool_t rm_is_ridx_master(sc_rm_idx_t idx); + +/*! + * Internal SC function used to test if a resource is a peripheral. + * + * @see sc_rm_is_resource_peripheral(). + */ +sc_bool_t rm_is_resource_peripheral(sc_rm_pt_t caller_pt, sc_rsrc_t resource); + +/*! + * Internal SC function to check if a resource is a peripheral. It takes a + * resource index as an argument. + * + * @param[in] idx unified resource index + * + * @return Returns SC_TRUE if \a idx is a peripheral. + */ +sc_bool_t rm_is_ridx_peripheral(sc_rm_idx_t idx); + +/*! + * Internal SC function used to obtain info about a resource. + * + * @see sc_rm_get_resource_info(). + */ +sc_err_t rm_get_resource_info(sc_rm_pt_t caller_pt, sc_rsrc_t resource, + sc_rm_sid_t *sid); + +/*! + * Internal SC function to control if a access to a resource should be + * blocked via HW. + * + * @param[in] idx unified resource index + * @param[in] block block state (SC_TRUE to block) + * + * @return Returns current block state. + */ +sc_bool_t rm_ridx_block(sc_rm_idx_t idx, sc_bool_t block); + +/*! + * Internal SC function to request that the SC create a new memory region. + * + * @see sc_rm_memreg_alloc(). + */ +sc_err_t rm_memreg_alloc(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * Internal SC function to split a memory region. + * + * @see sc_rm_memreg_split(). + */ +sc_err_t rm_memreg_split(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_mr_t *mr_ret, sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * Internal SC function to fragment a memory region. + * + * @see sc_rm_memreg_frag(). + */ +sc_err_t rm_memreg_frag(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr_ret, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * Internal SC function to free a memory region. + * + * @see sc_rm_memreg_free(). + */ +sc_err_t rm_memreg_free(sc_rm_pt_t caller_pt, sc_rm_mr_t mr); + +/*! + * Internal SC function to find a memory region. + * + * @see sc_rm_find_memreg(). + */ +sc_err_t rm_find_memreg(sc_rm_pt_t caller_pt, sc_rm_mr_t *mr, + sc_faddr_t addr_start, sc_faddr_t addr_end); + +/*! + * Internal SC function to assign ownership of a memory region. + * + * @see sc_rm_assign_memreg(). + */ +sc_err_t rm_assign_memreg(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_rm_mr_t mr); + +/*! + * Internal SC function to set access permissions for a memory region. + * + * @see sc_rm_set_memreg_permissions(). + */ +sc_err_t rm_set_memreg_permissions(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_pt_t pt, sc_rm_perm_t perm); + +/*! + * Internal SC function to set configure IEE parameters for a mem region. + * + * @see sc_rm_set_memreg_iee(). + */ +sc_err_t rm_set_memreg_iee(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_rm_det_t det, sc_rm_rmsg_t rmsg); + +/*! + * Internal SC function to get ownership status of a memory region. + * + * @see sc_rm_is_memreg_owned(). + */ +sc_bool_t rm_is_memreg_owned(sc_rm_pt_t caller_pt, sc_rm_mr_t mr); + +/*! + * Internal SC function used to obtain info about a memory region. + * + * @see sc_rm_get_memreg_info(). + */ +sc_err_t rm_get_memreg_info(sc_rm_pt_t caller_pt, sc_rm_mr_t mr, + sc_faddr_t *addr_start, sc_faddr_t *addr_end); + +/*! + * Internal SC function to assign ownership of a pad to a partition. + * + * @see sc_rm_assign_pad(). + */ +sc_err_t rm_assign_pad(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_pad_t pad); + +/*! + * Internal SC function to flag pad as movable or not. + * + * @see sc_rm_set_pad_movable(). + */ +sc_err_t rm_set_pad_movable(sc_rm_pt_t caller_pt, sc_pad_t pad_first, + sc_pad_t pad_last, sc_bool_t movable); + +/*! + * Internal SC function to get ownership status of a pad. + * + * @see sc_rm_is_pad_owned(). + */ +sc_bool_t rm_is_pad_owned(sc_rm_pt_t caller_pt, sc_pad_t pad); + +/*! + * Internal SC function to get the owner of a pad. + * + * @param[in] pad pad to get + * @param[out] pt pointer to return partition + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t rm_get_pad_owner(sc_pad_t pad, sc_rm_pt_t *pt); + + +/*! + * Internal function to create a partition and assign all resources. + * + * @param[in] caller_pt handle of caller partition + * @param[out] pt return handle for partition + * @param[in] secure boolean indicating if this partition should be secure + * @param[in] isolated boolean indicating if this partition should be HW isolated + * @param[in] restricted boolean indicating if this partition should be restricted + * @param[in] grant boolean indicating if this partition should always grant + * @param[in] coherent boolean indicating if this partition is coherent + * @param[in] resource resource in subsystem to completly assign (SC_NUM_RESOURCE for none) + * @param[in] rsrc_lst pointer to resource list (NULL if none) + * @param[in] rsrc_cnt number of entries in the resource list (0 if none) + * @param[in] pad_lst pointer to pad list (NULL if none) + * @param[in] pad_cnt number of entries in the pad list (0 if none) + * @param[in] mem_lst pointer to memory list (NULL if none) + * @param[in] mem_cnt number of entries in the memory list (0 if none) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * See sc_rm_partition_alloc() for info on most parameters and error returns. + * + * Use RM_RANGE() to specifiy a resource/pad range. Counts as two in the + * count parameter. + */ +sc_err_t rm_partition_create(sc_rm_pt_t caller_pt, sc_rm_pt_t *pt, + sc_bool_t secure, sc_bool_t isolated, sc_bool_t restricted, + sc_bool_t grant, sc_bool_t coherent, sc_rsrc_t resource, + const sc_rsrc_t *rsrc_lst, uint32_t rsrc_cnt, + const sc_pad_t *pad_lst, uint32_t pad_cnt, + const sc_rm_mem_list_t *mem_lst, uint32_t mem_cnt); + +/*! + * Enable blocking of resources powered off. + */ +void rm_enable_blocking(void); + +/*! + * Internal SC function to reload a subsystem's XRDC info after a power on. + * + * @param[in] ss subsystem + * @param[in] block_enb flag to skip SCU, skip mem + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +sc_err_t rm_init_subsys(sc_sub_t ss, sc_bool_t block_enb); + +/*! + * Internal SC function to reload all memory regions. + */ +void rm_load_memrg(void); + +/*! + * Internal SC function to dump RM state for debug. + * + * @see sc_rm_set_pad_movable(). + */ +void rm_dump(sc_rm_pt_t caller_pt); + +/** @} */ + +#ifdef DEBUG + + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal partition state of the RM service. + * + * @param[in] pt partition to dump + */ + void rm_dump_partition(sc_rm_pt_t pt); + + /*! + * Internal SC function to dump the internal resource state of the RM service. + * + * @param[in] pt partition to dump + */ + void rm_dump_resources(sc_rm_pt_t pt); + + /*! + * Internal SC function to dump the internal memory state of the RM service. + * + * @param[in] pt partition to dump + */ + void rm_dump_memregs(sc_rm_pt_t pt); + + /*! + * Internal SC function to dump the internal pad state of the RM service. + * + * @param[in] pt partition to dump + */ + void rm_dump_pads(sc_rm_pt_t pt); + + /** @} */ +#endif + +/*! Max domain used */ +extern uint8_t rm_max_did; + +#if defined(DEBUG) && defined(HAS_PARTITION_NAMES) + /*! Partition name pointers */ + extern const char *rm_part_names[SC_RM_NUM_PARTITION]; +#endif + +#endif /* SC_RM_SVC_H */ + +/** @} */ + diff --git a/platform/svc/seco/Makefile b/platform/svc/seco/Makefile new file mode 100755 index 0000000..b5c5f8c --- /dev/null +++ b/platform/svc/seco/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/seco/svc.o + +RPCS += $(OUT)/svc/seco/rpc_srv.o + +RPCL += $(OUT)/svc/seco/rpc_clnt.o + +RPCH += $(SRC)/svc/seco/rpc.h + +RPCC += $(SRC)/svc/seco/rpc_srv.c \ + $(SRC)/svc/seco/rpc_clnt.c \ + $(SRC)/svc/seco/rpc_xlate.c + +RPCHDR += $(SRC)/svc/seco/rpc_header.h + +DIRS += $(OUT)/svc/seco + diff --git a/platform/svc/seco/api.h b/platform/svc/seco/api.h new file mode 100755 index 0000000..6d42dfc --- /dev/null +++ b/platform/svc/seco/api.h @@ -0,0 +1,952 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/seco/api.h + * + * Header file containing the public API for the System Controller (SC) + * Security (SECO) function. + * + * @addtogroup SECO_SVC SECO: Security Service + * + * @brief Module for the Security (SECO) service. + * + * @anchor seco_err + * + * @includedoc seco/details.dox + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SECO_API_H +#define SC_SECO_API_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! + * @name Defines for sc_seco_auth_cmd_t + */ +/** @{ */ +#define SC_SECO_AUTH_CONTAINER 0U /*!< Authenticate container */ +#define SC_SECO_VERIFY_IMAGE 1U /*!< Verify image */ +#define SC_SECO_REL_CONTAINER 2U /*!< Release container */ +#define SC_SECO_AUTH_SECO_FW 3U /*!< SECO Firmware */ +#define SC_SECO_AUTH_HDMI_TX_FW 4U /*!< HDMI TX Firmware */ +#define SC_SECO_AUTH_HDMI_RX_FW 5U /*!< HDMI RX Firmware */ +#define SC_SECO_EVERIFY_IMAGE 6U /*!< Enhanced verify image */ +/** @} */ + +/*! + * @name Defines for seco_rng_stat_t + */ +/** @{ */ +#define SC_SECO_RNG_STAT_UNAVAILABLE 0U /*!< Unable to initialize the RNG */ +#define SC_SECO_RNG_STAT_INPROGRESS 1U /*!< Initialization is on-going */ +#define SC_SECO_RNG_STAT_READY 2U /*!< Initialized */ +/** @} */ + +/* Types */ + +/*! + * This type is used to issue SECO authenticate commands. + */ +typedef uint8_t sc_seco_auth_cmd_t; + +/*! + * This type is used to return the RNG initialization status. + */ +typedef uint32_t sc_seco_rng_stat_t; + +/* Functions */ + +/*! + * @name Image Functions + * @{ + */ + +/*! + * This function loads a SECO image. + * + * @param[in] ipc IPC handle + * @param[in] addr_src address of image source + * @param[in] addr_dst address of image destination + * @param[in] len length of image to load + * @param[in] fw SC_TRUE = firmware load + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This is used to load images via the SECO. Examples include SECO + * Firmware and IVT/CSF data used for authentication. These are usually + * loaded into SECO TCM. \a addr_src is in secure memory. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 IMAGE_LOAD(UI64 addr_src, UI64 addr_dst, UI32 len, IB fw) #1 */ +sc_err_t sc_seco_image_load(sc_ipc_t ipc, sc_faddr_t addr_src, + sc_faddr_t addr_dst, uint32_t len, sc_bool_t fw); + +/*! + * This function is used to authenticate a SECO image or command. + * + * @param[in] ipc IPC handle + * @param[in] cmd authenticate command + * @param[in] addr address of/or metadata + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_BUSY if SECO is busy with another authentication request, + * - SC_ERR_FAIL if SECO response is bad, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This is used to authenticate a SECO image or issue a security + * command. \a addr often points to an container. It is also + * just data (or even unused) for some commands. + * + * Implementation of this command depends on the underlying security + * architecture of the device. For example, on devices with SECO FW, + * the following options apply: + * + * - cmd=SC_SECO_AUTH_CONTAINER, addr=container address (sends AHAB_AUTH_CONTAINER_REQ to SECO) + * - cmd=SC_SECO_VERIFY_IMAGE, addr=image mask (sends AHAB_VERIFY_IMAGE_REQ to SECO) + * - cmd=SC_SECO_REL_CONTAINER, addr unused (sends AHAB_RELEASE_CONTAINER_REQ to SECO) + * - cmd=SC_SECO_AUTH_HDMI_TX_FW, addr unused (sends AHAB_ENABLE_HDMI_X_REQ with Subsystem=0 to SECO) + * - cmd=SC_SECO_AUTH_HDMI_RX_FW, addr unused (sends AHAB_ENABLE_HDMI_X_REQ with Subsystem=1 to SECO) + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 AUTHENTICATE(UI8 cmd, UI64 addr) #2 */ +sc_err_t sc_seco_authenticate(sc_ipc_t ipc, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr); + +/*! + * This function is used to authenticate a SECO image or command. This is an + * enhanced version that has additional mask arguments. + * + * @param[in] ipc IPC handle + * @param[in] cmd authenticate command + * @param[in] addr address of/or metadata + * @param[in] mask1 metadata + * @param[in] mask2 metadata + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_BUSY if SECO is busy with another authentication request, + * - SC_ERR_FAIL if SECO response is bad, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This supports all the commands found in sc_seco_authenticate(). Those + * commands should set both masks to 0 (except SC_SECO_VERIFY_IMAGE). + + * New commands are as follows: + * + * - cmd=SC_SECO_VERIFY_IMAGE, addr unused, mask1=image mask, mask2 unused (sends AHAB_VERIFY_IMAGE_REQ to SECO) + * - cmd=SC_SECO_EVERIFY_IMAGE, addr=container address, mask1=image mask, mask2=move mask (sends AHAB_EVERIFY_IMAGE_REQ to SECO) + * + * Note SC_SECO_EVERIFY_IMAGE not available on all SoC or SoC versions. + * Calling with this option will return an error if not supported. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 ENH_AUTHENTICATE(UI8 cmd, UI64 addr, UI32 mask1, UI32 mask2) #24 */ +sc_err_t sc_seco_enh_authenticate(sc_ipc_t ipc, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr, + uint32_t mask1, uint32_t mask2); + +/** @} */ + +/*! + * @name Lifecycle Functions + * @{ + */ + +/*! + * This function updates the lifecycle of the device. + * + * @param[in] ipc IPC handle + * @param[in] change desired lifecycle transition + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is used for going from Open to NXP Closed to OEM Closed. + * Note \a change is NOT the new desired lifecycle. It is a lifecycle + * transition as documented in the SECO API Reference Guide. + * + * If any SECO request fails or only succeeds because the part is in an + * "OEM open" lifecycle, then a request to transition from "NXP closed" + * to "OEM closed" will also fail. For example, booting a signed container + * when the OEM SRK is not fused will succeed, but as it is an abnormal + * situation, a subsequent request to transition the lifecycle will return + * an error. + */ +/* IDL: E8 FORWARD_LIFECYCLE(UI32 change) #3 */ +sc_err_t sc_seco_forward_lifecycle(sc_ipc_t ipc, uint32_t change); + +/*! + * This function updates the lifecycle to one of the return lifecycles. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * To switch back to NXP states (Full Field Return), message must be signed + * by NXP SRK. For OEM States (Partial Field Return), must be signed by OEM + * SRK. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 RETURN_LIFECYCLE(UI64 addr) #4 */ +sc_err_t sc_seco_return_lifecycle(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function is used to commit into the fuses any new SRK revocation + * and FW version information that have been found in the primary and + * secondary containers. + * + * @param[in] ipc IPC handle + * @param[in,out] info pointer to information type to be committed + * + * The return \a info will contain what was actually committed. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if \a info is invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + */ +/* IDL: E8 COMMIT(UIO32 info) #5 */ +sc_err_t sc_seco_commit(sc_ipc_t ipc, uint32_t *info); + +/** @} */ + +/*! + * @name Attestation Functions + * @{ + */ + +/*! + * This function is used to set the attestation mode. Only the owner of + * the SC_R_ATTESTATION resource may make this call. + * + * @param[in] ipc IPC handle + * @param[in] mode mode + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if \a mode is invalid, + * - SC_ERR_NOACCESS if SC_R_ATTESTATON not owned by caller, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This is used to set the SECO attestation mode. This can be prover + * or verifier. See the SECO API Reference Guide for more on the + * supported modes, mode values, and mode behavior. + */ +/* IDL: E8 ATTEST_MODE(UI32 mode) #6 */ +sc_err_t sc_seco_attest_mode(sc_ipc_t ipc, uint32_t mode); + +/*! + * This function is used to request attestation. Only the owner of + * the SC_R_ATTESTATION resource may make this call. + * + * @param[in] ipc IPC handle + * @param[in] nonce unique value + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_NOACCESS if SC_R_ATTESTATON not owned by caller, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This is used to ask SECO to perform an attestation. The result depends + * on the attestation mode. After this call, the signature can be + * requested or a verify can be requested. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 ATTEST(UI64 nonce) #7 */ +sc_err_t sc_seco_attest(sc_ipc_t ipc, uint64_t nonce); + +/*! + * This function is used to retrieve the attestation public key. + * Mode must be verifier. Only the owner of the SC_R_ATTESTATION resource + * may make this call. + * + * @param[in] ipc IPC handle + * @param[in] addr address to write response + * + * Result will be written to \a addr. The \a addr parameter must point + * to an address SECO can access. It must be 64-bit aligned. There + * should be 96 bytes of space. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if \a addr bad or attestation has not been requested, + * - SC_ERR_NOACCESS if SC_R_ATTESTATON not owned by caller, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 GET_ATTEST_PKEY(UI64 addr) #8 */ +sc_err_t sc_seco_get_attest_pkey(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function is used to retrieve attestation signature and parameters. + * Mode must be provider. Only the owner of the SC_R_ATTESTATION resource + * may make this call. + * + * @param[in] ipc IPC handle + * @param[in] addr address to write response + * + * Result will be written to \a addr. The \a addr parameter must point + * to an address SECO can access. It must be 64-bit aligned. There + * should be 120 bytes of space. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if \a addr bad or attestation has not been requested, + * - SC_ERR_NOACCESS if SC_R_ATTESTATON not owned by caller, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 GET_ATTEST_SIGN(UI64 addr) #9 */ +sc_err_t sc_seco_get_attest_sign(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function is used to verify attestation. Mode must be verifier. + * Only the owner of the SC_R_ATTESTATION resource may make this call. + * + * @param[in] ipc IPC handle + * @param[in] addr address of signature + * + * The \a addr parameter must point to an address SECO can access. It must be + * 64-bit aligned. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if \a addr bad or attestation has not been requested, + * - SC_ERR_NOACCESS if SC_R_ATTESTATON not owned by caller, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_FAIL if signature doesn't match, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 ATTEST_VERIFY(UI64 addr) #10 */ +sc_err_t sc_seco_attest_verify(sc_ipc_t ipc, sc_faddr_t addr); + +/** @} */ + +/*! + * @name Key Functions + * @{ + */ + +/*! + * This function is used to generate a SECO key blob. + * + * @param[in] ipc IPC handle + * @param[in] id key identifier + * @param[in] load_addr load address + * @param[in] export_addr export address + * @param[in] max_size max export size + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is used to encapsulate sensitive keys in a specific structure + * called a blob, which provides both confidentiality and integrity protection. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 GEN_KEY_BLOB(UI32 id, UI64 load_addr, UI64 export_addr, UI16 max_size) #11 */ +sc_err_t sc_seco_gen_key_blob(sc_ipc_t ipc, uint32_t id, + sc_faddr_t load_addr, sc_faddr_t export_addr, uint16_t max_size); + +/*! + * This function is used to load a SECO key. + * + * @param[in] ipc IPC handle + * @param[in] id key identifier + * @param[in] addr key address + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is used to install private cryptographic keys encapsulated + * in a blob previously generated by SECO. The controller can be either the + * IEE or the VPU. The blob header carries the controller type and the key + * size, as provided by the user when generating the key blob. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 LOAD_KEY(UI32 id, UI64 addr) #12 */ +sc_err_t sc_seco_load_key(sc_ipc_t ipc, uint32_t id, + sc_faddr_t addr); + +/** @} */ + +/*! + * @name Manufacturing Protection Functions + * @{ + */ + +/*! + * This function is used to get the manufacturing protection public key. + * + * @param[in] ipc IPC handle + * @param[in] dst_addr destination address + * @param[in] dst_size destination size + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is supported only in OEM-closed lifecycle. It generates + * the mfg public key and stores it in a specific location in the secure + * memory. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 GET_MP_KEY(UI64 dst_addr, UI16 dst_size) #13 */ +sc_err_t sc_seco_get_mp_key(sc_ipc_t ipc, sc_faddr_t dst_addr, + uint16_t dst_size); + +/*! + * This function is used to update the manufacturing protection message + * register. + * + * @param[in] ipc IPC handle + * @param[in] addr data address + * @param[in] size size + * @param[in] lock lock_reg + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is supported only in OEM-closed lifecycle. It updates the + * content of the MPMR (Manufacturing Protection Message register of 256 + * bits). This register will be appended to the input-data message when + * generating the signature. Please refer to the CAAM block guide for details. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 UPDATE_MPMR(UI64 addr, UI8 size, UI8 lock) #14 */ +sc_err_t sc_seco_update_mpmr(sc_ipc_t ipc, sc_faddr_t addr, + uint8_t size, uint8_t lock); + +/*! + * This function is used to get the manufacturing protection signature. + * + * @param[in] ipc IPC handle + * @param[in] msg_addr message address + * @param[in] msg_size message size + * @param[in] dst_addr destination address + * @param[in] dst_size destination size + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_PARM if word fuse index param out of range or invalid, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * This function is used to generate an ECDSA signature for an input-data + * message and to store it in a specific location in the secure memory. It + * is only supported in OEM-closed lifecycle. In order to get the ECDSA + * signature, the RNG must be initialized. In case it has not been started + * an error will be returned. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 GET_MP_SIGN(UI64 msg_addr, UI16 msg_size, UI64 dst_addr, UI16 dst_size) #15 */ +sc_err_t sc_seco_get_mp_sign(sc_ipc_t ipc, sc_faddr_t msg_addr, + uint16_t msg_size, sc_faddr_t dst_addr, uint16_t dst_size); + +/** @} */ + +/*! + * @name Debug Functions + * @{ + */ + +/*! + * This function is used to return the SECO FW build info. + * + * @param[in] ipc IPC handle + * @param[out] version pointer to return build number + * @param[out] commit pointer to return commit ID (git SHA-1) + */ +/* IDL: R0 BUILD_INFO(UO32 version, UO32 commit) #16 */ +void sc_seco_build_info(sc_ipc_t ipc, uint32_t *version, + uint32_t *commit); + +/*! + * This function is used to return the V2X FW build info. + * + * @param[in] ipc IPC handle + * @param[out] version pointer to return build number + * @param[out] commit pointer to return commit ID (git SHA-1) + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_NOTFOUND if V2X not available, + * - SC_ERR_IPC if V2X response has bad header tag or size, + * - SC_ERR_VERSION if V2X response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + */ +/* IDL: E8 V2X_BUILD_INFO(UO32 version, UO32 commit) #30 ^API_HAS_V2X */ +sc_err_t sc_seco_v2x_build_info(sc_ipc_t ipc, uint32_t *version, + uint32_t *commit); + +/*! + * This function is used to return SECO chip info. + * + * @param[in] ipc IPC handle + * @param[out] lc pointer to return lifecycle + * @param[out] monotonic pointer to return monotonic counter + * @param[out] uid_l pointer to return UID (lower 32 bits) + * @param[out] uid_h pointer to return UID (upper 32 bits) + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + */ +/* IDL: E8 CHIP_INFO(UO16 lc, UO16 monotonic, UO32 uid_l, UO32 uid_h) #17 */ +sc_err_t sc_seco_chip_info(sc_ipc_t ipc, uint16_t *lc, + uint16_t *monotonic, uint32_t *uid_l, uint32_t *uid_h); + +/*! + * This function securely enables debug. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 ENABLE_DEBUG(UI64 addr) #18 */ +sc_err_t sc_seco_enable_debug(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function is used to return an event from the SECO error log. + * + * @param[in] ipc IPC handle + * @param[out] idx index of event to return + * @param[out] event pointer to return event + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Read of \a idx 0 captures events from SECO. Loop starting + * with 0 until an error is returned to dump all events. + */ +/* IDL: E8 GET_EVENT(UI8 idx, UO32 event) #19 */ +sc_err_t sc_seco_get_event(sc_ipc_t ipc, uint8_t idx, + uint32_t *event); + +/** @} */ + +/*! + * @name Miscellaneous Functions + * @{ + */ + +/*! + * This function securely writes a group of fuse words. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 FUSE_WRITE(UI64 addr) #20 */ +sc_err_t sc_seco_fuse_write(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function applies a patch. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 PATCH(UI64 addr) #21 */ +sc_err_t sc_seco_patch(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function partitions the monotonic counter. Only the owner of the + * SC_R_SYSTEM resource or a partition with access permissions to + * SC_R_SYSTEM can do this. + * + * @param[in] ipc IPC handle + * @param[in,out] she pointer to number of SHE bits + * + * SECO uses an OTP monotonic counter to protect the SHE and HSM key-stores + * from roll-back attack. This function is used to define the number of + * monotonic counter bits allocated to SHE use. Two monotonic counter bits + * are used to store this information while the remaining bits are allocated + * to the HSM user. This function must be called before any SHE or HSM key stores + * are created in the system, otherwise the default configuration is applied. + * Returns the actual number of SHE bits. + * + * If the partition has been already configured, any attempt to re-configure + * the SHE partition to a different value will result in a failure response. + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_NOACCESS if caller does not have SC_R_SYSTEM access + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 SET_MONO_COUNTER_PARTITION(UIO16 she) #28 */ +sc_err_t sc_seco_set_mono_counter_partition(sc_ipc_t ipc, uint16_t *she); + +/*! + * This function configures the SECO in FIPS mode. Only the owner of the + * SC_R_SYSTEM resource or a partition with access permissions to + * SC_R_SYSTEM can do this. + * + * @param[in] ipc IPC handle + * @param[in] mode FIPS mode + * @param[out] reason pointer to return failure reason + * + * This function permanently configures the SECO in FIPS approved mode. When in + * FIPS approved mode the following services will be disabled and receive a + * failure response: + * + * - Encrypted boot is not supported + * - Attestation is not supported + * - Manufacturing protection is not supported + * - DTCP load + * - SHE services are not supported + * - Assign JR is not supported (all JRs owned by SECO) + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_NOACCESS if caller does not have SC_R_SYSTEM access + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 SET_FIPS_MODE(UI8 mode, UO32 reason) #29 */ +sc_err_t sc_seco_set_fips_mode(sc_ipc_t ipc, uint8_t mode, uint32_t *reason); + +/*! + * This function will securely zeroize all plaintext secret and private + * cryptographic keys and CSPs within the module. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * This function is effective when the part is configured in FIPS approved + * mode only, no effects otherwise. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 FIPS_KEY_ZERO(UI64 addr) #31 */ +sc_err_t sc_seco_fips_key_zero(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function starts the random number generator. + * + * @param[in] ipc IPC handle + * @param[out] status pointer to return state of RNG + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * The RNG is started automatically after all CPUs are booted. This + * function can be used to start earlier and to check the status. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 START_RNG(UO32 status) #22 */ +sc_err_t sc_seco_start_rng(sc_ipc_t ipc, sc_seco_rng_stat_t *status); + +/*! + * This function sends a generic signed message to the + * SECO SHE/HSM components. + * + * @param[in] ipc IPC handle + * @param[in] addr address of message block + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Note \a addr must be a pointer to a signed message block. + * + * See the SECO API Reference Guide for more info. + */ +/* IDL: E8 SAB_MSG(UI64 addr) #23 */ +sc_err_t sc_seco_sab_msg(sc_ipc_t ipc, sc_faddr_t addr); + +/*! + * This function is used to enable security violation and tamper interrupts. + * These are then reported using the IRQ service via the SC_IRQ_SECVIO + * interrupt. Note it is automatically enabled at boot. + * + * @param[in] ipc IPC handle + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_NOACCESS if caller does not own SC_R_SECVIO, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * The security violation interrupt is self-masking. Once it is cleared in + * the SNVS it must be re-enabled using this function. + */ +/* IDL: E8 SECVIO_ENABLE() #25 */ +sc_err_t sc_seco_secvio_enable(sc_ipc_t ipc); + +/*! + * This function is used to read/write SNVS security violation + * and tamper registers. + * + * @param[in] ipc IPC handle + * @param[in] id register ID + * @param[in] access 0=read, 1=write + * @param[in] data0 pointer to data to read or write + * @param[in] data1 pointer to data to read or write + * @param[in] data2 pointer to data to read or write + * @param[in] data3 pointer to data to read or write + * @param[in] data4 pointer to data to read or write + * @param[in] size number of valid data words + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_NOACCESS if caller does not own SC_R_SECVIO, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * Unused data words can be passed a NULL pointer. + * + * See AHAB_MANAGE_SNVS_REQ in the SECO API Reference Guide for + * more info. + */ +/* IDL: E8 SECVIO_CONFIG(UI8 id, UI8 access, UIO32 data0, UIO32 data1, UIO32 data2, UIO32 data3, UIO32 data4, UI8 size) #26 */ +sc_err_t sc_seco_secvio_config(sc_ipc_t ipc, uint8_t id, uint8_t access, + uint32_t *data0, uint32_t *data1, uint32_t *data2, uint32_t *data3, + uint32_t *data4, uint8_t size); + +/*! + * This function is used to read/write SNVS security violation + * and tamper DGO registers. + * + * @param[in] ipc IPC handle + * @param[in] id regsiter ID + * @param[in] access 0=read, 1=write + * @param[in] data pointer to data to read or write + * + * @return Returns and error code (SC_ERR_NONE = success). + * + * Return errors codes: + * - SC_ERR_NOACCESS if caller does not own SC_R_SECVIO, + * - SC_ERR_UNAVAILABLE if SECO not available, + * - SC_ERR_IPC if SECO response has bad header tag or size, + * - SC_ERR_VERSION if SECO response has bad version, + * - Others, see the [Security Service Detailed Description](\ref seco_err) section + * + * See AHAB_MANAGE_SNVS_DGO_REQ in the SECO API Reference Guide + * for more info. + */ +/* IDL: E8 SECVIO_DGO_CONFIG(UI8 id, UI8 access, UIO32 data) #27 */ +sc_err_t sc_seco_secvio_dgo_config(sc_ipc_t ipc, uint8_t id, + uint8_t access, uint32_t *data); + +/** @} */ + +#endif /* SC_SECO_API_H */ + +/** @} */ + diff --git a/platform/svc/seco/rpc.h b/platform/svc/seco/rpc.h new file mode 100644 index 0000000..b40ee9e --- /dev/null +++ b/platform/svc/seco/rpc.h @@ -0,0 +1,110 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the SECO RPC implementation. + * + * @addtogroup SECO_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_SECO_RPC_H +#define SC_SECO_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC SECO function calls + */ +/** @{ */ +#define SECO_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define SECO_FUNC_IMAGE_LOAD 1U /*!< Index for sc_seco_image_load() RPC call */ +#define SECO_FUNC_AUTHENTICATE 2U /*!< Index for sc_seco_authenticate() RPC call */ +#define SECO_FUNC_ENH_AUTHENTICATE 24U /*!< Index for sc_seco_enh_authenticate() RPC call */ +#define SECO_FUNC_FORWARD_LIFECYCLE 3U /*!< Index for sc_seco_forward_lifecycle() RPC call */ +#define SECO_FUNC_RETURN_LIFECYCLE 4U /*!< Index for sc_seco_return_lifecycle() RPC call */ +#define SECO_FUNC_COMMIT 5U /*!< Index for sc_seco_commit() RPC call */ +#define SECO_FUNC_ATTEST_MODE 6U /*!< Index for sc_seco_attest_mode() RPC call */ +#define SECO_FUNC_ATTEST 7U /*!< Index for sc_seco_attest() RPC call */ +#define SECO_FUNC_GET_ATTEST_PKEY 8U /*!< Index for sc_seco_get_attest_pkey() RPC call */ +#define SECO_FUNC_GET_ATTEST_SIGN 9U /*!< Index for sc_seco_get_attest_sign() RPC call */ +#define SECO_FUNC_ATTEST_VERIFY 10U /*!< Index for sc_seco_attest_verify() RPC call */ +#define SECO_FUNC_GEN_KEY_BLOB 11U /*!< Index for sc_seco_gen_key_blob() RPC call */ +#define SECO_FUNC_LOAD_KEY 12U /*!< Index for sc_seco_load_key() RPC call */ +#define SECO_FUNC_GET_MP_KEY 13U /*!< Index for sc_seco_get_mp_key() RPC call */ +#define SECO_FUNC_UPDATE_MPMR 14U /*!< Index for sc_seco_update_mpmr() RPC call */ +#define SECO_FUNC_GET_MP_SIGN 15U /*!< Index for sc_seco_get_mp_sign() RPC call */ +#define SECO_FUNC_BUILD_INFO 16U /*!< Index for sc_seco_build_info() RPC call */ +#define SECO_FUNC_V2X_BUILD_INFO 30U /*!< Index for sc_seco_v2x_build_info() RPC call */ +#define SECO_FUNC_CHIP_INFO 17U /*!< Index for sc_seco_chip_info() RPC call */ +#define SECO_FUNC_ENABLE_DEBUG 18U /*!< Index for sc_seco_enable_debug() RPC call */ +#define SECO_FUNC_GET_EVENT 19U /*!< Index for sc_seco_get_event() RPC call */ +#define SECO_FUNC_FUSE_WRITE 20U /*!< Index for sc_seco_fuse_write() RPC call */ +#define SECO_FUNC_PATCH 21U /*!< Index for sc_seco_patch() RPC call */ +#define SECO_FUNC_SET_MONO_COUNTER_PARTITION 28U /*!< Index for sc_seco_set_mono_counter_partition() RPC call */ +#define SECO_FUNC_SET_FIPS_MODE 29U /*!< Index for sc_seco_set_fips_mode() RPC call */ +#define SECO_FUNC_FIPS_KEY_ZERO 31U /*!< Index for sc_seco_fips_key_zero() RPC call */ +#define SECO_FUNC_START_RNG 22U /*!< Index for sc_seco_start_rng() RPC call */ +#define SECO_FUNC_SAB_MSG 23U /*!< Index for sc_seco_sab_msg() RPC call */ +#define SECO_FUNC_SECVIO_ENABLE 25U /*!< Index for sc_seco_secvio_enable() RPC call */ +#define SECO_FUNC_SECVIO_CONFIG 26U /*!< Index for sc_seco_secvio_config() RPC call */ +#define SECO_FUNC_SECVIO_DGO_CONFIG 27U /*!< Index for sc_seco_secvio_dgo_config() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming SECO RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void seco_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_SECO_RPC_H */ + +/** @} */ + diff --git a/platform/svc/seco/rpc_clnt.c b/platform/svc/seco/rpc_clnt.c new file mode 100644 index 0000000..250b3e7 --- /dev/null +++ b/platform/svc/seco/rpc_clnt.c @@ -0,0 +1,949 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the SECO service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup SECO_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/seco/api.h" +#include "../../main/rpc.h" +#include "svc/seco/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 IMAGE_LOAD(UI64 addr_src, UI64 addr_dst, UI32 len, IB fw) #1 */ +sc_err_t sc_seco_image_load(sc_ipc_t ipc, sc_faddr_t addr_src, + sc_faddr_t addr_dst, uint32_t len, sc_bool_t fw) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 7U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_IMAGE_LOAD); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr_src >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr_src); + RPC_U32(&msg, 8U) = U32(addr_dst >> 32ULL); + RPC_U32(&msg, 12U) = U32(addr_dst); + RPC_U32(&msg, 16U) = U32(len); + RPC_U8(&msg, 20U) = B2U8(fw); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 AUTHENTICATE(UI8 cmd, UI64 addr) #2 */ +sc_err_t sc_seco_authenticate(sc_ipc_t ipc, sc_seco_auth_cmd_t cmd, + sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_AUTHENTICATE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + RPC_U8(&msg, 8U) = U8(cmd); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 ENH_AUTHENTICATE(UI8 cmd, UI64 addr, UI32 mask1, UI32 mask2) #24 */ +sc_err_t sc_seco_enh_authenticate(sc_ipc_t ipc, sc_seco_auth_cmd_t cmd, + sc_faddr_t addr, uint32_t mask1, uint32_t mask2) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 6U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_ENH_AUTHENTICATE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + RPC_U32(&msg, 8U) = U32(mask1); + RPC_U32(&msg, 12U) = U32(mask2); + RPC_U8(&msg, 16U) = U8(cmd); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 FORWARD_LIFECYCLE(UI32 change) #3 */ +sc_err_t sc_seco_forward_lifecycle(sc_ipc_t ipc, uint32_t change) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_FORWARD_LIFECYCLE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(change); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 RETURN_LIFECYCLE(UI64 addr) #4 */ +sc_err_t sc_seco_return_lifecycle(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_RETURN_LIFECYCLE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 COMMIT(UIO32 info) #5 */ +sc_err_t sc_seco_commit(sc_ipc_t ipc, uint32_t *info) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_COMMIT); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(*info); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *info = (uint32_t) RPC_U32(&msg, 0U); + + /* Return result */ + return err; +} + +/* IDL: E8 ATTEST_MODE(UI32 mode) #6 */ +sc_err_t sc_seco_attest_mode(sc_ipc_t ipc, uint32_t mode) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_ATTEST_MODE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 ATTEST(UI64 nonce) #7 */ +sc_err_t sc_seco_attest(sc_ipc_t ipc, uint64_t nonce) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_ATTEST); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(nonce >> 32ULL); + RPC_U32(&msg, 4U) = U32(nonce); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_ATTEST_PKEY(UI64 addr) #8 */ +sc_err_t sc_seco_get_attest_pkey(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GET_ATTEST_PKEY); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_ATTEST_SIGN(UI64 addr) #9 */ +sc_err_t sc_seco_get_attest_sign(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GET_ATTEST_SIGN); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 ATTEST_VERIFY(UI64 addr) #10 */ +sc_err_t sc_seco_attest_verify(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_ATTEST_VERIFY); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GEN_KEY_BLOB(UI32 id, UI64 load_addr, UI64 export_addr, UI16 max_size) #11 */ +sc_err_t sc_seco_gen_key_blob(sc_ipc_t ipc, uint32_t id, sc_faddr_t load_addr, + sc_faddr_t export_addr, uint16_t max_size) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 7U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GEN_KEY_BLOB); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(load_addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(load_addr); + RPC_U32(&msg, 8U) = U32(export_addr >> 32ULL); + RPC_U32(&msg, 12U) = U32(export_addr); + RPC_U32(&msg, 16U) = U32(id); + RPC_U16(&msg, 20U) = U16(max_size); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 LOAD_KEY(UI32 id, UI64 addr) #12 */ +sc_err_t sc_seco_load_key(sc_ipc_t ipc, uint32_t id, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_LOAD_KEY); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + RPC_U32(&msg, 8U) = U32(id); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_MP_KEY(UI64 dst_addr, UI16 dst_size) #13 */ +sc_err_t sc_seco_get_mp_key(sc_ipc_t ipc, sc_faddr_t dst_addr, + uint16_t dst_size) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GET_MP_KEY); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(dst_addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(dst_addr); + RPC_U16(&msg, 8U) = U16(dst_size); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 UPDATE_MPMR(UI64 addr, UI8 size, UI8 lock) #14 */ +sc_err_t sc_seco_update_mpmr(sc_ipc_t ipc, sc_faddr_t addr, uint8_t size, + uint8_t lock) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 4U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_UPDATE_MPMR); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + RPC_U8(&msg, 8U) = U8(size); + RPC_U8(&msg, 9U) = U8(lock); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_MP_SIGN(UI64 msg_addr, UI16 msg_size, UI64 dst_addr, UI16 dst_size) #15 */ +sc_err_t sc_seco_get_mp_sign(sc_ipc_t ipc, sc_faddr_t msg_addr, + uint16_t msg_size, sc_faddr_t dst_addr, uint16_t dst_size) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 6U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GET_MP_SIGN); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(msg_addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(msg_addr); + RPC_U32(&msg, 8U) = U32(dst_addr >> 32ULL); + RPC_U32(&msg, 12U) = U32(dst_addr); + RPC_U16(&msg, 16U) = U16(msg_size); + RPC_U16(&msg, 18U) = U16(dst_size); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: R0 BUILD_INFO(UO32 version, UO32 commit) #16 */ +void sc_seco_build_info(sc_ipc_t ipc, uint32_t *version, uint32_t *commit) +{ + sc_rpc_msg_t msg; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_BUILD_INFO); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out receive message */ + if (version != NULL) + { + *version = (uint32_t) RPC_U32(&msg, 0U); + } + if (commit != NULL) + { + *commit = (uint32_t) RPC_U32(&msg, 4U); + } +} + +/* IDL: E8 V2X_BUILD_INFO(UO32 version, UO32 commit) #30 ^API_HAS_V2X */ +sc_err_t sc_seco_v2x_build_info(sc_ipc_t ipc, uint32_t *version, + uint32_t *commit) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_V2X_BUILD_INFO); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (version != NULL) + { + *version = (uint32_t) RPC_U32(&msg, 0U); + } + if (commit != NULL) + { + *commit = (uint32_t) RPC_U32(&msg, 4U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 CHIP_INFO(UO16 lc, UO16 monotonic, UO32 uid_l, UO32 uid_h) #17 */ +sc_err_t sc_seco_chip_info(sc_ipc_t ipc, uint16_t *lc, uint16_t *monotonic, + uint32_t *uid_l, uint32_t *uid_h) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_CHIP_INFO); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (uid_l != NULL) + { + *uid_l = (uint32_t) RPC_U32(&msg, 0U); + } + if (uid_h != NULL) + { + *uid_h = (uint32_t) RPC_U32(&msg, 4U); + } + if (lc != NULL) + { + *lc = (uint16_t) RPC_U16(&msg, 8U); + } + if (monotonic != NULL) + { + *monotonic = (uint16_t) RPC_U16(&msg, 10U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 ENABLE_DEBUG(UI64 addr) #18 */ +sc_err_t sc_seco_enable_debug(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_ENABLE_DEBUG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_EVENT(UI8 idx, UO32 event) #19 */ +sc_err_t sc_seco_get_event(sc_ipc_t ipc, uint8_t idx, uint32_t *event) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_GET_EVENT); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(idx); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (event != NULL) + { + *event = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 FUSE_WRITE(UI64 addr) #20 */ +sc_err_t sc_seco_fuse_write(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_FUSE_WRITE); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 PATCH(UI64 addr) #21 */ +sc_err_t sc_seco_patch(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_PATCH); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_MONO_COUNTER_PARTITION(UIO16 she) #28 */ +sc_err_t sc_seco_set_mono_counter_partition(sc_ipc_t ipc, uint16_t *she) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SET_MONO_COUNTER_PARTITION); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(*she); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *she = (uint16_t) RPC_U16(&msg, 0U); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_FIPS_MODE(UI8 mode, UO32 reason) #29 */ +sc_err_t sc_seco_set_fips_mode(sc_ipc_t ipc, uint8_t mode, uint32_t *reason) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SET_FIPS_MODE); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(mode); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (reason != NULL) + { + *reason = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 FIPS_KEY_ZERO(UI64 addr) #31 */ +sc_err_t sc_seco_fips_key_zero(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_FIPS_KEY_ZERO); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 START_RNG(UO32 status) #22 */ +sc_err_t sc_seco_start_rng(sc_ipc_t ipc, sc_seco_rng_stat_t *status) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_START_RNG); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (status != NULL) + { + *status = (sc_seco_rng_stat_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SAB_MSG(UI64 addr) #23 */ +sc_err_t sc_seco_sab_msg(sc_ipc_t ipc, sc_faddr_t addr) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SAB_MSG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(addr >> 32ULL); + RPC_U32(&msg, 4U) = U32(addr); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SECVIO_ENABLE() #25 */ +sc_err_t sc_seco_secvio_enable(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SECVIO_ENABLE); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SECVIO_CONFIG(UI8 id, UI8 access, UIO32 data0, UIO32 data1, UIO32 data2, UIO32 data3, UIO32 data4, UI8 size) #26 */ +sc_err_t sc_seco_secvio_config(sc_ipc_t ipc, uint8_t id, uint8_t access, + uint32_t *data0, uint32_t *data1, uint32_t *data2, uint32_t *data3, + uint32_t *data4, uint8_t size) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 7U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SECVIO_CONFIG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(*data0); + RPC_U32(&msg, 4U) = U32(*data1); + RPC_U32(&msg, 8U) = U32(*data2); + RPC_U32(&msg, 12U) = U32(*data3); + RPC_U32(&msg, 16U) = U32(*data4); + RPC_U8(&msg, 20U) = U8(id); + RPC_U8(&msg, 21U) = U8(access); + RPC_U8(&msg, 22U) = U8(size); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *data0 = (uint32_t) RPC_U32(&msg, 0U); + *data1 = (uint32_t) RPC_U32(&msg, 4U); + *data2 = (uint32_t) RPC_U32(&msg, 8U); + *data3 = (uint32_t) RPC_U32(&msg, 12U); + *data4 = (uint32_t) RPC_U32(&msg, 16U); + + /* Return result */ + return err; +} + +/* IDL: E8 SECVIO_DGO_CONFIG(UI8 id, UI8 access, UIO32 data) #27 */ +sc_err_t sc_seco_secvio_dgo_config(sc_ipc_t ipc, uint8_t id, uint8_t access, + uint32_t *data) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_SECO); + RPC_FUNC(&msg) = U8(SECO_FUNC_SECVIO_DGO_CONFIG); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(*data); + RPC_U8(&msg, 4U) = U8(id); + RPC_U8(&msg, 5U) = U8(access); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + *data = (uint32_t) RPC_U32(&msg, 0U); + + /* Return result */ + return err; +} + +/** @} */ + diff --git a/platform/svc/seco/rpc_srv.c b/platform/svc/seco/rpc_srv.c new file mode 100644 index 0000000..2ca0ed8 --- /dev/null +++ b/platform/svc/seco/rpc_srv.c @@ -0,0 +1,659 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the SECO service. + * + * @addtogroup SECO_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/seco/svc.h" +#include "svc/seco/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void seco_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case SECO_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch image_load() */ + case SECO_FUNC_IMAGE_LOAD : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr_src = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t addr_dst = ((sc_faddr_t) RPC_U64(msg, 8U)); + uint32_t len = ((uint32_t) RPC_U32(msg, 16U)); + sc_bool_t fw = U2B(RPC_U8(msg, 20U)); + + /* Call function */ + err = seco_image_load(caller_pt, addr_src, addr_dst, len, fw); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch authenticate() */ + case SECO_FUNC_AUTHENTICATE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_seco_auth_cmd_t cmd = ((sc_seco_auth_cmd_t) RPC_U8(msg, 8U)); + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_authenticate(caller_pt, cmd, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch enh_authenticate() */ + case SECO_FUNC_ENH_AUTHENTICATE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_seco_auth_cmd_t cmd = ((sc_seco_auth_cmd_t) RPC_U8(msg, 16U)); + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + uint32_t mask1 = ((uint32_t) RPC_U32(msg, 8U)); + uint32_t mask2 = ((uint32_t) RPC_U32(msg, 12U)); + + /* Call function */ + err = seco_enh_authenticate(caller_pt, cmd, addr, mask1, mask2); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch forward_lifecycle() */ + case SECO_FUNC_FORWARD_LIFECYCLE : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t change = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = seco_forward_lifecycle(caller_pt, change); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch return_lifecycle() */ + case SECO_FUNC_RETURN_LIFECYCLE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_return_lifecycle(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch commit() */ + case SECO_FUNC_COMMIT : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t info = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = seco_commit(caller_pt, &info); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(info); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch attest_mode() */ + case SECO_FUNC_ATTEST_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t mode = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = seco_attest_mode(caller_pt, mode); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch attest() */ + case SECO_FUNC_ATTEST : + { + /* Declare return and parameters */ + sc_err_t result; + uint64_t nonce = ((uint64_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_attest(caller_pt, nonce); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_attest_pkey() */ + case SECO_FUNC_GET_ATTEST_PKEY : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_get_attest_pkey(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_attest_sign() */ + case SECO_FUNC_GET_ATTEST_SIGN : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_get_attest_sign(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch attest_verify() */ + case SECO_FUNC_ATTEST_VERIFY : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_attest_verify(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch gen_key_blob() */ + case SECO_FUNC_GEN_KEY_BLOB : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t id = ((uint32_t) RPC_U32(msg, 16U)); + sc_faddr_t load_addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + sc_faddr_t export_addr = ((sc_faddr_t) RPC_U64(msg, 8U)); + uint16_t max_size = ((uint16_t) RPC_U16(msg, 20U)); + + /* Call function */ + err = seco_gen_key_blob(caller_pt, id, load_addr, export_addr, + max_size); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch load_key() */ + case SECO_FUNC_LOAD_KEY : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t id = ((uint32_t) RPC_U32(msg, 8U)); + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_load_key(caller_pt, id, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_mp_key() */ + case SECO_FUNC_GET_MP_KEY : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t dst_addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + uint16_t dst_size = ((uint16_t) RPC_U16(msg, 8U)); + + /* Call function */ + err = seco_get_mp_key(caller_pt, dst_addr, dst_size); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch update_mpmr() */ + case SECO_FUNC_UPDATE_MPMR : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + uint8_t size = ((uint8_t) RPC_U8(msg, 8U)); + uint8_t lock = ((uint8_t) RPC_U8(msg, 9U)); + + /* Call function */ + err = seco_update_mpmr(caller_pt, addr, size, lock); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_mp_sign() */ + case SECO_FUNC_GET_MP_SIGN : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t msg_addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + uint16_t msg_size = ((uint16_t) RPC_U16(msg, 16U)); + sc_faddr_t dst_addr = ((sc_faddr_t) RPC_U64(msg, 8U)); + uint16_t dst_size = ((uint16_t) RPC_U16(msg, 18U)); + + /* Call function */ + err = seco_get_mp_sign(caller_pt, msg_addr, msg_size, dst_addr, + dst_size); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch build_info() */ + case SECO_FUNC_BUILD_INFO : + { + /* Declare return and parameters */ + uint32_t version = ((uint32_t) 0U); + uint32_t commit = ((uint32_t) 0U); + + /* Call function */ + seco_build_info(caller_pt, &version, &commit); + + /* Copy in return parameters */ + RPC_U32(msg, 0U) = U32(version); + RPC_U32(msg, 4U) = U32(commit); + RPC_SIZE(msg) = 3U; + break; + } +#ifdef API_HAS_V2X + /* Dispatch v2x_build_info() */ + case SECO_FUNC_V2X_BUILD_INFO : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t version = ((uint32_t) 0U); + uint32_t commit = ((uint32_t) 0U); + + /* Call function */ + err = seco_v2x_build_info(caller_pt, &version, &commit); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(version); + RPC_U32(msg, 4U) = U32(commit); + RPC_SIZE(msg) = 3U; + break; + } +#endif + /* Dispatch chip_info() */ + case SECO_FUNC_CHIP_INFO : + { + /* Declare return and parameters */ + sc_err_t result; + uint16_t lc = ((uint16_t) 0U); + uint16_t monotonic = ((uint16_t) 0U); + uint32_t uid_l = ((uint32_t) 0U); + uint32_t uid_h = ((uint32_t) 0U); + + /* Call function */ + err = seco_chip_info(caller_pt, &lc, &monotonic, &uid_l, + &uid_h); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U16(msg, 8U) = U16(lc); + RPC_U16(msg, 10U) = U16(monotonic); + RPC_U32(msg, 0U) = U32(uid_l); + RPC_U32(msg, 4U) = U32(uid_h); + RPC_SIZE(msg) = 4U; + break; + } + /* Dispatch enable_debug() */ + case SECO_FUNC_ENABLE_DEBUG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_enable_debug(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_event() */ + case SECO_FUNC_GET_EVENT : + { + /* Declare return and parameters */ + sc_err_t result; + uint8_t idx = ((uint8_t) RPC_U8(msg, 0U)); + uint32_t event = ((uint32_t) 0U); + + /* Call function */ + err = seco_get_event(caller_pt, idx, &event); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(event); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch fuse_write() */ + case SECO_FUNC_FUSE_WRITE : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_fuse_write(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch patch() */ + case SECO_FUNC_PATCH : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_patch(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_mono_counter_partition() */ + case SECO_FUNC_SET_MONO_COUNTER_PARTITION : + { + /* Declare return and parameters */ + sc_err_t result; + uint16_t she = ((uint16_t) RPC_U16(msg, 0U)); + + /* Call function */ + err = seco_set_mono_counter_partition(caller_pt, &she); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U16(msg, 0U) = U16(she); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_fips_mode() */ + case SECO_FUNC_SET_FIPS_MODE : + { + /* Declare return and parameters */ + sc_err_t result; + uint8_t mode = ((uint8_t) RPC_U8(msg, 0U)); + uint32_t reason = ((uint32_t) 0U); + + /* Call function */ + err = seco_set_fips_mode(caller_pt, mode, &reason); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(reason); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch fips_key_zero() */ + case SECO_FUNC_FIPS_KEY_ZERO : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_fips_key_zero(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch start_rng() */ + case SECO_FUNC_START_RNG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_seco_rng_stat_t status = ((sc_seco_rng_stat_t) 0U); + + /* Call function */ + err = seco_start_rng(caller_pt, &status); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(status); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch sab_msg() */ + case SECO_FUNC_SAB_MSG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_faddr_t addr = ((sc_faddr_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = seco_sab_msg(caller_pt, addr); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch secvio_enable() */ + case SECO_FUNC_SECVIO_ENABLE : + { + /* Declare return and parameters */ + sc_err_t result; + + /* Call function */ + err = seco_secvio_enable(caller_pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch secvio_config() */ + case SECO_FUNC_SECVIO_CONFIG : + { + /* Declare return and parameters */ + sc_err_t result; + uint8_t id = ((uint8_t) RPC_U8(msg, 20U)); + uint8_t access = ((uint8_t) RPC_U8(msg, 21U)); + uint32_t data0 = ((uint32_t) RPC_U32(msg, 0U)); + uint32_t data1 = ((uint32_t) RPC_U32(msg, 4U)); + uint32_t data2 = ((uint32_t) RPC_U32(msg, 8U)); + uint32_t data3 = ((uint32_t) RPC_U32(msg, 12U)); + uint32_t data4 = ((uint32_t) RPC_U32(msg, 16U)); + uint8_t size = ((uint8_t) RPC_U8(msg, 22U)); + + /* Call function */ + err = seco_secvio_config(caller_pt, id, access, &data0, &data1, + &data2, &data3, &data4, size); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(data0); + RPC_U32(msg, 4U) = U32(data1); + RPC_U32(msg, 8U) = U32(data2); + RPC_U32(msg, 12U) = U32(data3); + RPC_U32(msg, 16U) = U32(data4); + RPC_SIZE(msg) = 6U; + break; + } + /* Dispatch secvio_dgo_config() */ + case SECO_FUNC_SECVIO_DGO_CONFIG : + { + /* Declare return and parameters */ + sc_err_t result; + uint8_t id = ((uint8_t) RPC_U8(msg, 4U)); + uint8_t access = ((uint8_t) RPC_U8(msg, 5U)); + uint32_t data = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = seco_secvio_dgo_config(caller_pt, id, access, &data); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(data); + RPC_SIZE(msg) = 2U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=seco, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=seco, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/seco/svc.c b/platform/svc/seco/svc.c new file mode 100755 index 0000000..c1a6991 --- /dev/null +++ b/platform/svc/seco/svc.c @@ -0,0 +1,682 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/seco/svc.c + * + * File containing the implementation of the System Controller (SC) + * Security (SECO) function. + * + * @addtogroup SECO_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "svc/seco/svc.h" +#include "svc/rm/svc.h" +#include "ss/inf/inf.h" +#ifdef HAS_SECO +#include "drivers/seco/fsl_seco.h" +#endif +#ifdef HAS_V2X +#include "drivers/v2x/fsl_v2x.h" +#endif +#include "drivers/snvs/fsl_snvs.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* Local Variables */ + +/*--------------------------------------------------------------------------*/ +/* Load a SECO image */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_image_load(sc_rm_pt_t caller_pt, sc_faddr_t addr_src, + sc_faddr_t addr_dst, uint32_t len, sc_bool_t fw) +{ + #ifdef HAS_SECO + SECO_Image_Load(addr_src, addr_dst, len, fw); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Authenticate a SECO image or command */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_authenticate(sc_rm_pt_t caller_pt, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_Authenticate(cmd, addr, 0U, 0U); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Authenticate a SECO image or command (enhanced version) */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_enh_authenticate(sc_rm_pt_t caller_pt, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr, + uint32_t mask1, uint32_t mask2) +{ + #ifdef HAS_SECO + SECO_Authenticate(cmd, addr, mask1, mask2); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Load a SECO key */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_load_key(sc_rm_pt_t caller_pt, uint32_t id, + sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_LoadKey(id, addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Generate key blob */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_gen_key_blob(sc_rm_pt_t caller_pt, uint32_t id, + sc_faddr_t load_addr, sc_faddr_t export_addr, uint16_t max_size) +{ + #ifdef HAS_SECO + SECO_GenKeyBlob(id, load_addr, export_addr, max_size); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Secure fuse write command */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_fuse_write(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_SecureWriteFuse(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Secure patch */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_patch(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_ScuPatch(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Partition the monotonic counte */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_set_mono_counter_partition(sc_rm_pt_t caller_pt, uint16_t *she) +{ + #ifdef HAS_SECO + sc_err_t err = SC_ERR_NONE; + + /* Check access permissions */ + SYSTEM(caller_pt); + + if (err == SC_ERR_NONE) + { + *she = SECO_SetMonoCounterPartition(*she); + err = seco_err; + } + + return err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Set FIPS mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_set_fips_mode(sc_rm_pt_t caller_pt, uint8_t mode, + uint32_t *reason) +{ + #ifdef HAS_SECO + sc_err_t err = SC_ERR_NONE; + + /* Check access permissions */ + SYSTEM(caller_pt); + + if (err == SC_ERR_NONE) + { + *reason = SECO_SetFipsMode(mode); + err = seco_err; + } + + return err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* zeroize all plaintext secret and private cryptographic keys */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_fips_key_zero(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_FipsKeyZero(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Start RNG */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_start_rng(sc_rm_pt_t caller_pt, sc_seco_rng_stat_t *status) +{ + #ifdef HAS_SECO + *status = SECO_StartRNG(); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Enabled debug */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_enable_debug(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_EnableDebug(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Move SECO lifecycle forward */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_forward_lifecycle(sc_rm_pt_t caller_pt, uint32_t change) +{ + #ifdef HAS_SECO + SECO_ForwardLifecycle(change); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Return SECO lifecycle */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_return_lifecycle(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_ReturnLifecycle(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Return SECO FW build info */ +/*--------------------------------------------------------------------------*/ +void seco_build_info(sc_rm_pt_t caller_pt, uint32_t *version, + uint32_t *commit) +{ + #ifdef HAS_SECO + sc_bool_t dirty; + + /* Return info */ + SECO_Version(version, commit, &dirty); + + if (seco_err != SC_ERR_NONE) + { + *version = 0U; + *commit = 0U; + } + #else + *version = 0U; + *commit = 0U; + #endif +} + +#ifdef API_HAS_V2X +/*--------------------------------------------------------------------------*/ +/* Return V2X FW build info */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_v2x_build_info(sc_rm_pt_t caller_pt, uint32_t *version, + uint32_t *commit) +{ + sc_err_t err = SC_ERR_NONE; + sc_bool_t dirty; + sc_pm_power_mode_t mode = SC_PM_PW_MODE_OFF; + + /* Get V2X power state */ + err = pm_get_resource_power_mode(SC_PT, SC_R_V2X, &mode); + + /* Error? */ + if (err == SC_ERR_NONE) + { + /* V2X on? */ + if (mode > SC_PM_PW_MODE_STBY) + { + V2X_Version(version, commit, &dirty); + if (v2x_err != SC_ERR_NONE) + { + err = v2x_err; + } + } + else + { + /* No power so error */ + err = SC_ERR_NOPOWER; + } + } + + /* Return 0 version on error */ + if (err != SC_ERR_NONE) + { + *version = 0U; + *commit = 0U; + } + + return err; +} +#endif + +/*--------------------------------------------------------------------------*/ +/* Return SECO chip info */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_chip_info(sc_rm_pt_t caller_pt, uint16_t *lc, + uint16_t *monotonic, uint32_t *uid_l, uint32_t *uid_h) +{ + #ifdef HAS_SECO + /* Return info */ + SECO_ChipInfo(lc, monotonic, uid_l, uid_h); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Return SECO event */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_get_event(sc_rm_pt_t caller_pt, uint8_t idx, + uint32_t *event) +{ + #ifdef HAS_SECO + /* Return event */ + *event = SECO_GetEvent(idx); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Set the attestation mode */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_attest_mode(sc_rm_pt_t caller_pt, uint32_t mode) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_ATTESTATION); + + #ifdef HAS_SECO + /* Return info */ + if (err == SC_ERR_NONE) + { + SECO_AttestMode(mode); + err = seco_err; + } + #else + err = SC_ERR_UNAVAILABLE; + #endif + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Request atestation */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_attest(sc_rm_pt_t caller_pt, uint64_t nonce) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_ATTESTATION); + + #ifdef HAS_SECO + /* Return info */ + if (err == SC_ERR_NONE) + { + SECO_Attest(nonce); + err = seco_err; + } + #else + err = SC_ERR_UNAVAILABLE; + #endif + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Retrieve attestation public key */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_get_attest_pkey(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_ATTESTATION); + + #ifdef HAS_SECO + /* Return info */ + if (err == SC_ERR_NONE) + { + SECO_GetAttestPublicKey(addr); + err = seco_err; + } + #else + err = SC_ERR_UNAVAILABLE; + #endif + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Retrieve attestation signature and parameters */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_get_attest_sign(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_ATTESTATION); + + #ifdef HAS_SECO + /* Return info */ + if (err == SC_ERR_NONE) + { + SECO_GetAttestSign(addr); + err = seco_err; + } + #else + err = SC_ERR_UNAVAILABLE; + #endif + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Verify attestation */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_attest_verify(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_ATTESTATION); + + #ifdef HAS_SECO + /* Return info */ + if (err == SC_ERR_NONE) + { + SECO_AttestVerify(addr); + err = seco_err; + } + #else + err = SC_ERR_UNAVAILABLE; + #endif + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Commit SRK/FW info */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_commit(sc_rm_pt_t caller_pt, uint32_t *info) +{ + #ifdef HAS_SECO + /* Return info */ + SECO_Commit(info); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get manufacturing protection public key */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_get_mp_key(sc_rm_pt_t caller_pt, sc_faddr_t dst_addr, + uint16_t dst_size) +{ + #ifdef HAS_SECO + /* Return info */ + SECO_GetMPKey(dst_addr, dst_size); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Update manufacturing protection message register */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_update_mpmr(sc_rm_pt_t caller_pt, sc_faddr_t addr, + uint8_t size, uint8_t lock) +{ + #ifdef HAS_SECO + /* Return info */ + SECO_UpdateMPMR(addr, size, lock); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Get manufacturing protection signature */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_get_mp_sign(sc_rm_pt_t caller_pt, sc_faddr_t msg_addr, + uint16_t msg_size, sc_faddr_t dst_addr, uint16_t dst_size) +{ + #ifdef HAS_SECO + /* Return info */ + SECO_GetMPSign(msg_addr, msg_size, dst_addr, dst_size); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Send a generic signed message to the SECO SHE/HSM components */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_sab_msg(sc_rm_pt_t caller_pt, sc_faddr_t addr) +{ + #ifdef HAS_SECO + SECO_SABSignedMesg(addr); + + return seco_err; + #else + return SC_ERR_UNAVAILABLE; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Enable security violation and tamper interrupts */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_secvio_enable(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check permissions */ + OWNED(SC_R_SECVIO); + + /* Return info */ + if (err == SC_ERR_NONE) + { + #if defined(FSL_FEATURE_SOC_SNVS_COUNT) && FSL_FEATURE_SOC_SNVS_COUNT + SNVS_SecurityViolation_Enable(); + err = snvs_err; + #else + err = SC_ERR_UNAVAILABLE; + #endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Send a message to SECO to read/write SNVS secvio and tamper registers */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_secvio_config(sc_rm_pt_t caller_pt, uint8_t id, uint8_t access, + uint32_t *data0, uint32_t *data1, uint32_t *data2, uint32_t *data3, + uint32_t *data4, uint8_t size) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check parameters */ + ASRT_ERR(access <= SECO_SNVS_WRITE, SC_ERR_PARM); + ASRT_ERR(size <= 5U, SC_ERR_PARM); + + /* Check permissions */ + OWNED(SC_R_SECVIO); + + /* Return info */ + if (err == SC_ERR_NONE) + { + #if defined(FSL_FEATURE_SOC_SNVS_COUNT) && FSL_FEATURE_SOC_SNVS_COUNT + SNVS_SecVio(id, access, data0, data1, data2, data3, data4, size); + err = snvs_err; + #else + err = SC_ERR_UNAVAILABLE; + #endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Send a message to SECO to read/write SNVS secvio and tamper DGO regs */ +/*--------------------------------------------------------------------------*/ +sc_err_t seco_secvio_dgo_config(sc_rm_pt_t caller_pt, uint8_t id, + uint8_t access, uint32_t *data) +{ + sc_err_t err = SC_ERR_NONE; + + /* Check parameters */ + ASRT_ERR(access <= SECO_SNVS_WRITE, SC_ERR_PARM); + + /* Check permissions */ + OWNED(SC_R_SECVIO); + + /* Return info */ + if (err == SC_ERR_NONE) + { + #if defined(FSL_FEATURE_SOC_SNVS_COUNT) && FSL_FEATURE_SOC_SNVS_COUNT + SNVS_SecVioDgo(id, access, data); + err = seco_err; + #else + err = SC_ERR_UNAVAILABLE; + #endif + } + + return err; +} + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Dump SECO state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) && defined(DEBUG_SECO) + void seco_dump(sc_rm_pt_t pt) + { + } +#endif + +/** @} */ + diff --git a/platform/svc/seco/svc.h b/platform/svc/seco/svc.h new file mode 100755 index 0000000..3c9e0f9 --- /dev/null +++ b/platform/svc/seco/svc.h @@ -0,0 +1,328 @@ +/* +** ################################################################### +** +** Copyright 2019-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/seco/svc.h + * + * Header file containing the API for the System Controller (SC) + * Security (SECO) function. + * + * @addtogroup SECO_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_SECO_SVC_H +#define SC_SECO_SVC_H + +/* Includes */ + +#include "svc/seco/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/*! + * Internal SC function to load a SECO image. + * + * @see sc_seco_image_load(). + */ +sc_err_t seco_image_load(sc_rm_pt_t caller_pt, + sc_faddr_t addr_src, sc_faddr_t addr_dst, uint32_t len, sc_bool_t fw); + +/*! + * Internal SC function to authenticate a SECO image or command. + * + * @see sc_seco_authenticate(). + */ +sc_err_t seco_authenticate(sc_rm_pt_t caller_pt, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr); + +/*! + * Internal SC function to authenticate a SECO image or command + ( (enhanced version). + * + * @see sc_seco_enh_authenticate(). + */ +sc_err_t seco_enh_authenticate(sc_rm_pt_t caller_pt, + sc_seco_auth_cmd_t cmd, sc_faddr_t addr, + uint32_t mask1, uint32_t mask2); + +/*! + * Internal SC function to load a SECO key. + * + * @see sc_seco_load_key(). + */ +sc_err_t seco_load_key(sc_rm_pt_t caller_pt, + uint32_t id, sc_faddr_t addr); + +/*! + * Internal SC function to generate a key blob. + * + * @see sc_seco_gen_key_blob(). + */ +sc_err_t seco_gen_key_blob(sc_rm_pt_t caller_pt, uint32_t id, + sc_faddr_t load_addr, sc_faddr_t export_addr, uint16_t max_size); + +/*! + * Internal SC function to securely write a group of fuse words. + * + * @see sc_seco_fuse_write(). + */ +sc_err_t seco_fuse_write(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to apply a patch. + * + * @see sc_seco_patch(). + */ +sc_err_t seco_patch(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to partition the monotonic counter. + * + * @see sc_seco_set_mono_counter_partition(). + */ +sc_err_t seco_set_mono_counter_partition(sc_rm_pt_t caller_pt, + uint16_t *she); + +/*! + * Internal SC function to set FIPS mode. + * + * @see sc_seco_set_fips_mode(). + */ +sc_err_t seco_set_fips_mode(sc_rm_pt_t caller_pt, uint8_t mode, + uint32_t *reason); + +/*! + * Internal SC function to securely zeroize all plaintext secret and private + * cryptographic keys and CSPs within the module. + * + * @see sc_seco_fips_key_zero(). + */ +sc_err_t seco_fips_key_zero(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to start the RNG. + * + * @see sc_seco_start_rng(). + */ +sc_err_t seco_start_rng(sc_rm_pt_t caller_pt, sc_seco_rng_stat_t *status); + +/*! + * Internal SC function to securely enable debug. + * + * @see sc_seco_enabled_debug(). + */ +sc_err_t seco_enable_debug(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to update the lifecycle. + * + * @see sc_seco_forward_lifecycle(). + */ +sc_err_t seco_forward_lifecycle(sc_rm_pt_t caller_pt, uint32_t change); + +/*! + * Internal SC function to securely reverse the lifecycle. + * + * @see sc_seco_return_lifecycle(). + */ +sc_err_t seco_return_lifecycle(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to return SECO FW version info. + * + * @see sc_seco_build_info(). + */ +void seco_build_info(sc_rm_pt_t caller_pt, uint32_t *version, + uint32_t *commit); + +#ifdef API_HAS_V2X +/*! + * Internal SC function to return V2X FW version info. + * + * @see sc_seco_v2x_build_info(). + */ +sc_err_t seco_v2x_build_info(sc_rm_pt_t caller_pt, uint32_t *version, + uint32_t *commit); +#endif + +/*! + * Internal SC function to return SECO chip info. + * + * @see sc_seco_chip_info(). + */ +sc_err_t seco_chip_info(sc_rm_pt_t caller_pt, uint16_t *lc, + uint16_t *monotonic, uint32_t *uid_l, uint32_t *uid_h); + +/*! + * Internal SC function to return an event from the SECO error log. + * + * @see sc_seco_get_event(). + */ +sc_err_t seco_get_event(sc_rm_pt_t caller_pt, uint8_t idx, + uint32_t *event); + +/*! + * Internal SC function to set the attestation mode. + * + * @see sc_seco_attest_mode(). + */ +sc_err_t seco_attest_mode(sc_rm_pt_t caller_pt, uint32_t mode); + +/*! + * Internal SC function to request atestation. + * + * @see sc_seco_attest(). + */ +sc_err_t seco_attest(sc_rm_pt_t caller_pt, uint64_t nonce); + +/*! + * Internal SC function to retrieve attestation public key. + * + * @see sc_seco_get_attest_pkey(). + */ +sc_err_t seco_get_attest_pkey(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to retrieve attestation signature and parameters. + * + * @see sc_seco_get_attest_sign(). + */ +sc_err_t seco_get_attest_sign(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to verify attestation. + * + * @see sc_seco_attest_verify(). + */ +sc_err_t seco_attest_verify(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to commit SRK/FW changes. + * + * @see sc_seco_commit(). + */ +sc_err_t seco_commit(sc_rm_pt_t caller_pt, uint32_t *info); + +/** @} */ + +/*! + * Internal SC function to get manufacturing protection public key. + * + * @see sc_seco_get_mp_key(). + */ +sc_err_t seco_get_mp_key(sc_rm_pt_t caller_pt, sc_faddr_t dst_addr, + uint16_t dst_size); + +/*! + * Internal SC function to update manufacturing protection message register. + * + * @see sc_seco_update_mpmr(). + */ +sc_err_t seco_update_mpmr(sc_rm_pt_t caller_pt, sc_faddr_t addr, + uint8_t size, uint8_t lock); + +/*! + * Internal SC function to get manufacturing protection signature. + * + * @see sc_seco_get_mp_sign(). + */ +sc_err_t seco_get_mp_sign(sc_rm_pt_t caller_pt, sc_faddr_t msg_addr, + uint16_t msg_size, sc_faddr_t dst_addr, uint16_t dst_size); + +/*! + * Internal SC function to send a generic signed message to the + * SECO SHE/HSM components. + * + * @see sc_seco_sab_msg(). + */ +sc_err_t seco_sab_msg(sc_rm_pt_t caller_pt, sc_faddr_t addr); + +/*! + * Internal SC function to enable the security violation interrupt. + * + * @see sc_seco_secvio_enable(). + */ +sc_err_t seco_secvio_enable(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to read/write SNVS security violation + * and tamper registers. + * + * @see sc_seco_secvio_config(). + */ +sc_err_t seco_secvio_config(sc_rm_pt_t caller_pt, uint8_t id, uint8_t access, + uint32_t *data0, uint32_t *data1, uint32_t *data2, uint32_t *data3, + uint32_t *data4, uint8_t size); + +/*! + * Internal SC function to read/write SNVS security violation + * and tamper DGO registers. + * + * @see sc_seco_secvio_dgo_config(). + */ +sc_err_t seco_secvio_dgo_config(sc_rm_pt_t caller_pt, uint8_t id, + uint8_t access, uint32_t *data); + +#if defined(DEBUG) && defined(DEBUG_SECO) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal state of the SECO service. + * + * @param[in] pt partition to dump + */ + void seco_dump(sc_rm_pt_t pt); + + /** @} */ +#endif + +#endif /* SC_SECO_SVC_H */ + +/** @} */ + diff --git a/platform/svc/timer/Makefile b/platform/svc/timer/Makefile new file mode 100755 index 0000000..c8559ad --- /dev/null +++ b/platform/svc/timer/Makefile @@ -0,0 +1,17 @@ + +OBJS += $(OUT)/svc/timer/svc.o + +RPCS += $(OUT)/svc/timer/rpc_srv.o + +RPCL += $(OUT)/svc/timer/rpc_clnt.o + +RPCH += $(SRC)/svc/timer/rpc.h + +RPCC += $(SRC)/svc/timer/rpc_srv.c \ + $(SRC)/svc/timer/rpc_clnt.c \ + $(SRC)/svc/timer/rpc_xlate.c + +RPCHDR += $(SRC)/svc/timer/rpc_header.h + +DIRS += $(OUT)/svc/timer + diff --git a/platform/svc/timer/api.h b/platform/svc/timer/api.h new file mode 100755 index 0000000..7b2902a --- /dev/null +++ b/platform/svc/timer/api.h @@ -0,0 +1,440 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/timer/api.h + * + * Header file containing the public API for the System Controller (SC) + * Timer function. + * + * @addtogroup TIMER_SVC TIMER: Timer Service + * + * @brief Module for the Timer service. This includes support for the watchdog, RTC, + * and system counter. Note every resource partition has a watchdog it can + * use. + * + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_TIMER_API_H +#define SC_TIMER_API_H + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" + +/* Defines */ + +/*! + * @name Defines for type widths + */ +/** @{ */ +#define SC_TIMER_ACTION_W 3U /*!< Width of sc_timer_wdog_action_t */ +/** @} */ + +/*! + * @name Defines for sc_timer_wdog_action_t + */ +/** @{ */ +#define SC_TIMER_WDOG_ACTION_PARTITION 0U /*!< Reset partition */ +#define SC_TIMER_WDOG_ACTION_WARM 1U /*!< Warm reset system */ +#define SC_TIMER_WDOG_ACTION_COLD 2U /*!< Cold reset system */ +#define SC_TIMER_WDOG_ACTION_BOARD 3U /*!< Reset board */ +#define SC_TIMER_WDOG_ACTION_IRQ 4U /*!< Only generate IRQs */ +/** @} */ + +/* Types */ + +/*! + * This type is used to configure the watchdog action. + */ +typedef uint8_t sc_timer_wdog_action_t; + +/*! + * This type is used to declare a watchdog time value in milliseconds. + */ +typedef uint32_t sc_timer_wdog_time_t; + +/* Functions */ + +/*! + * @name Watchdog Functions + * @{ + */ + +/*! + * This function sets the watchdog timeout in milliseconds. If not + * set then the timeout defaults to the max. Once locked this value + * cannot be changed. + * + * @param[in] ipc IPC handle + * @param[in] timeout timeout period for the watchdog + * + * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED + * = locked). + */ +/* IDL: E8 SET_WDOG_TIMEOUT(UI32 timeout) #1 */ +sc_err_t sc_timer_set_wdog_timeout(sc_ipc_t ipc, + sc_timer_wdog_time_t timeout); + +/*! + * This function sets the watchdog pre-timeout in milliseconds. If not + * set then the pre-timeout defaults to the max. Once locked this value + * cannot be changed. + * + * @param[in] ipc IPC handle + * @param[in] pre_timeout pre-timeout period for the watchdog + * + * When the pre-timout expires an IRQ will be generated. Note this timeout + * clears when the IRQ is triggered. An IRQ is generated for the failing + * partition and all of its child partitions. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 SET_WDOG_PRE_TIMEOUT(UI32 pre_timeout) #12 */ +sc_err_t sc_timer_set_wdog_pre_timeout(sc_ipc_t ipc, + sc_timer_wdog_time_t pre_timeout); + +/*! + * This function sets the watchdog window in milliseconds. If not + * set then the window defaults to the 0. Once locked this value + * cannot be changed. + * + * @param[in] ipc IPC handle + * @param[in] window window period for the watchdog + * + * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED + * = locked). + * + * Calling sc_timer_ping_wdog() before the window time has expired will + * result in the watchdog action being taken. + */ +/* IDL: E8 SET_WDOG_WINDOW(UI32 window) #19 */ +sc_err_t sc_timer_set_wdog_window(sc_ipc_t ipc, + sc_timer_wdog_time_t window); + +/*! + * This function starts the watchdog. + * + * @param[in] ipc IPC handle + * @param[in] lock boolean indicating the lock status + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_NOACCESS if caller's partition is not isolated, + * - SC_ERR_BUSY if already started + * + * If \a lock is set then the watchdog cannot be stopped or the timeout + * period changed. + * + * If the calling partition is not isolated then the wdog cannot be used. + * This is always the case if a non-secure partition is running on the same + * CPU as a secure partition (e.g. Linux under TZ). See sc_rm_partition_alloc(). + */ +/* IDL: E8 START_WDOG(IB lock) #2 */ +sc_err_t sc_timer_start_wdog(sc_ipc_t ipc, sc_bool_t lock); + +/*! + * This function stops the watchdog if it is not locked. + * + * @param[in] ipc IPC handle + * + * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED + * = locked). + */ +/* IDL: E8 STOP_WDOG() #3 */ +sc_err_t sc_timer_stop_wdog(sc_ipc_t ipc); + +/*! + * This function pings (services, kicks) the watchdog resetting the time + * before expiration back to the timeout. + * + * @param[in] ipc IPC handle + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 PING_WDOG() #4 */ +sc_err_t sc_timer_ping_wdog(sc_ipc_t ipc); + +/*! + * This function gets the status of the watchdog. All arguments are + * in milliseconds. + * + * @param[in] ipc IPC handle + * @param[out] timeout pointer to return the timeout + * @param[out] max_timeout pointer to return the max timeout + * @param[out] remaining_time pointer to return the time remaining + * until trigger + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 GET_WDOG_STATUS(UO32 timeout, UO32 max_timeout, UO32 remaining_time) #5 */ +sc_err_t sc_timer_get_wdog_status(sc_ipc_t ipc, + sc_timer_wdog_time_t *timeout, sc_timer_wdog_time_t *max_timeout, + sc_timer_wdog_time_t *remaining_time); + +/*! + * This function gets the status of the watchdog of a partition. All + * arguments are in milliseconds. + * + * @param[in] ipc IPC handle + * @param[in] pt partition to query + * @param[out] enb pointer to return enable status + * @param[out] timeout pointer to return the timeout + * @param[out] remaining_time pointer to return the time remaining + * until trigger + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 PT_GET_WDOG_STATUS(UI8 pt, OB enb, UO32 timeout, UO32 remaining_time) #13 */ +sc_err_t sc_timer_pt_get_wdog_status(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t *enb, + sc_timer_wdog_time_t *timeout, sc_timer_wdog_time_t *remaining_time); + +/*! + * This function configures the action to be taken when a watchdog + * expires. + * + * @param[in] ipc IPC handle + * @param[in] pt partition to affect + * @param[in] action action to take + * + * Default action is inherited from the parent. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid parameters, + * - SC_ERR_NOACCESS if caller's partition is not the SYSTEM owner, + * - SC_ERR_LOCKED if the watchdog is locked + */ +/* IDL: E8 SET_WDOG_ACTION(UI8 pt, UI8 action) #10 */ +sc_err_t sc_timer_set_wdog_action(sc_ipc_t ipc, + sc_rm_pt_t pt, sc_timer_wdog_action_t action); + +/** @} */ + +/*! + * @name Real-Time Clock (RTC) Functions + * @{ + */ + +/*! + * This function sets the RTC time. Only the owner of the SC_R_SYSTEM + * resource or a partition with access permissions to SC_R_SYSTEM can + * set the time. + * + * @param[in] ipc IPC handle + * @param[in] year year (min 1970) + * @param[in] mon month (1-12) + * @param[in] day day of the month (1-31) + * @param[in] hour hour (0-23) + * @param[in] min minute (0-59) + * @param[in] sec second (0-59) + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters, + * - SC_ERR_NOACCESS if caller's partition cannot access SC_R_SYSTEM + */ +/* IDL: E8 SET_RTC_TIME(UI16 year, UI8 mon, UI8 day, UI8 hour, UI8 min, UI8 sec) #6 */ +sc_err_t sc_timer_set_rtc_time(sc_ipc_t ipc, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); + +/*! + * This function gets the RTC time. + * + * @param[in] ipc IPC handle + * @param[out] year pointer to return year (min 1970) + * @param[out] mon pointer to return month (1-12) + * @param[out] day pointer to return day of the month (1-31) + * @param[out] hour pointer to return hour (0-23) + * @param[out] min pointer to return minute (0-59) + * @param[out] sec pointer to return second (0-59) + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 GET_RTC_TIME(UO16 year, UO8 mon, UO8 day, UO8 hour, UO8 min, UO8 sec) #7 */ +sc_err_t sc_timer_get_rtc_time(sc_ipc_t ipc, uint16_t *year, uint8_t *mon, + uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec); + +/*! + * This function gets the RTC time in seconds since 1/1/1970. + * + * @param[in] ipc IPC handle + * @param[out] sec pointer to return seconds + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 GET_RTC_SEC1970(UO32 sec) #9 */ +sc_err_t sc_timer_get_rtc_sec1970(sc_ipc_t ipc, uint32_t *sec); + +/*! + * This function sets the RTC alarm. + * + * @param[in] ipc IPC handle + * @param[in] year year (min 1970) + * @param[in] mon month (1-12) + * @param[in] day day of the month (1-31) + * @param[in] hour hour (0-23) + * @param[in] min minute (0-59) + * @param[in] sec second (0-59) + * + * Note this alarm setting clears when the alarm is triggered. This is an + * absolute time. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 SET_RTC_ALARM(UI16 year, UI8 mon, UI8 day, UI8 hour, UI8 min, UI8 sec) #8 */ +sc_err_t sc_timer_set_rtc_alarm(sc_ipc_t ipc, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); + +/*! + * This function sets the RTC alarm (periodic mode). + * + * @param[in] ipc IPC handle + * @param[in] sec period in seconds + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Note this is a relative time. + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 SET_RTC_PERIODIC_ALARM(UI32 sec) #14 */ +sc_err_t sc_timer_set_rtc_periodic_alarm(sc_ipc_t ipc, uint32_t sec); + +/*! + * This function cancels the RTC alarm. + * + * @param[in] ipc IPC handle + * + * Note this alarm setting clears when the alarm is triggered. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 CANCEL_RTC_ALARM() #15 */ +sc_err_t sc_timer_cancel_rtc_alarm(sc_ipc_t ipc); + +/*! + * This function sets the RTC calibration value. Only the owner of the SC_R_SYSTEM + * resource or a partition with access permissions to SC_R_SYSTEM can set the + * calibration. + * + * @param[in] ipc IPC handle + * @param[in] count calibration count (-16 to 15) + * + * The calibration value is a 5-bit value including the sign bit, which is + * implemented in 2's complement. It is added or subtracted from the RTC on + * a periodic basis, once per 32768 cycles of the RTC clock. + * + * @return Returns an error code (SC_ERR_NONE = success). + */ +/* IDL: E8 SET_RTC_CALB(I8 count) #11 */ +sc_err_t sc_timer_set_rtc_calb(sc_ipc_t ipc, int8_t count); + +/** @} */ + +/*! + * @name System Counter (SYSCTR) Functions + * @{ + */ + +/*! + * This function sets the SYSCTR alarm. + * + * @param[in] ipc IPC handle + * @param[in] ticks number of 8MHz cycles + * + * Note the \a ticks parameter is an absolute time. This alarm + * setting clears when the alarm is triggered. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 SET_SYSCTR_ALARM(UI64 ticks) #16 */ +sc_err_t sc_timer_set_sysctr_alarm(sc_ipc_t ipc, uint64_t ticks); + +/*! + * This function sets the SYSCTR alarm (periodic mode). + * + * @param[in] ipc IPC handle + * @param[in] ticks number of 8MHz cycles + * + * Note the \a ticks parameter is a relative time. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 SET_SYSCTR_PERIODIC_ALARM(UI64 ticks) #17 */ +sc_err_t sc_timer_set_sysctr_periodic_alarm(sc_ipc_t ipc, + uint64_t ticks); + +/*! + * This function cancels the SYSCTR alarm. + * + * @param[in] ipc IPC handle + * + * Note this alarm setting clears when the alarm is triggered. + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Return errors: + * - SC_ERR_PARM if invalid time/date parameters + */ +/* IDL: E8 CANCEL_SYSCTR_ALARM() #18 */ +sc_err_t sc_timer_cancel_sysctr_alarm(sc_ipc_t ipc); + +/** @} */ + +#endif /* SC_TIMER_API_H */ + +/** @} */ + diff --git a/platform/svc/timer/rpc.h b/platform/svc/timer/rpc.h new file mode 100644 index 0000000..00c855f --- /dev/null +++ b/platform/svc/timer/rpc.h @@ -0,0 +1,98 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file for the TIMER RPC implementation. + * + * @addtogroup TIMER_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_h.pl */ + +#ifndef SC_TIMER_RPC_H +#define SC_TIMER_RPC_H + +/* Includes */ + +/* Defines */ + +/*! + * @name Defines for RPC TIMER function calls + */ +/** @{ */ +#define TIMER_FUNC_UNKNOWN 0 /*!< Unknown function */ +#define TIMER_FUNC_SET_WDOG_TIMEOUT 1U /*!< Index for sc_timer_set_wdog_timeout() RPC call */ +#define TIMER_FUNC_SET_WDOG_PRE_TIMEOUT 12U /*!< Index for sc_timer_set_wdog_pre_timeout() RPC call */ +#define TIMER_FUNC_SET_WDOG_WINDOW 19U /*!< Index for sc_timer_set_wdog_window() RPC call */ +#define TIMER_FUNC_START_WDOG 2U /*!< Index for sc_timer_start_wdog() RPC call */ +#define TIMER_FUNC_STOP_WDOG 3U /*!< Index for sc_timer_stop_wdog() RPC call */ +#define TIMER_FUNC_PING_WDOG 4U /*!< Index for sc_timer_ping_wdog() RPC call */ +#define TIMER_FUNC_GET_WDOG_STATUS 5U /*!< Index for sc_timer_get_wdog_status() RPC call */ +#define TIMER_FUNC_PT_GET_WDOG_STATUS 13U /*!< Index for sc_timer_pt_get_wdog_status() RPC call */ +#define TIMER_FUNC_SET_WDOG_ACTION 10U /*!< Index for sc_timer_set_wdog_action() RPC call */ +#define TIMER_FUNC_SET_RTC_TIME 6U /*!< Index for sc_timer_set_rtc_time() RPC call */ +#define TIMER_FUNC_GET_RTC_TIME 7U /*!< Index for sc_timer_get_rtc_time() RPC call */ +#define TIMER_FUNC_GET_RTC_SEC1970 9U /*!< Index for sc_timer_get_rtc_sec1970() RPC call */ +#define TIMER_FUNC_SET_RTC_ALARM 8U /*!< Index for sc_timer_set_rtc_alarm() RPC call */ +#define TIMER_FUNC_SET_RTC_PERIODIC_ALARM 14U /*!< Index for sc_timer_set_rtc_periodic_alarm() RPC call */ +#define TIMER_FUNC_CANCEL_RTC_ALARM 15U /*!< Index for sc_timer_cancel_rtc_alarm() RPC call */ +#define TIMER_FUNC_SET_RTC_CALB 11U /*!< Index for sc_timer_set_rtc_calb() RPC call */ +#define TIMER_FUNC_SET_SYSCTR_ALARM 16U /*!< Index for sc_timer_set_sysctr_alarm() RPC call */ +#define TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM 17U /*!< Index for sc_timer_set_sysctr_periodic_alarm() RPC call */ +#define TIMER_FUNC_CANCEL_SYSCTR_ALARM 18U /*!< Index for sc_timer_cancel_sysctr_alarm() RPC call */ +/** @} */ + +/* Types */ + +/* Functions */ + +/*! + * This function dispatches an incoming TIMER RPC request. + * + * @param[in] caller_pt caller partition + * @param[in] mu MU message came from + * @param[in] msg pointer to RPC message + */ +void timer_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg); + +#endif /* SC_TIMER_RPC_H */ + +/** @} */ + diff --git a/platform/svc/timer/rpc_clnt.c b/platform/svc/timer/rpc_clnt.c new file mode 100644 index 0000000..7d2c5b8 --- /dev/null +++ b/platform/svc/timer/rpc_clnt.c @@ -0,0 +1,599 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing client-side RPC functions for the TIMER service. These + * functions are ported to clients that communicate to the SC. + * + * @addtogroup TIMER_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_clnt_c.pl */ + +/* Includes */ + +#include "main/types.h" +#include "svc/rm/api.h" +#include "svc/timer/api.h" +#include "../../main/rpc.h" +#include "svc/timer/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/* Local Functions */ + +/* IDL: E8 SET_WDOG_TIMEOUT(UI32 timeout) #1 */ +sc_err_t sc_timer_set_wdog_timeout(sc_ipc_t ipc, sc_timer_wdog_time_t timeout) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_WDOG_TIMEOUT); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(timeout); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_WDOG_PRE_TIMEOUT(UI32 pre_timeout) #12 */ +sc_err_t sc_timer_set_wdog_pre_timeout(sc_ipc_t ipc, + sc_timer_wdog_time_t pre_timeout) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_WDOG_PRE_TIMEOUT); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(pre_timeout); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_WDOG_WINDOW(UI32 window) #19 */ +sc_err_t sc_timer_set_wdog_window(sc_ipc_t ipc, sc_timer_wdog_time_t window) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_WDOG_WINDOW); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(window); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 START_WDOG(IB lock) #2 */ +sc_err_t sc_timer_start_wdog(sc_ipc_t ipc, sc_bool_t lock) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_START_WDOG); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = B2U8(lock); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 STOP_WDOG() #3 */ +sc_err_t sc_timer_stop_wdog(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_STOP_WDOG); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 PING_WDOG() #4 */ +sc_err_t sc_timer_ping_wdog(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_PING_WDOG); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_WDOG_STATUS(UO32 timeout, UO32 max_timeout, UO32 remaining_time) #5 */ +sc_err_t sc_timer_get_wdog_status(sc_ipc_t ipc, sc_timer_wdog_time_t *timeout, + sc_timer_wdog_time_t *max_timeout, sc_timer_wdog_time_t *remaining_time) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_GET_WDOG_STATUS); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (timeout != NULL) + { + *timeout = (sc_timer_wdog_time_t) RPC_U32(&msg, 0U); + } + if (max_timeout != NULL) + { + *max_timeout = (sc_timer_wdog_time_t) RPC_U32(&msg, 4U); + } + if (remaining_time != NULL) + { + *remaining_time = (sc_timer_wdog_time_t) RPC_U32(&msg, 8U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 PT_GET_WDOG_STATUS(UI8 pt, OB enb, UO32 timeout, UO32 remaining_time) #13 */ +sc_err_t sc_timer_pt_get_wdog_status(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t *enb, + sc_timer_wdog_time_t *timeout, sc_timer_wdog_time_t *remaining_time) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_PT_GET_WDOG_STATUS); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (timeout != NULL) + { + *timeout = (sc_timer_wdog_time_t) RPC_U32(&msg, 0U); + } + if (remaining_time != NULL) + { + *remaining_time = (sc_timer_wdog_time_t) RPC_U32(&msg, 4U); + } + if (enb != NULL) + { + *enb = (sc_bool_t) U2B(RPC_U8(&msg, 8U)); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_WDOG_ACTION(UI8 pt, UI8 action) #10 */ +sc_err_t sc_timer_set_wdog_action(sc_ipc_t ipc, sc_rm_pt_t pt, + sc_timer_wdog_action_t action) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_WDOG_ACTION); + + /* Fill in send message */ + RPC_U8(&msg, 0U) = U8(pt); + RPC_U8(&msg, 1U) = U8(action); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RTC_TIME(UI16 year, UI8 mon, UI8 day, UI8 hour, UI8 min, UI8 sec) #6 */ +sc_err_t sc_timer_set_rtc_time(sc_ipc_t ipc, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_RTC_TIME); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(year); + RPC_U8(&msg, 2U) = U8(mon); + RPC_U8(&msg, 3U) = U8(day); + RPC_U8(&msg, 4U) = U8(hour); + RPC_U8(&msg, 5U) = U8(min); + RPC_U8(&msg, 6U) = U8(sec); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 GET_RTC_TIME(UO16 year, UO8 mon, UO8 day, UO8 hour, UO8 min, UO8 sec) #7 */ +sc_err_t sc_timer_get_rtc_time(sc_ipc_t ipc, uint16_t *year, uint8_t *mon, + uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_GET_RTC_TIME); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (year != NULL) + { + *year = (uint16_t) RPC_U16(&msg, 0U); + } + if (mon != NULL) + { + *mon = (uint8_t) RPC_U8(&msg, 2U); + } + if (day != NULL) + { + *day = (uint8_t) RPC_U8(&msg, 3U); + } + if (hour != NULL) + { + *hour = (uint8_t) RPC_U8(&msg, 4U); + } + if (min != NULL) + { + *min = (uint8_t) RPC_U8(&msg, 5U); + } + if (sec != NULL) + { + *sec = (uint8_t) RPC_U8(&msg, 6U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 GET_RTC_SEC1970(UO32 sec) #9 */ +sc_err_t sc_timer_get_rtc_sec1970(sc_ipc_t ipc, uint32_t *sec) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_GET_RTC_SEC1970); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Copy out receive message */ + if (sec != NULL) + { + *sec = (uint32_t) RPC_U32(&msg, 0U); + } + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RTC_ALARM(UI16 year, UI8 mon, UI8 day, UI8 hour, UI8 min, UI8 sec) #8 */ +sc_err_t sc_timer_set_rtc_alarm(sc_ipc_t ipc, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_RTC_ALARM); + + /* Fill in send message */ + RPC_U16(&msg, 0U) = U16(year); + RPC_U8(&msg, 2U) = U8(mon); + RPC_U8(&msg, 3U) = U8(day); + RPC_U8(&msg, 4U) = U8(hour); + RPC_U8(&msg, 5U) = U8(min); + RPC_U8(&msg, 6U) = U8(sec); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RTC_PERIODIC_ALARM(UI32 sec) #14 */ +sc_err_t sc_timer_set_rtc_periodic_alarm(sc_ipc_t ipc, uint32_t sec) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_RTC_PERIODIC_ALARM); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(sec); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 CANCEL_RTC_ALARM() #15 */ +sc_err_t sc_timer_cancel_rtc_alarm(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_CANCEL_RTC_ALARM); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_RTC_CALB(I8 count) #11 */ +sc_err_t sc_timer_set_rtc_calb(sc_ipc_t ipc, int8_t count) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 2U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_RTC_CALB); + + /* Fill in send message */ + RPC_I8(&msg, 0U) = I8(count); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_SYSCTR_ALARM(UI64 ticks) #16 */ +sc_err_t sc_timer_set_sysctr_alarm(sc_ipc_t ipc, uint64_t ticks) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_SYSCTR_ALARM); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ticks >> 32ULL); + RPC_U32(&msg, 4U) = U32(ticks); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 SET_SYSCTR_PERIODIC_ALARM(UI64 ticks) #17 */ +sc_err_t sc_timer_set_sysctr_periodic_alarm(sc_ipc_t ipc, uint64_t ticks) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 3U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM); + + /* Fill in send message */ + RPC_U32(&msg, 0U) = U32(ticks >> 32ULL); + RPC_U32(&msg, 4U) = U32(ticks); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/* IDL: E8 CANCEL_SYSCTR_ALARM() #18 */ +sc_err_t sc_timer_cancel_sysctr_alarm(sc_ipc_t ipc) +{ + sc_rpc_msg_t msg; + sc_err_t err; + + /* Fill in header */ + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SIZE(&msg) = 1U; + RPC_SVC(&msg) = U8(SC_RPC_SVC_TIMER); + RPC_FUNC(&msg) = U8(TIMER_FUNC_CANCEL_SYSCTR_ALARM); + + /* Call RPC */ + sc_call_rpc(ipc, &msg, SC_FALSE); + + /* Copy out result */ + err = (sc_err_t) RPC_R8(&msg); + + /* Return result */ + return err; +} + +/** @} */ + diff --git a/platform/svc/timer/rpc_srv.c b/platform/svc/timer/rpc_srv.c new file mode 100644 index 0000000..c30f746 --- /dev/null +++ b/platform/svc/timer/rpc_srv.c @@ -0,0 +1,448 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * File containing server-side RPC functions for the TIMER service. + * + * @addtogroup TIMER_SVC + * @{ + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by bin/perl/rpc_srv_c.pl */ + +/* Includes */ + +#include "main/scfw.h" +#include "main/types.h" +#include "main/main.h" +#include "main/rpc.h" +#include "svc/timer/svc.h" +#include "svc/timer/rpc.h" + +/* Local Defines */ + +/* Local Types */ + +/*--------------------------------------------------------------------------*/ +/* Dispatch incoming RPC function call */ +/*--------------------------------------------------------------------------*/ +void timer_dispatch(sc_rm_pt_t caller_pt, sc_rsrc_t mu, sc_rpc_msg_t *msg) +{ + uint8_t func = RPC_FUNC(msg); + sc_err_t err = SC_ERR_NONE; + + switch (func) + { + /* Handle uknown function */ + case TIMER_FUNC_UNKNOWN : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + /* Dispatch set_wdog_timeout() */ + case TIMER_FUNC_SET_WDOG_TIMEOUT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_timer_wdog_time_t timeout = ((sc_timer_wdog_time_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = timer_set_wdog_timeout(caller_pt, timeout); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_wdog_pre_timeout() */ + case TIMER_FUNC_SET_WDOG_PRE_TIMEOUT : + { + /* Declare return and parameters */ + sc_err_t result; + sc_timer_wdog_time_t pre_timeout = ((sc_timer_wdog_time_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = timer_set_wdog_pre_timeout(caller_pt, pre_timeout); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_wdog_window() */ + case TIMER_FUNC_SET_WDOG_WINDOW : + { + /* Declare return and parameters */ + sc_err_t result; + sc_timer_wdog_time_t window = ((sc_timer_wdog_time_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = timer_set_wdog_window(caller_pt, window); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch start_wdog() */ + case TIMER_FUNC_START_WDOG : + { + /* Declare return and parameters */ + sc_err_t result; + sc_bool_t lock = U2B(RPC_U8(msg, 0U)); + + /* Call function */ + err = timer_start_wdog(caller_pt, lock); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch stop_wdog() */ + case TIMER_FUNC_STOP_WDOG : + { + /* Declare return and parameters */ + sc_err_t result; + + /* Call function */ + err = timer_stop_wdog(caller_pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch ping_wdog() */ + case TIMER_FUNC_PING_WDOG : + { + /* Declare return and parameters */ + sc_err_t result; + + /* Call function */ + err = timer_ping_wdog(caller_pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_wdog_status() */ + case TIMER_FUNC_GET_WDOG_STATUS : + { + /* Declare return and parameters */ + sc_err_t result; + sc_timer_wdog_time_t timeout = ((sc_timer_wdog_time_t) 0U); + sc_timer_wdog_time_t max_timeout = ((sc_timer_wdog_time_t) 0U); + sc_timer_wdog_time_t remaining_time = ((sc_timer_wdog_time_t) 0U); + + /* Call function */ + err = timer_get_wdog_status(caller_pt, &timeout, &max_timeout, + &remaining_time); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(timeout); + RPC_U32(msg, 4U) = U32(max_timeout); + RPC_U32(msg, 8U) = U32(remaining_time); + RPC_SIZE(msg) = 4U; + break; + } + /* Dispatch pt_get_wdog_status() */ + case TIMER_FUNC_PT_GET_WDOG_STATUS : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_bool_t enb = SC_FALSE; + sc_timer_wdog_time_t timeout = ((sc_timer_wdog_time_t) 0U); + sc_timer_wdog_time_t remaining_time = ((sc_timer_wdog_time_t) 0U); + + /* Call function */ + err = timer_pt_get_wdog_status(caller_pt, pt, &enb, &timeout, + &remaining_time); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U8(msg, 8U) = B2U8(enb); + RPC_U32(msg, 0U) = U32(timeout); + RPC_U32(msg, 4U) = U32(remaining_time); + RPC_SIZE(msg) = 4U; + break; + } + /* Dispatch set_wdog_action() */ + case TIMER_FUNC_SET_WDOG_ACTION : + { + /* Declare return and parameters */ + sc_err_t result; + sc_rm_pt_t pt = ((sc_rm_pt_t) RPC_U8(msg, 0U)); + sc_timer_wdog_action_t action = ((sc_timer_wdog_action_t) RPC_U8(msg, 1U)); + + /* Call function */ + err = timer_set_wdog_action(caller_pt, pt, action); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_rtc_time() */ + case TIMER_FUNC_SET_RTC_TIME : + { + /* Declare return and parameters */ + sc_err_t result; + uint16_t year = ((uint16_t) RPC_U16(msg, 0U)); + uint8_t mon = ((uint8_t) RPC_U8(msg, 2U)); + uint8_t day = ((uint8_t) RPC_U8(msg, 3U)); + uint8_t hour = ((uint8_t) RPC_U8(msg, 4U)); + uint8_t min = ((uint8_t) RPC_U8(msg, 5U)); + uint8_t sec = ((uint8_t) RPC_U8(msg, 6U)); + + /* Call function */ + err = timer_set_rtc_time(caller_pt, year, mon, day, hour, min, + sec); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch get_rtc_time() */ + case TIMER_FUNC_GET_RTC_TIME : + { + /* Declare return and parameters */ + sc_err_t result; + uint16_t year = ((uint16_t) 0U); + uint8_t mon = ((uint8_t) 0U); + uint8_t day = ((uint8_t) 0U); + uint8_t hour = ((uint8_t) 0U); + uint8_t min = ((uint8_t) 0U); + uint8_t sec = ((uint8_t) 0U); + + /* Call function */ + err = timer_get_rtc_time(caller_pt, &year, &mon, &day, &hour, + &min, &sec); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U16(msg, 0U) = U16(year); + RPC_U8(msg, 2U) = U8(mon); + RPC_U8(msg, 3U) = U8(day); + RPC_U8(msg, 4U) = U8(hour); + RPC_U8(msg, 5U) = U8(min); + RPC_U8(msg, 6U) = U8(sec); + RPC_SIZE(msg) = 3U; + break; + } + /* Dispatch get_rtc_sec1970() */ + case TIMER_FUNC_GET_RTC_SEC1970 : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t sec = ((uint32_t) 0U); + + /* Call function */ + err = timer_get_rtc_sec1970(caller_pt, &sec); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_U32(msg, 0U) = U32(sec); + RPC_SIZE(msg) = 2U; + break; + } + /* Dispatch set_rtc_alarm() */ + case TIMER_FUNC_SET_RTC_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + uint16_t year = ((uint16_t) RPC_U16(msg, 0U)); + uint8_t mon = ((uint8_t) RPC_U8(msg, 2U)); + uint8_t day = ((uint8_t) RPC_U8(msg, 3U)); + uint8_t hour = ((uint8_t) RPC_U8(msg, 4U)); + uint8_t min = ((uint8_t) RPC_U8(msg, 5U)); + uint8_t sec = ((uint8_t) RPC_U8(msg, 6U)); + + /* Call function */ + err = timer_set_rtc_alarm(caller_pt, year, mon, day, hour, min, + sec); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_rtc_periodic_alarm() */ + case TIMER_FUNC_SET_RTC_PERIODIC_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + uint32_t sec = ((uint32_t) RPC_U32(msg, 0U)); + + /* Call function */ + err = timer_set_rtc_periodic_alarm(caller_pt, sec); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch cancel_rtc_alarm() */ + case TIMER_FUNC_CANCEL_RTC_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + + /* Call function */ + err = timer_cancel_rtc_alarm(caller_pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_rtc_calb() */ + case TIMER_FUNC_SET_RTC_CALB : + { + /* Declare return and parameters */ + sc_err_t result; + int8_t count = ((int8_t) RPC_I8(msg, 0U)); + + /* Call function */ + err = timer_set_rtc_calb(caller_pt, count); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_sysctr_alarm() */ + case TIMER_FUNC_SET_SYSCTR_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + uint64_t ticks = ((uint64_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = timer_set_sysctr_alarm(caller_pt, ticks); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch set_sysctr_periodic_alarm() */ + case TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + uint64_t ticks = ((uint64_t) RPC_U64(msg, 0U)); + + /* Call function */ + err = timer_set_sysctr_periodic_alarm(caller_pt, ticks); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Dispatch cancel_sysctr_alarm() */ + case TIMER_FUNC_CANCEL_SYSCTR_ALARM : + { + /* Declare return and parameters */ + sc_err_t result; + + /* Call function */ + err = timer_cancel_sysctr_alarm(caller_pt); + result = err; + + /* Copy in return parameters */ + RPC_R8(msg) = U8(result); + RPC_SIZE(msg) = 1U; + break; + } + /* Handle default */ + default : + { + RPC_SIZE(msg) = 1; + err = SC_ERR_NOTFOUND; + RPC_R8(msg) = (uint8_t) err; + } + break; + } + + /* Fill in header */ + RPC_VER(msg) = SC_RPC_VERSION; + RPC_SVC(msg) = (uint8_t) SC_RPC_SVC_RETURN; + + /* Handle error debug */ + if (err != SC_ERR_NONE) + { + if (rpc_debug) + { + always_print("ipc_err: api=timer, func=%d, err=%d\n", func, err); + } + else + { + rpc_print(0, "ipc_err: api=timer, func=%d, err=%d\n", func, err); + } + } +} + +/** @} */ + diff --git a/platform/svc/timer/svc.c b/platform/svc/timer/svc.c new file mode 100755 index 0000000..a0c5f91 --- /dev/null +++ b/platform/svc/timer/svc.c @@ -0,0 +1,1209 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/timer/svc.c + * + * File containing the implementation of the System Controller (SC) Timer + * function. + * + * @addtogroup TIMER_SVC + * @{ + */ +/*==========================================================================*/ + +/* Includes */ + +#include "main/scfw.h" +#include "main/main.h" +#include "main/board.h" +#include "svc/timer/svc.h" +#include "svc/rm/svc.h" +#include "ss/inf/inf.h" +#include "drivers/snvs/fsl_snvs.h" +#ifdef HAS_SECO +#include "drivers/seco/fsl_seco.h" +#endif +#include "drivers/sysctr/fsl_sysctr.h" + +/* Local Defines */ + +#define MAX_TIMEOUT (UINT32_MAX - 1U) //!< Max Timeout + +#define EPOCH 1970U +#define LEAP_YEAR(X) ((!U2B((X) % 4U) && U2B((X) % 100U)) || !U2B((X) % 400U)) +#define MIN_SECS 60U +#define HOUR_SECS (60U * MIN_SECS) +#define DAY_SECS (24U * HOUR_SECS) +#define YEAR_DAYS(X) (LEAP_YEAR(X) ? 366U : 365U) + +/* Local Types */ + +/*! + * This type is used to store dynamic info needed to track partition + * specific data for the watchdog service. + */ +typedef struct +{ + uint64_t sysctr_alarm; + uint64_t sysctr_period; + sc_timer_wdog_time_t wdog_time; + sc_timer_wdog_time_t wdog_timeout; + sc_timer_wdog_time_t wdog_window; + sc_timer_wdog_time_t wdog_pre_timeout; + uint32_t rtc_alarm; + uint32_t rtc_period; + sc_timer_wdog_action_t action : SC_TIMER_ACTION_W; + sc_bool_t wdog_enabled : SC_BOOL_W; + sc_bool_t wdog_locked : SC_BOOL_W; +} timer_part_data_t; + +/* Local Functions */ + +static void update_alarm(void); +static void update_sysctr(void); +static uint32_t epoc2secs(uint16_t year, uint8_t mon, uint8_t day, + uint8_t hour, uint8_t min, uint8_t sec); +static void notify_wdog_children(sc_rm_pt_t pt); + +/* Local Variables */ + +/*! Array of days in months */ +static const uint8_t days_in_month[2][12] = +{ + { 31U, 28U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U }, + { 31U, 29U, 31U, 30U, 31U, 30U, 31U, 31U, 30U, 31U, 30U, 31U } +}; + +#if defined(SC_FAKE_RTC) + /*! Fake RTC seconds */ + static uint32_t rtc_seconds; + /*! Fake RTC milliseconds */ + static uint32_t rtc_mseconds; + /*! Fake RTC seconds */ +#endif + +/*! + * @name Local Variables (not initialized) + * + * @{ + */ +static timer_part_data_t timer_part_data[SC_RM_NUM_PARTITION]; +/** @} */ + +/*--------------------------------------------------------------------------*/ +/* Init the timer service */ +/*--------------------------------------------------------------------------*/ +void timer_init(sc_bool_t api_phase) +{ + if (api_phase != SC_FALSE) + { + sc_rm_pt_t p; + + /* All partitions disabled */ + for (p = 0; p < SC_RM_NUM_PARTITION; p++) + { + timer_init_part(SC_PT, p); + } + } +} + +/*--------------------------------------------------------------------------*/ +/* Initialize a new partition */ +/*--------------------------------------------------------------------------*/ +void timer_init_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt) +{ + /* Init partition wdog data */ + timer_part_data[pt].wdog_enabled = SC_FALSE; + timer_part_data[pt].wdog_locked= SC_FALSE; + timer_part_data[pt].wdog_timeout = MAX_TIMEOUT; + timer_part_data[pt].wdog_window = 0U; + timer_part_data[pt].wdog_pre_timeout = MAX_TIMEOUT; + + /* Init partition RTC data */ + timer_part_data[pt].rtc_alarm = UINT32_MAX; + timer_part_data[pt].rtc_period = 0U; + + /* Init partition system counter data */ + timer_part_data[pt].sysctr_alarm = UINT64_MAX; + timer_part_data[pt].sysctr_period = 0ULL; + + /* Check for SCU PT */ + if (pt == SC_PT) + { + /* Action is to reboot partition */ + timer_part_data[pt].action = SC_TIMER_WDOG_ACTION_PARTITION; + } + else + { + sc_rm_pt_t parent = rm_get_partition_parent(pt); + + /* Action defaults to that of parent */ + timer_part_data[pt].action = timer_part_data[parent].action; + } +} + +/*--------------------------------------------------------------------------*/ +/* Set the timeout in mS (if not locked) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_wdog_timeout(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t timeout) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check permissions */ + ASRT_ERR(timer_part_data[caller_pt].wdog_locked == SC_FALSE, + SC_ERR_LOCKED) + + if (err == SC_ERR_NONE) + { + /* Update */ + timer_part_data[caller_pt].wdog_timeout = timeout; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the pre-timeout in mS (if not locked) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_wdog_pre_timeout(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t pre_timeout) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(pre_timeout <= MAX_TIMEOUT, SC_ERR_PARM) + + if (err == SC_ERR_NONE) + { + /* Update */ + timer_part_data[caller_pt].wdog_pre_timeout = pre_timeout; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the timeout in mS (if not locked) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_wdog_window(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t window) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check permissions */ + ASRT_ERR(timer_part_data[caller_pt].wdog_locked == SC_FALSE, + SC_ERR_LOCKED) + + if (err == SC_ERR_NONE) + { + /* Update */ + timer_part_data[caller_pt].wdog_window = window; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Start the watchdog */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_start_wdog(sc_rm_pt_t caller_pt, sc_bool_t lock) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check permissions */ + ASRT_ERR(rm_is_partition_isolated(caller_pt) != SC_FALSE, + SC_ERR_NOACCESS); + ASRT_ERR(timer_part_data[caller_pt].wdog_enabled == SC_FALSE, + SC_ERR_BUSY); + + if (err == SC_ERR_NONE) + { + /* Update */ + timer_part_data[caller_pt].wdog_time = 0U; + timer_part_data[caller_pt].wdog_enabled = SC_TRUE; + timer_part_data[caller_pt].wdog_locked = lock; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Stop the watchdog (if not locked) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_stop_wdog(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check permissions */ + ASRT_ERR(timer_part_data[caller_pt].wdog_locked == SC_FALSE, + SC_ERR_LOCKED) + + if (err == SC_ERR_NONE) + { + /* Update */ + timer_part_data[caller_pt].wdog_enabled = SC_FALSE; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Halt and reset watchdog even if locked */ +/*--------------------------------------------------------------------------*/ +void timer_halt_wdog(sc_rm_pt_t pt) +{ + /* Reset wdog */ + timer_part_data[pt].wdog_enabled = SC_FALSE; + timer_part_data[pt].wdog_time = 0U; + timer_part_data[pt].wdog_timeout = MAX_TIMEOUT; + timer_part_data[pt].wdog_window = 0U; + timer_part_data[pt].wdog_pre_timeout = MAX_TIMEOUT; + timer_part_data[pt].wdog_locked = SC_FALSE; + + /* Reset wdog action */ + timer_part_data[pt].action = SC_TIMER_WDOG_ACTION_PARTITION; +} + +/*--------------------------------------------------------------------------*/ +/* Ping (kick) the watchdog */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_ping_wdog(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Reboot/notify if timeout expired */ + if (timer_part_data[caller_pt].wdog_time + < timer_part_data[caller_pt].wdog_window) + { + timer_part_data[caller_pt].wdog_enabled = SC_FALSE; + + err = timer_take_wdog_action(caller_pt); + } + + /* Ping virtual timer */ + timer_part_data[caller_pt].wdog_time = 0U; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the watchdog status (all times in mS) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_get_wdog_status(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t *timeout, sc_timer_wdog_time_t *max_timeout, + sc_timer_wdog_time_t *remaining_time) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Return data */ + if (timeout != NULL) + { + *timeout = timer_part_data[caller_pt].wdog_timeout; + } + + if (max_timeout != NULL) + { + *max_timeout = MAX_TIMEOUT; + } + + if (remaining_time != NULL) + { + *remaining_time = timer_part_data[caller_pt].wdog_timeout + - timer_part_data[caller_pt].wdog_time; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get a partition watchdog status (all times in mS) */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_pt_get_wdog_status(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_bool_t *enb, sc_timer_wdog_time_t *timeout, + sc_timer_wdog_time_t *remaining_time) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + + if (err == SC_ERR_NONE) + { + /* Return data */ + if (enb != NULL) + { + *enb = timer_part_data[pt].wdog_enabled; + } + + if (timeout != NULL) + { + *timeout = timer_part_data[pt].wdog_timeout; + } + + if (remaining_time != NULL) + { + *remaining_time = timer_part_data[pt].wdog_timeout + - timer_part_data[pt].wdog_time; + } + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Configure the action to be taken when a watchdog expires */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_wdog_action(sc_rm_pt_t caller_pt, + sc_rm_pt_t pt, sc_timer_wdog_action_t action) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + BOUND_PT(pt); + ASRT_ERR(action <= SC_TIMER_WDOG_ACTION_IRQ, SC_ERR_PARM) + + /* Check permissions */ + SYSTEM(caller_pt); + ASRT_ERR((pt != SC_PT) || (caller_pt == SC_PT), SC_ERR_NOACCESS) + + /* Check if locked */ + ASRT_ERR(timer_part_data[pt].wdog_locked == SC_FALSE, + SC_ERR_LOCKED) + + /* Set action */ + if (err == SC_ERR_NONE) + { + timer_part_data[pt].action = action; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Reboot partition or board depending on action */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_take_wdog_action(sc_rm_pt_t pt) +{ + sc_err_t err = SC_ERR_NONE; + sc_rm_idx_t idx; + sc_rm_pt_t system_pt; + + switch (timer_part_data[pt].action) + { + case SC_TIMER_WDOG_ACTION_PARTITION : + err = pm_reboot_part(pt, pt, SC_PM_RESET_TYPE_COLD, + SC_PM_RESET_REASON_WDOG, SC_PM_PW_MODE_OFF); + break; + case SC_TIMER_WDOG_ACTION_WARM : + err = board_reset(SC_PM_RESET_TYPE_WARM, SC_PM_RESET_REASON_WDOG, + pt); + break; + case SC_TIMER_WDOG_ACTION_COLD : + err = board_reset(SC_PM_RESET_TYPE_COLD, SC_PM_RESET_REASON_WDOG, + pt); + break; + case SC_TIMER_WDOG_ACTION_BOARD : + err = board_reset(SC_PM_RESET_TYPE_BOARD, SC_PM_RESET_REASON_WDOG, + pt); + break; + case SC_TIMER_WDOG_ACTION_IRQ : + /* Notify parent */ + ss_irq_trigger(SC_IRQ_GROUP_WDOG, + BIT(rm_get_partition_parent(pt)), SC_PT_ALL); + + /* Notify SYSTEM */ + if (rm_check_map_ridx(SC_R_SYSTEM, &idx) != SC_FALSE) + { + rm_get_ridx_owner(idx, &system_pt); + if (system_pt != rm_get_partition_parent(pt)) + { + ss_irq_trigger(SC_IRQ_GROUP_WDOG, + BIT(system_pt), SC_PT_ALL); + } + } + break; + default : + ; /* Intentional empty default */ + break; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the RTC time */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_rtc_time(sc_rm_pt_t caller_pt, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(year >= EPOCH, SC_ERR_PARM) + ASRT_ERR((mon >= 1U) && (mon <= 12U), SC_ERR_PARM) + ASRT_ERR((day >= 1U) && (day <= 31U), SC_ERR_PARM) + ASRT_ERR(hour < 24U, SC_ERR_PARM) + ASRT_ERR(min < 60U, SC_ERR_PARM) + ASRT_ERR(sec < 60U, SC_ERR_PARM) + + /* Check permissions */ + SYSTEM(caller_pt); + + /* Convert to seconds since epoc */ + if (err == SC_ERR_NONE) + { + uint32_t seconds; + uint32_t secs = 0U; + + seconds = epoc2secs(year, mon, day, hour, min, sec); + + /* Dump for debug */ + timer_print(3, "Time = %u\n", seconds); + + /* Read from the RTC */ + #if defined(SC_FAKE_RTC) + secs = rtc_seconds; + #else + SNVS_GetRtc(&secs); + #endif + + /* Update periodic alarms */ + for (sc_rm_pt_t p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (timer_part_data[p].rtc_period != 0U) + { + timer_part_data[p].rtc_alarm = + timer_part_data[p].rtc_alarm + - secs + seconds; + } + } + + /* Program into the RTC */ + #if defined(SC_FAKE_RTC) + rtc_seconds = seconds; + rtc_mseconds = 0U; + #else + SNVS_SetRtc(seconds); + err = snvs_err; + if (err == SC_ERR_NONE) + { + SNVS_Functional_IRQHandler(); + } + #endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Get the RTC time */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_get_rtc_time(sc_rm_pt_t caller_pt, uint16_t *year, + uint8_t *mon, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec) +{ + sc_err_t err = SC_ERR_NONE; + uint32_t secs; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Read from the RTC */ + if (err == SC_ERR_NONE) + { + #if defined(SC_FAKE_RTC) + secs = rtc_seconds; + #else + SNVS_GetRtc(&secs); + err = snvs_err; + #endif + } + + if (err == SC_ERR_NONE) + { + uint32_t days; + uint32_t daytime; + + /* Figure out time */ + daytime = secs % DAY_SECS; + *hour = U8(daytime / HOUR_SECS); + *min = U8((daytime % HOUR_SECS) / MIN_SECS); + *sec = U8(daytime % MIN_SECS); + + /* Figure out year */ + days = secs / DAY_SECS; + *year = EPOCH; + while (days >= YEAR_DAYS((*year))) + { + days -= YEAR_DAYS((*year)); + (*year)++; + } + + /* Figure out month */ + *mon = 0U; + while (days >= days_in_month[B2U16(LEAP_YEAR(*year))][*mon]) + { + days -= days_in_month[B2U16(LEAP_YEAR(*year))][*mon]; + (*mon)++; + } + *mon += 1U; + *day = U8(days) + 1U; + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the RTC alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_rtc_alarm(sc_rm_pt_t caller_pt, uint16_t year, + uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(year >= EPOCH, SC_ERR_PARM) + ASRT_ERR((mon >= 1U) && (mon <= 12U), SC_ERR_PARM) + ASRT_ERR((day >= 1U) && (day <= 31U), SC_ERR_PARM) + ASRT_ERR(hour < 24U, SC_ERR_PARM) + ASRT_ERR(min < 60U, SC_ERR_PARM) + ASRT_ERR(sec < 60U, SC_ERR_PARM) + + /* Check for error */ + if (err == SC_ERR_NONE) + { + uint32_t seconds; + + /* Convert to seconds since epoc */ + seconds = epoc2secs(year, mon, day, hour, min, sec); + + /* Dump for debug */ + timer_print(3, "Set RTC alarm = %u\n", seconds); + + /* Program into the RTC alarm */ + timer_part_data[caller_pt].rtc_alarm = seconds; + timer_part_data[caller_pt].rtc_period = 0U; + + /* Update alarm */ + update_alarm(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the RTC periodic alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_rtc_periodic_alarm(sc_rm_pt_t caller_pt, uint32_t sec) +{ + sc_err_t err = SC_ERR_NONE; + uint32_t secs; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(sec != 0U, SC_ERR_PARM); + + if (err == SC_ERR_NONE) + { + /* Dump for debug */ + timer_print(3, "Set RTC periodic alarm = %u\n", sec); + + /* Read from the RTC */ + #if defined(SC_FAKE_RTC) + secs = rtc_seconds; + #else + SNVS_GetRtc(&secs); + err = snvs_err; + #endif + } + + if (err == SC_ERR_NONE) + { + uint32_t seconds; + + /* Program into the RTC alarm */ + seconds = secs + sec; + timer_part_data[caller_pt].rtc_alarm = seconds; + timer_part_data[caller_pt].rtc_period = sec; + + update_alarm(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Cancel RTC alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_cancel_rtc_alarm(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Program into the RTC alarm */ + timer_part_data[caller_pt].rtc_alarm = UINT32_MAX; + timer_part_data[caller_pt].rtc_period = 0U; + + update_alarm(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Query RTC alarm */ +/*--------------------------------------------------------------------------*/ +void timer_query_rtc_alarm(sc_rm_pt_t pt, uint32_t *alarm, + uint32_t *period) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(pt); + + if (err == SC_ERR_NONE) + { + /* Return RTC alarm data for the partition */ + *alarm = timer_part_data[pt].rtc_alarm; + *period = timer_part_data[pt].rtc_period; + } +} + +/*--------------------------------------------------------------------------*/ +/* Restore RTC alarm */ +/*--------------------------------------------------------------------------*/ +void timer_restore_rtc_alarm(sc_rm_pt_t pt, uint32_t alarm, + uint32_t period) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(pt); + + if (err == SC_ERR_NONE) + { + /* Restore RTC alarm data for the partition */ + timer_part_data[pt].rtc_alarm = alarm; + timer_part_data[pt].rtc_period = period; + + update_alarm(); + } +} + +/*--------------------------------------------------------------------------*/ +/* Get the RTC time in seconds since 1/1/1970 */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_get_rtc_sec1970(sc_rm_pt_t caller_pt, uint32_t *sec) +{ + /* Read from the RTC */ + #if defined(SC_FAKE_RTC) + *sec = rtc_seconds; + + return SC_ERR_NONE; + #else + SNVS_GetRtc(sec); + + return snvs_err; + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Set the RTC calibration */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_rtc_calb(sc_rm_pt_t caller_pt, int8_t count) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + /* Check parameters */ + ASRT_ERR(count >= -16, SC_ERR_PARM) + ASRT_ERR(count <= 15, SC_ERR_PARM) + + /* Check permissions */ + SYSTEM(caller_pt); + + if (err == SC_ERR_NONE) + { + #if !defined(SC_FAKE_RTC) + SNVS_SetRtcCalb(count); + SNVS_SetSecureRtcCalb(count); + err = snvs_err; + #else + err = SC_ERR_UNAVAILABLE; + #endif + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Tick timer services */ +/*--------------------------------------------------------------------------*/ +void timer_tick(uint16_t msec) +{ + sc_rm_pt_t p; + + #if defined(SC_FAKE_RTC) + uint32_t sec; + + /* Tick fake RTC */ + rtc_mseconds += msec; + sec = rtc_mseconds / 1000U; + rtc_mseconds -= (sec * 1000U); + rtc_seconds += sec; + + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (rtc_seconds >= timer_part_data[p].rtc_alarm) + { + if (timer_part_data[p].rtc_period == 0U) + { + timer_part_data[p].rtc_alarm = UINT32_MAX; + } + else + { + timer_part_data[p].rtc_alarm = rtc_seconds + + timer_part_data[p].rtc_period; + } + ss_irq_trigger(SC_IRQ_GROUP_RTC, BIT(p), p); + if (p == SC_PT) + { +#ifdef HAS_SECO + SECO_KickWdog(); +#endif + } + } + } + #endif + + /* Tick watchdogs */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (timer_part_data[p].wdog_enabled != SC_FALSE) + { + timer_part_data[p].wdog_time += msec; + + /* Generate IRQ if pre-timeout expired */ + if (timer_part_data[p].wdog_time + >= timer_part_data[p].wdog_pre_timeout) + { + timer_part_data[p].wdog_pre_timeout = UINT32_MAX; + notify_wdog_children(p); + } + + /* Reboot/notify if timeout expired */ + if (timer_part_data[p].wdog_time + >= timer_part_data[p].wdog_timeout) + { + timer_part_data[p].wdog_enabled = SC_FALSE; + + (void) timer_take_wdog_action(p); + } + } + } +} + +/*--------------------------------------------------------------------------*/ +/* RTC alarm ISR */ +/*--------------------------------------------------------------------------*/ +#if !defined(SC_FAKE_RTC) + void SNVS_Functional_IRQHandler(void) + { + uint32_t seconds = UINT32_MAX; + sc_rm_pt_t p; + + SNVS_GetRtc(&seconds); + + /* Notify users of alarm */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + /* Alarm time expired? */ + if (seconds >= timer_part_data[p].rtc_alarm) + { + /* Handle one-shot alarm */ + if (timer_part_data[p].rtc_period == 0U) + { + timer_part_data[p].rtc_alarm = UINT32_MAX; + } + else + { + timer_part_data[p].rtc_alarm = seconds + + timer_part_data[p].rtc_period; + } + /* Trigger user interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_RTC, BIT(p), p); + if (p == SC_PT) + { +#ifdef HAS_SECO + /* Service SECO watchdog */ + SECO_KickWdog(); +#endif + } + } + } + + /* Configure next alarm (and clear) */ + update_alarm(); + } +#endif + +/*--------------------------------------------------------------------------*/ +/* Set the sysctr alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_sysctr_alarm(sc_rm_pt_t caller_pt, uint64_t ticks) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Program into the RTC alarm */ + timer_part_data[caller_pt].sysctr_alarm = ticks; + timer_part_data[caller_pt].sysctr_period = 0ULL; + + update_sysctr(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Set the periodic sysctr alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_set_sysctr_periodic_alarm(sc_rm_pt_t caller_pt, + uint64_t ticks) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + ASRT_ERR(ticks != 0ULL, SC_ERR_PARM); + + if (err == SC_ERR_NONE) + { + /* Program into the SYSCTR alarm */ + timer_part_data[caller_pt].sysctr_alarm = SYSCTR_GetCounter64() + + ticks; + timer_part_data[caller_pt].sysctr_period = ticks; + + update_sysctr(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* Cancel the sysctr alarm */ +/*--------------------------------------------------------------------------*/ +sc_err_t timer_cancel_sysctr_alarm(sc_rm_pt_t caller_pt) +{ + sc_err_t err = SC_ERR_NONE; + + /* Bounds check */ + BOUND_PT(caller_pt); + + if (err == SC_ERR_NONE) + { + /* Program into the RTC alarm */ + timer_part_data[caller_pt].sysctr_alarm = UINT64_MAX; + timer_part_data[caller_pt].sysctr_period = 0ULL; + + update_sysctr(); + } + + return err; +} + +/*--------------------------------------------------------------------------*/ +/* SYSCTR alarm ISR */ +/*--------------------------------------------------------------------------*/ +void SYSCTR_CMP1_IRQHandler(void) +{ + uint64_t ticks; + sc_rm_pt_t p; + + ticks = SYSCTR_GetCounter64(); + + /* Notify users of alarm */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (ticks >= timer_part_data[p].sysctr_alarm) + { + if (timer_part_data[p].sysctr_period == 0ULL) + { + timer_part_data[p].sysctr_alarm = UINT64_MAX; + } + else + { + timer_part_data[p].sysctr_alarm = ticks + + timer_part_data[p].sysctr_period; + } + if (p != SC_PT) + { + ss_irq_trigger(SC_IRQ_GROUP_SYSCTR, BIT(p), p); + } + else + { + pm_reboot_continue_all(); + } + } + } + + /* Configure next alarm (and clear) */ + #ifndef NO_DEVICE_ACCESS + SYSCTR_Compare1Disable(); + #endif + update_sysctr(); +} + +/*--------------------------------------------------------------------------*/ +/* Dump timer state for debug */ +/*--------------------------------------------------------------------------*/ +#if defined(DEBUG) && defined(DEBUG_TIMER) + void timer_dump(sc_rm_pt_t pt) + { + sc_err_t err = SC_ERR_NONE; + + /* Check if partition enabled */ + USED_PT(pt); + + if ((debug != SC_FALSE) && (err == SC_ERR_NONE)) + { + /* Dump data */ + #if defined(SC_FAKE_RTC) + if (pt == 0U) + { + timer_print(2, " RTC (fake): %u.%03u\n", rtc_seconds, + rtc_mseconds); + } + #endif + timer_print(2, " Partition: %u\n", pt); + timer_print(2, " Wdog time: %u\n", + timer_part_data[pt].wdog_time); + timer_print(2, " Wdog timeout: %u\n", + timer_part_data[pt].wdog_timeout); + timer_print(2, " Wdog pre-timeout: %u\n", + timer_part_data[pt].wdog_pre_timeout); + timer_print(2, " Wdog flags:\n"); + if (timer_part_data[pt].wdog_enabled != SC_FALSE) + { + timer_print(2, " Enabled\n"); + } + if (timer_part_data[pt].wdog_locked != SC_FALSE) + { + timer_print(2, " Locked\n"); + } + } + } +#endif + +/*==========================================================================*/ + +/*--------------------------------------------------------------------------*/ +/* Update RTC alarm */ +/*--------------------------------------------------------------------------*/ +static void update_alarm(void) +{ + #if !defined(SC_FAKE_RTC) + sc_rm_pt_t p; + uint32_t secs; + uint32_t seconds = UINT32_MAX; + + /* Get current RTC */ + SNVS_GetRtc(&secs); + + /* Search for next time */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + /* Alarm time passed? */ + if (timer_part_data[p].rtc_alarm <= secs) + { + /* Periodic? */ + if (timer_part_data[p].rtc_period == 0U) + { + /* Cancel */ + timer_part_data[p].rtc_alarm = UINT32_MAX; + } + else + { + /* Next period */ + timer_part_data[p].rtc_alarm = seconds + + timer_part_data[p].rtc_period; + } + + /* Trigger interrupt */ + ss_irq_trigger(SC_IRQ_GROUP_RTC, BIT(p), p); + } + else + { + /* Earlier time? */ + seconds = MIN(seconds, timer_part_data[p].rtc_alarm); + } + } + + SNVS_SetRtcAlarm(seconds); + #endif +} + +/*--------------------------------------------------------------------------*/ +/* Update sysctr alarm */ +/*--------------------------------------------------------------------------*/ +static void update_sysctr(void) +{ + sc_rm_pt_t p; + uint64_t ticks = UINT64_MAX; + + /* Search for next time */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + /* Earlier time? */ + ticks = MIN(ticks, timer_part_data[p].sysctr_alarm); + } + +#ifndef NO_DEVICE_ACCESS + /* Found a time? */ + if (ticks != UINT64_MAX) + { + /* Enable counter compare */ + SYSCTR_Compare1Enable(ticks); + } + else + { + /* Disable counter compare */ + SYSCTR_Compare1Disable(); + } +#endif +} + +/*--------------------------------------------------------------------------*/ +/* Convert date/time to seconds since epoc */ +/*--------------------------------------------------------------------------*/ +static uint32_t epoc2secs(uint16_t year, uint8_t mon, uint8_t day, + uint8_t hour, uint8_t min, uint8_t sec) +{ + uint32_t secs = 0U; + uint8_t new_mon = mon; + uint16_t new_year = year; + + /* Add time */ + secs += U32(hour) * HOUR_SECS; + secs += U32(min) * MIN_SECS; + secs += U32(sec); + + /* Add month */ + new_mon--; + while (new_mon > 0U) + { + secs += days_in_month[B2U16(LEAP_YEAR(new_year))][new_mon - 1U] + * DAY_SECS; + new_mon--; + } + + /* Add day */ + secs += (U32(day) - 1U) * DAY_SECS; + + /* Add year */ + new_year--; + while (new_year >= EPOCH) + { + secs += YEAR_DAYS(new_year) * DAY_SECS; + new_year--; + } + + return secs; +} + +/*--------------------------------------------------------------------------*/ +/* Generate a WDOG IRQ to a partition and all children */ +/*--------------------------------------------------------------------------*/ +static void notify_wdog_children(sc_rm_pt_t pt) +{ + sc_rm_pt_t p; + + /* Notify children */ + for (p = 0U; p < SC_RM_NUM_PARTITION; p++) + { + if (rm_get_partition_parent(p) == pt) + { + notify_wdog_children(p); + } + } + + /* Notify parent */ + ss_irq_trigger(SC_IRQ_GROUP_WDOG, BIT(pt), + SC_PT_ALL); +} + +/** @} */ + diff --git a/platform/svc/timer/svc.h b/platform/svc/timer/svc.h new file mode 100755 index 0000000..b522942 --- /dev/null +++ b/platform/svc/timer/svc.h @@ -0,0 +1,304 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file svc/timer/svc.h + * + * Header file containing the API for the System Controller (SC) Timer + * function. + * + * @addtogroup TIMER_SVC + * @{ + */ +/*==========================================================================*/ + +#ifndef SC_TIMER_SVC_H +#define SC_TIMER_SVC_H + +/* Includes */ + +#include "svc/timer/api.h" + +/* Defines */ + +/* Types */ + +/* Functions */ + +/*! + * @name Internal Functions + * @{ + */ + +/*! + * Internal SC function to initializes the TIMER service. + * + * @param[in] api_phase init phase + * + * Initializes the API if /a api_phase = SC_TRUE, otherwise initializes the HW + * managed by the timer service. API must be initialized before anything + * else is done with the service. + */ +void timer_init(sc_bool_t api_phase); + +/*! + * This function initializes a new partition. + * + * @param[in] caller_pt handle of caller partition + * @param[in] pt handle of partition + * + * Note this function should only be called by the resource manager when + * a new partition is allocated. + */ +void timer_init_part(sc_rm_pt_t caller_pt, sc_rm_pt_t pt); + +/*! + * Internal SC function to set the watchdog timeout in milliseconds. + * + * @see sc_timer_set_wdog_timeout(). + */ +sc_err_t timer_set_wdog_timeout(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t timeout); + +/*! + * Internal SC function to set the watchdog pre-timeout in milliseconds. + * + * @see sc_timer_set_wdog_pre_timeout(). + */ +sc_err_t timer_set_wdog_pre_timeout(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t pre_timeout); + +/*! + * Internal SC function to set the watchdog window in milliseconds. + * + * @see sc_timer_set_wdog_window(). + */ +sc_err_t timer_set_wdog_window(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t window); + +/*! + * Internal SC function to start the watchdog. + * + * @see sc_timer_start_wdog(). + */ +sc_err_t timer_start_wdog(sc_rm_pt_t caller_pt, sc_bool_t lock); + +/*! + * Internal SC function to stop the watchdog (if not locked). + * + * @see sc_timer_stop_wdog(). + */ +sc_err_t timer_stop_wdog(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to stop halt the wdog when the partition is deleted. + * + * @param[in] pt partition whose wdog should be halted + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * This function will halt the wdog even if locked. + */ +void timer_halt_wdog(sc_rm_pt_t pt); + +/*! + * Internal SC function to ping (services, kicks) the watchdog resetting + * the time before expiration back to the timeout. + * + * @see sc_timer_ping_wdog(). + */ +sc_err_t timer_ping_wdog(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to get the status of the watchdog. All arguments + * are in milliseconds. + * + * @see sc_timer_get_wdog_status(). + */ +sc_err_t timer_get_wdog_status(sc_rm_pt_t caller_pt, + sc_timer_wdog_time_t *timeout, sc_timer_wdog_time_t *max_timeout, + sc_timer_wdog_time_t *remaining_time); + +/*! + * Internal SC function to get the status of the watchdog of a partition. + * All arguments are in milliseconds. + * + * @see sc_timer_pt_get_wdog_status(). + */ +sc_err_t timer_pt_get_wdog_status(sc_rm_pt_t caller_pt, sc_rm_pt_t pt, + sc_bool_t *enb, sc_timer_wdog_time_t *timeout, + sc_timer_wdog_time_t *remaining_time); + +/*! + * Internal SC function to configure the action to be taken when a + * watchdog expires. + * + * @see sc_timer_set_wdog_action(). + */ +sc_err_t timer_set_wdog_action(sc_rm_pt_t caller_pt, + sc_rm_pt_t pt, sc_timer_wdog_action_t action); + +/*! + * Internal SC function to take the wdog action specified. + * + * @param[in] pt partition to affect + * + * @return Returns an error code (SC_ERR_NONE = success). + * + * Reboots the partition, board, and/or generate IRQs. + */ +sc_err_t timer_take_wdog_action(sc_rm_pt_t pt); + +/*! + * Internal SC function to set the RTC time. + * + * @see sc_timer_set_rtc_time(). + */ +sc_err_t timer_set_rtc_time(sc_rm_pt_t caller_pt, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); + +/*! + * Internal SC function to get the RTC time. + * + * @see sc_timer_get_rtc_time(). + */ +sc_err_t timer_get_rtc_time(sc_rm_pt_t caller_pt, uint16_t *year, + uint8_t *mon, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec); + +/*! + * Internal SC function to set the RTC alarm. + * + * @see sc_timer_set_rtc_alarm(). + */ +sc_err_t timer_set_rtc_alarm(sc_rm_pt_t caller_pt, uint16_t year, uint8_t mon, + uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); + +/*! + * Internal SC function to set a periodic RTC alarm. + * + * @see sc_timer_set_rtc_periodic_alarm(). + */ +sc_err_t timer_set_rtc_periodic_alarm(sc_rm_pt_t caller_pt, uint32_t sec); + +/*! + * Internal SC function to cancel an RTC alarm. + * + * @see sc_timer_cancel_rtc_alarm(). + */ +sc_err_t timer_cancel_rtc_alarm(sc_rm_pt_t caller_pt); + +/*! + * Internal SC function to query an RTC alarm. + * + * @param[in] pt partition to query + * @param[out] alarm pointer to return alarm + * @param[out] period pointer to return period + * + * Companion function to timer_restore_rtc_alarm(). + */ +void timer_query_rtc_alarm(sc_rm_pt_t pt, uint32_t *alarm, + uint32_t *period); + +/*! + * Internal SC function to restore an RTC alarm. + * + * @param[in] pt partition to restore + * @param[in] alarm alarm + * @param[in] period period + * + * Companion function to timer_query_rtc_alarm(). + */ +void timer_restore_rtc_alarm(sc_rm_pt_t pt, uint32_t alarm, + uint32_t period); + +/*! + * Internal SC function to get the RTC time in seconds since 1/1/1970. + * + * @see sc_timer_get_rtc_sec1970(). + */ +sc_err_t timer_get_rtc_sec1970(sc_rm_pt_t caller_pt, uint32_t *sec); + +/*! + * Internal SC function to set the RTC calibration. + * + * @see sc_timer_set_rtc_calb(). + */ +sc_err_t timer_set_rtc_calb(sc_rm_pt_t caller_pt, int8_t count); + +/*! + * Internal SC function to increment the RTC. + */ +void timer_tick(uint16_t msec); + +/*! + * Internal SC function to set the sysctr alarm. + */ +sc_err_t timer_set_sysctr_alarm(sc_rm_pt_t caller_pt, + uint64_t ticks); + +/*! + * Internal SC function to set the periodic sysctr alarm. + */ +sc_err_t timer_set_sysctr_periodic_alarm(sc_rm_pt_t caller_pt, + uint64_t ticks); + +/*! + * Internal SC function to cancel the sysctr alarm. + */ +sc_err_t timer_cancel_sysctr_alarm(sc_rm_pt_t caller_pt); + +/** @} */ + +#if defined(DEBUG) && defined(DEBUG_TIMER) + /*! + * @name Debug Functions + * @{ + */ + + /*! + * Internal SC function to dump the internal state of the timer service. + * + * @param[in] pt partition to dump + */ + void timer_dump(sc_rm_pt_t pt); + + /** @} */ +#endif + +#endif /* SC_TIMER_SVC_H */ + +/** @} */ + diff --git a/platform/test/Makefile b/platform/test/Makefile new file mode 100755 index 0000000..da38cf9 --- /dev/null +++ b/platform/test/Makefile @@ -0,0 +1,40 @@ + +include $(SRC)/test/$(CONFIG)/test.bom + +TEST_DIRNAME=platform/test/drv +ifneq "$(wildcard $(TEST_DIRNAME) )" "" + TEST_TARGET := $(shell find platform/test -name test_$(LOWER_T).c -printf "%P\n") +else + TEST_DIRNAME2=$(OUT)/test + ifneq "$(wildcard $(TEST_DIRNAME2) )" "" + TEST_TARGET := $(shell find $(OUT)/test -name test_$(LOWER_T).o -printf "%P\n") + endif +endif + +ifeq ($(LOWER_T), all) + TEST_TARGET := $(CONFIG)/test_all.c +endif + +ifneq ($(UPPER_T), NONE) + objs_test += common/test.o $(TEST_TARGET:.c=.o) +endif + +ifeq ($(LOWER_T), all) + objs_test += $(AUTO_TEST) +endif + +OBJS += \ + $(foreach object,$(objs_test),$(OUT)/test/$(object)) + +EOBJS = $(OUT)/test/common/test.o $(OUT)/test/$(CONFIG)/test_all.o + +EOBJS += \ + $(foreach object,$(AUTO_TEST),$(OUT)/test/$(object)) + +EOBJS += \ + $(foreach object,$(EXPT_TEST),$(OUT)/test/$(object)) + +DIRS += $(OUT)/test $(OUT)/test/common $(OUT)/test/drv $(OUT)/test/ss \ + $(OUT)/test/svc $(OUT)/test/misc $(OUT)/test/ddr $(OUT)/test/sys \ + $(OUT)/test/$(CONFIG) + diff --git a/platform/test/common/test.h b/platform/test/common/test.h new file mode 100644 index 0000000..737b81e --- /dev/null +++ b/platform/test/common/test.h @@ -0,0 +1,308 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file with prototypes so main can call test functions. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by test_h.pl */ + +#ifndef SC_TEST_H +#define SC_TEST_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +#ifdef DEBUG +#ifdef HAS_TEST_PTIM + #define CHECK_NERR(X) {SC_PTIM_SETREF(testProf, __FILE__, __LINE__); \ + err = (X); \ + if (err != SC_ERR_NONE) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#else + #define CHECK_NERR(X) {err = (X); \ + if (err != SC_ERR_NONE) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#endif // HAS_TEST_PTIM + #ifdef CONFIRM_ERR +#ifdef HAS_TEST_PTIM + #define CHECK_ERR(X) {SC_PTIM_SETREF(testProf, __FILE__, __LINE__); \ + err = (X); \ + if ((err = (X)) == SC_ERR_NONE) \ + { \ + error_print("non error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#else + #define CHECK_ERR(X) {err = (X); \ + if (err == SC_ERR_NONE) \ + { \ + error_print("non error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#endif + #else + #define CHECK_ERR(X) NOP + #endif + +#else + #define CHECK_NERR(X) X + #define CHECK_ERR(X) X +#endif + +#define ASRT_TST_ERR(X,ERROR) \ + if (!(X)) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, ERROR); \ + board_exit(ERROR); \ + } + +#if TEST_LSIO + #define CHECK_LSIO(X) NOP +#else + #define CHECK_LSIO(X) return (X) +#endif + +#if HAS_SS_MCU_0 + #define CHECK_MCU_0(X) NOP +#else + #define CHECK_MCU_0(X) return (X) +#endif + +#if HAS_SS_MCU_1 + #define CHECK_MCU_1(X) NOP +#else + #define CHECK_MCU_1(X) return (X) +#endif + +#define TEST_DRV_START(X) \ + test_print(TL1, "\n*** %s DRV Test\n\n", X); + +#define TEST_DRV_END \ + test_print(TL1, "\n") + +#define TEST_SC_START(X) \ + test_print(TL1, "\n*** %s SC Test\n\n", X); \ + sc_pm_power_mode_t dblogic_mode; \ + (void) pm_get_resource_power_mode(SC_PT, SC_R_DBLOGIC, &dblogic_mode); \ + pm_force_resource_power_mode_v(SC_R_DBLOGIC, SC_PM_PW_MODE_ON); \ + sc_pm_power_mode_t db_mode[SC_NUM_DB]; \ + for (uint8_t db = 0U; db < SC_NUM_DB; db++) \ + { \ + (void) pm_get_resource_power_mode(SC_PT, sc_db_info[db].rsrc, &db_mode[db]); \ + pm_force_resource_power_mode_v(sc_db_info[db].rsrc, SC_PM_PW_MODE_ON); \ + } + +#define TEST_SC_END \ + for (uint8_t db = SC_NUM_DB; db > 0U; db--) \ + { \ + if (db_mode[db - 1U] == SC_PM_PW_MODE_OFF) \ + { \ + pm_force_resource_power_mode_v(sc_db_info[db - 1U].rsrc, SC_PM_PW_MODE_OFF); \ + } \ + } \ + if (dblogic_mode == SC_PM_PW_MODE_OFF) \ + pm_force_resource_power_mode_v(SC_R_DBLOGIC, SC_PM_PW_MODE_OFF); \ + test_print(TL1, "\n") + +#define TEST_AP_START(X) \ + sc_ipc_t ipc_sc; \ + test_print(TL1, "\n*** %s AP Test\n\n", X); \ + sc_ipc_open(&ipc_sc, (sc_ipc_id_t) MU_SC_1A); \ + (void) sc_rm_set_peripheral_permissions(ipc_sc, SC_R_MU_0A, SC_PT, SC_RM_PERM_FULL) + +#define TEST_AP_END \ + sc_ipc_close(ipc_sc); \ + test_print(TL1, "\n") + +#define TEST_DRV(X) sc_err_t test_drv_ ## X(sc_bool_t *const stop) +#define TEST_SC(X) sc_err_t test_sc_ ## X(sc_bool_t *const stop) +#define TEST_AP(X) sc_err_t test_ap_ ## X(sc_bool_t *const stop) + +#define TEST_PROTO(X) sc_err_t test_drv_ ## X(sc_bool_t *const stop); \ + sc_err_t test_sc_ ## X(sc_bool_t *const stop); \ + sc_err_t test_ap_ ## X(sc_bool_t *const stop); + +#define DBGSTR_PU "Power up %s\n" +#define DBGSTR_PD "Power down %s\n" +#define DBGSTR_TRY "Try %s access...\n" +#define DBGSTR_READ_GPIO "Read from GPIO_%s = 0x%08x\n" +#define DBGSTR_READ_IGPIO "Read from GPIO_%u = 0x%08x\n" +#define DBGSTR_READ_MU "Read from MU_%s.SR = 0x%08x\n" +#define DBGSTR_READ_UART "Read from UART_%s.VERID = 0x%08x\n" +#define DBGSTR_READ_I2C "Read from I2C_%s.VERID = 0x%08x\n" +#define DBGSTR_READ_LPCG "Read from LPCG_%s = 0x%08x\n" + +#define TEST_RSRC_NUM 43U + +#define TEST_READ32(X) test_read32(U32(X)) +#define TEST_WRITE32(X,Y) test_write32(U32(X), (Y)) +#define TEST_CHECK32(X,Y) test_check32(U32(X), (Y)) +#define TEST_NO_READ32(X) test_pid32(0U, U32(X), SC_TRUE) +#define TEST_PID_READ32(X,Y) test_pid32((X), U32(Y), SC_FALSE) +#define TEST_PID_NO_READ32(X,Y) test_pid32((X), U32(Y), SC_TRUE) + +/* Types */ + +/* Enums */ + +/* Sub Includes */ + +/* Functions */ + +#if defined(HAS_TEST) || defined(DEBUG) +TEST_PROTO(all) +TEST_PROTO(dump) +TEST_PROTO(board) +TEST_PROTO(rpc) +TEST_PROTO(temp) +TEST_PROTO(partnum) +TEST_PROTO(reboot) +TEST_PROTO(uboot) +TEST_PROTO(wdog) +TEST_PROTO(boot) +TEST_PROTO(xrdc) +TEST_PROTO(smmu) +TEST_PROTO(snvs) +TEST_PROTO(drv) +TEST_PROTO(lpi2c) +TEST_PROTO(pll) +TEST_PROTO(otp) +TEST_PROTO(dsc) +TEST_PROTO(pmic) +TEST_PROTO(lsio) +TEST_PROTO(hdmi_rx) +TEST_PROTO(dma) +TEST_PROTO(csi) +TEST_PROTO(dc) +TEST_PROTO(ap) +TEST_PROTO(mcu) +TEST_PROTO(pi) +TEST_PROTO(mipi) +TEST_PROTO(gpu) +TEST_PROTO(db) +TEST_PROTO(img) +TEST_PROTO(hdmi) +TEST_PROTO(isi) +TEST_PROTO(v2x) +TEST_PROTO(lvds) +TEST_PROTO(dc_lvds) +TEST_PROTO(cci) +TEST_PROTO(dblogic) +TEST_PROTO(hsio) +TEST_PROTO(vpu) +TEST_PROTO(audio) +TEST_PROTO(conn) +TEST_PROTO(drc) +TEST_PROTO(lcdif) +TEST_PROTO(misc) +TEST_PROTO(pad) +TEST_PROTO(timer) +TEST_PROTO(pm) +TEST_PROTO(rm) +TEST_PROTO(rm2) +TEST_PROTO(seco) +TEST_PROTO(osc24trim) +TEST_PROTO(pd) +TEST_PROTO(nmi_lockup) +TEST_PROTO(nmi_msi) +TEST_PROTO(timers) +TEST_PROTO(memreg) +TEST_PROTO(examples) +TEST_PROTO(fusedump) +TEST_PROTO(mtemp) +TEST_PROTO(obd) +TEST_PROTO(bench) +TEST_PROTO(pllchar) +TEST_PROTO(nmi_ecc) +TEST_PROTO(membw) +TEST_PROTO(profile) +TEST_PROTO(hmppm) +TEST_PROTO(audio_pll) +TEST_PROTO(powerall) +TEST_PROTO(boottime) +TEST_PROTO(fusewrite) +TEST_PROTO(critsec) +TEST_PROTO(refgencal) +TEST_PROTO(hexdump) +TEST_PROTO(ddr_retention) +TEST_PROTO(ddr_selfrefresh) +TEST_PROTO(ddr) +#endif + +sc_err_t test_force_power(sc_rsrc_t resource, sc_pm_power_mode_t mode); +sc_err_t test_power(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode); +sc_err_t test_force_power_list_on(const sc_rsrc_t *resource, uint32_t num); +sc_err_t test_force_power_list_off(const sc_rsrc_t *resource, uint32_t num); +sc_err_t test_power_list_on(sc_ipc_t ipc, const sc_rsrc_t *resource, + uint32_t num); +sc_err_t test_power_list_off(sc_ipc_t ipc, const sc_rsrc_t *resource, + uint32_t num); +uint32_t test_read32(uint32_t addr); +void test_write32(uint32_t addr, uint32_t val); +void test_check32(uint32_t addr, uint32_t val); +void test_pid32(uint32_t pid, uint32_t addr, sc_bool_t fail); +void test_reset(sc_rsrc_t resource, uint32_t addr, uint32_t val, + uint32_t reset_val); +sc_err_t test_clock_rate_change(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, uint32_t new_rate); + +/* External Variables. */ + +extern sc_bool_t dma_up_down; +extern volatile uint32_t test_val; +extern const sc_rsrc_t test_rsrc_list[TEST_RSRC_NUM]; + +#endif /* SC_TEST_H */ + diff --git a/platform/test/common/test.t.h b/platform/test/common/test.t.h new file mode 100755 index 0000000..6163e9c --- /dev/null +++ b/platform/test/common/test.t.h @@ -0,0 +1,236 @@ +/* +** ################################################################### +** +** Copyright (c) 2016 Freescale Semiconductor, Inc. +** Copyright 2017-2020 NXP +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** +** o Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** +** o Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** o Neither the name of the copyright holder nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** +** ################################################################### +*/ + +/*==========================================================================*/ +/*! + * @file + * + * Header file with prototypes so main can call test functions. + */ +/*==========================================================================*/ + +/* DO NOT EDIT - This file auto generated by $cmd */ + +#ifndef SC_TEST_H +#define SC_TEST_H + +/* Includes */ + +#include "main/types.h" + +/* Defines */ + +#ifdef DEBUG +#ifdef HAS_TEST_PTIM + #define CHECK_NERR(X) {SC_PTIM_SETREF(testProf, __FILE__, __LINE__); \ + err = (X); \ + if (err != SC_ERR_NONE) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#else + #define CHECK_NERR(X) {err = (X); \ + if (err != SC_ERR_NONE) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#endif // HAS_TEST_PTIM + #ifdef CONFIRM_ERR +#ifdef HAS_TEST_PTIM + #define CHECK_ERR(X) {SC_PTIM_SETREF(testProf, __FILE__, __LINE__); \ + err = (X); \ + if ((err = (X)) == SC_ERR_NONE) \ + { \ + error_print("non error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#else + #define CHECK_ERR(X) {err = (X); \ + if (err == SC_ERR_NONE) \ + { \ + error_print("non error @ line %d: %d\n", \ + __LINE__, err); \ + board_exit(err); \ + }} +#endif + #else + #define CHECK_ERR(X) NOP + #endif + +#else + #define CHECK_NERR(X) X + #define CHECK_ERR(X) X +#endif + +#define ASRT_TST_ERR(X,ERROR) \ + if (!(X)) \ + { \ + error_print("error @ line %d: %d\n", \ + __LINE__, ERROR); \ + board_exit(ERROR); \ + } + +#if TEST_LSIO + #define CHECK_LSIO(X) NOP +#else + #define CHECK_LSIO(X) return (X) +#endif + +#if HAS_SS_MCU_0 + #define CHECK_MCU_0(X) NOP +#else + #define CHECK_MCU_0(X) return (X) +#endif + +#if HAS_SS_MCU_1 + #define CHECK_MCU_1(X) NOP +#else + #define CHECK_MCU_1(X) return (X) +#endif + +#define TEST_DRV_START(X) \ + test_print(TL1, "\n*** %s DRV Test\n\n", X); + +#define TEST_DRV_END \ + test_print(TL1, "\n") + +#define TEST_SC_START(X) \ + test_print(TL1, "\n*** %s SC Test\n\n", X); \ + sc_pm_power_mode_t dblogic_mode; \ + (void) pm_get_resource_power_mode(SC_PT, SC_R_DBLOGIC, &dblogic_mode); \ + pm_force_resource_power_mode_v(SC_R_DBLOGIC, SC_PM_PW_MODE_ON); \ + sc_pm_power_mode_t db_mode[SC_NUM_DB]; \ + for (uint8_t db = 0U; db < SC_NUM_DB; db++) \ + { \ + (void) pm_get_resource_power_mode(SC_PT, sc_db_info[db].rsrc, &db_mode[db]); \ + pm_force_resource_power_mode_v(sc_db_info[db].rsrc, SC_PM_PW_MODE_ON); \ + } + +#define TEST_SC_END \ + for (uint8_t db = SC_NUM_DB; db > 0U; db--) \ + { \ + if (db_mode[db - 1U] == SC_PM_PW_MODE_OFF) \ + { \ + pm_force_resource_power_mode_v(sc_db_info[db - 1U].rsrc, SC_PM_PW_MODE_OFF); \ + } \ + } \ + if (dblogic_mode == SC_PM_PW_MODE_OFF) \ + pm_force_resource_power_mode_v(SC_R_DBLOGIC, SC_PM_PW_MODE_OFF); \ + test_print(TL1, "\n") + +#define TEST_AP_START(X) \ + sc_ipc_t ipc_sc; \ + test_print(TL1, "\n*** %s AP Test\n\n", X); \ + sc_ipc_open(&ipc_sc, (sc_ipc_id_t) MU_SC_1A); \ + (void) sc_rm_set_peripheral_permissions(ipc_sc, SC_R_MU_0A, SC_PT, SC_RM_PERM_FULL) + +#define TEST_AP_END \ + sc_ipc_close(ipc_sc); \ + test_print(TL1, "\n") + +#define TEST_DRV(X) sc_err_t test_drv_ ## X(sc_bool_t *const stop) +#define TEST_SC(X) sc_err_t test_sc_ ## X(sc_bool_t *const stop) +#define TEST_AP(X) sc_err_t test_ap_ ## X(sc_bool_t *const stop) + +#define TEST_PROTO(X) sc_err_t test_drv_ ## X(sc_bool_t *const stop); \ + sc_err_t test_sc_ ## X(sc_bool_t *const stop); \ + sc_err_t test_ap_ ## X(sc_bool_t *const stop); + +#define DBGSTR_PU "Power up %s\n" +#define DBGSTR_PD "Power down %s\n" +#define DBGSTR_TRY "Try %s access...\n" +#define DBGSTR_READ_GPIO "Read from GPIO_%s = 0x%08x\n" +#define DBGSTR_READ_IGPIO "Read from GPIO_%u = 0x%08x\n" +#define DBGSTR_READ_MU "Read from MU_%s.SR = 0x%08x\n" +#define DBGSTR_READ_UART "Read from UART_%s.VERID = 0x%08x\n" +#define DBGSTR_READ_I2C "Read from I2C_%s.VERID = 0x%08x\n" +#define DBGSTR_READ_LPCG "Read from LPCG_%s = 0x%08x\n" + +#define TEST_RSRC_NUM 43U + +#define TEST_READ32(X) test_read32(U32(X)) +#define TEST_WRITE32(X,Y) test_write32(U32(X), (Y)) +#define TEST_CHECK32(X,Y) test_check32(U32(X), (Y)) +#define TEST_NO_READ32(X) test_pid32(0U, U32(X), SC_TRUE) +#define TEST_PID_READ32(X,Y) test_pid32((X), U32(Y), SC_FALSE) +#define TEST_PID_NO_READ32(X,Y) test_pid32((X), U32(Y), SC_TRUE) + +/* Types */ + +/* Enums */ + +/* Sub Includes */ + +/* Functions */ + +#if defined(HAS_TEST) || defined(DEBUG) +TEST_PROTO(all) +<% $counter = 0 %> +<%PROTO_LIST%> +TEST_PROTO($tests[$counter]) +<% $counter++; return 'PROTO_LIST' if $counter < scalar(@tests); '' %> +#endif + +sc_err_t test_force_power(sc_rsrc_t resource, sc_pm_power_mode_t mode); +sc_err_t test_power(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode); +sc_err_t test_force_power_list_on(const sc_rsrc_t *resource, uint32_t num); +sc_err_t test_force_power_list_off(const sc_rsrc_t *resource, uint32_t num); +sc_err_t test_power_list_on(sc_ipc_t ipc, const sc_rsrc_t *resource, + uint32_t num); +sc_err_t test_power_list_off(sc_ipc_t ipc, const sc_rsrc_t *resource, + uint32_t num); +uint32_t test_read32(uint32_t addr); +void test_write32(uint32_t addr, uint32_t val); +void test_check32(uint32_t addr, uint32_t val); +void test_pid32(uint32_t pid, uint32_t addr, sc_bool_t fail); +void test_reset(sc_rsrc_t resource, uint32_t addr, uint32_t val, + uint32_t reset_val); +sc_err_t test_clock_rate_change(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_clk_t clk, uint32_t new_rate); + +/* External Variables. */ + +extern sc_bool_t dma_up_down; +extern volatile uint32_t test_val; +extern const sc_rsrc_t test_rsrc_list[TEST_RSRC_NUM]; + +#endif /* SC_TEST_H */ + diff --git a/platform/test/mx8dxl/test.bom b/platform/test/mx8dxl/test.bom new file mode 100755 index 0000000..6b833fa --- /dev/null +++ b/platform/test/mx8dxl/test.bom @@ -0,0 +1,96 @@ +## ################################################################### +## +## Copyright 2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +# This BOM will include tests applicable in a T=all build + +AUTO_TEST += drv/test_dsc.o \ + drv/test_pll.o \ + drv/test_snvs.o \ + drv/test_pmic.o \ + ss/test_dblogic.o \ + ss/test_db.o \ + ss/test_drc.o \ + ss/test_lsio.o \ + ss/test_dma.o \ + ss/test_conn.o \ + ss/test_ap.o \ + ss/test_audio.o \ + ss/test_hsio.o \ + ss/test_mcu.o \ + ss/test_v2x.o \ + misc/test_pd.o \ + svc/test_pm.o \ + svc/test_timer.o \ + svc/test_rm.o \ + svc/test_misc.o \ + svc/test_pad.o \ + svc/test_rm2.o \ + svc/test_seco.o \ + ddr/test_hexdump.o \ + ddr/test_ddr.o \ + misc/test_audio_pll.o \ + sys/test_temp.o \ + sys/test_uboot.o \ + sys/test_xrdc.o \ + sys/test_dump.o \ + sys/test_rpc.o + +EXPT_TEST += ddr/test_ddr_retention.o \ + ddr/test_ddr_selfrefresh.o \ + drv/test_drv.o \ + drv/test_lpi2c.o \ + drv/test_otp.o \ + misc/test_bench.o \ + misc/test_boottime.o \ + misc/test_critsec.o \ + misc/test_examples.o \ + misc/test_fusewrite.o \ + misc/test_hmppm.o \ + misc/test_memreg.o \ + misc/test_mtemp.o \ + misc/test_nmi_ecc.o \ + misc/test_nmi_lockup.o \ + misc/test_nmi_msi.o \ + misc/test_obd.o \ + misc/test_osc24trim.o \ + misc/test_pllchar.o \ + misc/test_powerall.o \ + misc/test_profile.o \ + misc/test_refgencal.o \ + misc/test_timers.o \ + sys/test_board.o \ + sys/test_boot.o \ + sys/test_partnum.o \ + sys/test_reboot.o \ + sys/test_smmu.o \ + sys/test_wdog.o + diff --git a/platform/test/mx8qm/test.bom b/platform/test/mx8qm/test.bom new file mode 100755 index 0000000..36e7165 --- /dev/null +++ b/platform/test/mx8qm/test.bom @@ -0,0 +1,109 @@ +## ################################################################### +## +## Copyright 2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +# This BOM will include tests applicable in a T=all build + +AUTO_TEST += drv/test_dsc.o \ + drv/test_pll.o \ + drv/test_snvs.o \ + drv/test_pmic.o \ + ss/test_dblogic.o \ + ss/test_db.o \ + ss/test_drc.o \ + ss/test_lsio.o \ + ss/test_dma.o \ + ss/test_conn.o \ + ss/test_cci.o \ + ss/test_ap.o \ + ss/test_audio.o \ + ss/test_dc.o \ + ss/test_mipi.o \ + ss/test_lvds.o \ + ss/test_dc_lvds.o \ + ss/test_hdmi.o \ + ss/test_img.o \ + ss/test_csi.o \ + ss/test_hdmi_rx.o \ + ss/test_gpu.o \ + ss/test_vpu.o \ + ss/test_hsio.o \ + ss/test_mcu.o \ + ss/test_lcdif.o \ + ss/test_isi.o \ + misc/test_pd.o \ + svc/test_pm.o \ + svc/test_timer.o \ + svc/test_rm.o \ + svc/test_misc.o \ + svc/test_pad.o \ + svc/test_rm2.o \ + svc/test_seco.o \ + ddr/test_hexdump.o \ + ddr/test_ddr.o \ + misc/test_audio_pll.o \ + sys/test_temp.o \ + sys/test_uboot.o \ + sys/test_xrdc.o \ + sys/test_dump.o \ + sys/test_rpc.o + +EXPT_TEST += ddr/test_ddr_retention.o \ + ddr/test_ddr_selfrefresh.o \ + drv/test_drv.o \ + drv/test_lpi2c.o \ + drv/test_otp.o \ + misc/test_bench.o \ + misc/test_boottime.o \ + misc/test_critsec.o \ + misc/test_examples.o \ + misc/test_fusedump.o \ + misc/test_fusewrite.o \ + misc/test_hmppm.o \ + misc/test_memreg.o \ + misc/test_mtemp.o \ + misc/test_nmi_ecc.o \ + misc/test_nmi_lockup.o \ + misc/test_nmi_msi.o \ + misc/test_obd.o \ + misc/test_osc24trim.o \ + misc/test_pllchar.o \ + misc/test_powerall.o \ + misc/test_profile.o \ + misc/test_refgencal.o \ + misc/test_timers.o \ + sys/test_board.o \ + sys/test_boot.o \ + sys/test_partnum.o \ + sys/test_reboot.o \ + sys/test_smmu.o \ + sys/test_wdog.o + diff --git a/platform/test/mx8qx/test.bom b/platform/test/mx8qx/test.bom new file mode 100755 index 0000000..af630cf --- /dev/null +++ b/platform/test/mx8qx/test.bom @@ -0,0 +1,106 @@ +## ################################################################### +## +## Copyright 2020 NXP +## +## Redistribution and use in source and binary forms, with or without modification, +## are permitted provided that the following conditions are met: +## +## o Redistributions of source code must retain the above copyright notice, this list +## of conditions and the following disclaimer. +## +## o Redistributions in binary form must reproduce the above copyright notice, this +## list of conditions and the following disclaimer in the documentation and/or +## other materials provided with the distribution. +## +## o Neither the name of the copyright holder nor the names of its +## contributors may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +## ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## +## ################################################################### + +# This BOM will include tests applicable in a T=all build + +AUTO_TEST += drv/test_dsc.o \ + drv/test_pll.o \ + drv/test_snvs.o \ + drv/test_pmic.o \ + ss/test_dblogic.o \ + ss/test_db.o \ + ss/test_drc.o \ + ss/test_lsio.o \ + ss/test_dma.o \ + ss/test_conn.o \ + ss/test_ap.o \ + ss/test_audio.o \ + ss/test_dc.o \ + ss/test_mipi.o \ + ss/test_lvds.o \ + ss/test_dc_lvds.o \ + ss/test_img.o \ + ss/test_csi.o \ + ss/test_pi.o \ + ss/test_gpu.o \ + ss/test_vpu.o \ + ss/test_hsio.o \ + ss/test_mcu.o \ + ss/test_isi.o \ + ss/test_lcdif.o \ + misc/test_pd.o \ + svc/test_pm.o \ + svc/test_timer.o \ + svc/test_rm.o \ + svc/test_misc.o \ + svc/test_pad.o \ + svc/test_rm2.o \ + svc/test_seco.o \ + ddr/test_hexdump.o \ + ddr/test_ddr.o \ + misc/test_audio_pll.o \ + sys/test_temp.o \ + sys/test_uboot.o \ + sys/test_xrdc.o \ + sys/test_dump.o \ + sys/test_rpc.o + +EXPT_TEST += ddr/test_ddr_retention.o \ + ddr/test_ddr_selfrefresh.o \ + drv/test_drv.o \ + drv/test_lpi2c.o \ + drv/test_otp.o \ + misc/test_bench.o \ + misc/test_boottime.o \ + misc/test_critsec.o \ + misc/test_examples.o \ + misc/test_fusewrite.o \ + misc/test_hmppm.o \ + misc/test_memreg.o \ + misc/test_mtemp.o \ + misc/test_nmi_ecc.o \ + misc/test_nmi_lockup.o \ + misc/test_nmi_msi.o \ + misc/test_obd.o \ + misc/test_osc24trim.o \ + misc/test_pllchar.o \ + misc/test_powerall.o \ + misc/test_profile.o \ + misc/test_refgencal.o \ + misc/test_timers.o \ + sys/test_board.o \ + sys/test_boot.o \ + sys/test_partnum.o \ + sys/test_reboot.o \ + sys/test_smmu.o \ + sys/test_wdog.o + diff --git a/platform/utilities/Makefile b/platform/utilities/Makefile new file mode 100755 index 0000000..61ddc80 --- /dev/null +++ b/platform/utilities/Makefile @@ -0,0 +1,10 @@ + +ifeq ($(D),1) +objs_utilities := newlib_stubs.o + +OBJS += \ + $(foreach object,$(objs_utilities),$(OUT)/utilities/$(object)) + +DIRS += $(OUT)/utilities +endif +

    A$xX{9|7Vl%d+e7hz4vxitoOK@Z2&=$uXl>IVC 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_drc.o b/build_mx8qm_b0/test/ss/test_drc.o new file mode 100644 index 0000000000000000000000000000000000000000..04bfa59aff144d63816c81fe85242f587b1ac7f4 GIT binary patch literal 34572 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_gpu.o b/build_mx8qm_b0/test/ss/test_gpu.o new file mode 100644 index 0000000000000000000000000000000000000000..0b667509bdd5d4b974421c0efda8f86ee2f9f95a GIT binary patch literal 37520 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 An*aa+ literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_hdmi.o b/build_mx8qm_b0/test/ss/test_hdmi.o new file mode 100644 index 0000000000000000000000000000000000000000..0faeb8edd5ed6c4b6e930f682aa86faceb0a331a GIT binary patch literal 54236 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_hdmi_rx.o b/build_mx8qm_b0/test/ss/test_hdmi_rx.o new file mode 100644 index 0000000000000000000000000000000000000000..36226586cc1fd12f06daeb8ceed5adfb20d40419 GIT binary patch literal 32748 zcmdtLdw5&LwLUzvC0UlOSiZ`NoQq8oC73w2lRy%ZkT|xJ80^H@4g?BOWLvgHY)eRX zoN#Hmlk~zJ%C)pyS|}}-7AX7*1xhI`rO*qvmQxC)r=@VpftCVop?vQ~C==pum z^Zj%9^hEoeHM3^Tnl)?I%uG-c^Z$p^!*?Cf~Dh9k4vh6<^Wu6!5;1#b6OT??R4p#{y|xA@;hW??-z+_#o7U-_y3p-9bm7zvju z%6H%BI}UWNXdvS=Yf9?mMa;2UoG%>)wkzm(KrA z8I)kUWDXk3D-K+YwAYLq8iS`B5>`1Xa1}d-e zv9b#MfnpCgggelR4trM{B0um7i8Y4s2l8oywT37Td>g~=J;D&>fxFN}?>a+-0*|8| z?|MVb3VfF(O@^pe<#=Um|0>kHi@jC2VO+0ehfy#k&|T z@6m>GYvn%~xeLK&`ZZUTzYL~}wD-jPlPJ^}az`oCDzKh%qIvA4J1{~qF<%NL`2lL; z?VUqg?1RB5&wmCk{EA?&`#ccA(z7tG`QGvTJ3s|qg6n#BmoTjYFK`4VZ1E66S1gUA zl_Bpv`R{|VESgf@drJ*-Sv0M@-?0a^EIOgQ_nCBl;9J!3e&0$|_6K^XFm-ha|_dJNjWzq3o<$cPCZU6x_pEhc)1OYvNX4+X3_+t=tep&Jx)L9=G zhONBMl>8Y)b6Ip40-iSlS_0o9+pkTX_CN^c^1fK`68h5_SWk1kR2qa!^aKVd;CKEw zwB8eOZtqSj zpPdi?n$Fs589h{Zix1SGRoI3>a)*-~szIxqRDSpZu!EXI${$`0;ogLmPx-}RFDKkd zR(>1mmxmvk32MZa*${4_o}*T92g;U*XJGPsQ+C#hvg2d z;1ZPnmj&0Qw;H?CGFf&vq}croDB&@dbEm*n`8pJ!Yh|%B%NeHY$-}DjxG5eq_9!w; z+@>p;$!6K~hYqcj?^4F3xjK9g`ZMbn@Lj)mp3ZNE{$Vr47w8faDtra4647SV-Qjn! zPIwn;GwS(hiyij5DR|ZoF;9xT>vaA;3YkZYP~jOAdA3!`(Q=3X#(8j#RZPbG@ZlWEbFE4S zThZe7@H?DZ`>i17$x!%Rj@xH#Diyw+ zef^wG?Frw+_C9YFKZy3u2*1P#@dc~+r=a$QpQ3YIV7K?>u*Rr+FSP636h4ghyU3=# z5xxVhdM~!AyTdEFTwP*Q4}=43?^2ukLHHuN)MfUpc~begSh8tjq?tC&#trSY>EAeX zrJDVg_bSWlh9==&cK=$dii8U9qH@<+p>p6Jq3 zo?^};P$U0Yo5%NC414~6xJq}k_|Gh!MG>#KO7|nDWGQo2l~Phk0G;x!2`pg#J?OP> zot^&{H1}<=)7MdnRy%zX#?80cPCt&B+jx~M|bjLci?v{ zIii?c`DGo=UCO_%ggeUOvW{*L>kUyJSPr%QO@;^s>fi_d4ThK%*nx@WZ#G1AAWovi z5c31WBw7uzD3Bqs(GZIRj5YpE#ninaun5-iZ#E_C1Mjn>t@tvOv;=<5c8)Y9n*%Pm zlK&`E(jIu3CGDo9Gf>2m4pY(-Sjf(8F(umrr?Anjrl%(aUW04_7ZnhAkDC&yw!q_fRr6zncc>F?EXd{BBxgo1w~e#i^K&{$mUk(iIS){Kpz< zmaeF$knKjLYF#k~NAVwL%I2dUspAc`NLL(A&QBG4QGcxx#EooJM7 z(G{;C2>W*!Ejx8ZFI$fq&K_N{mp0sKMsd5YxQN}3nX;X_;#`*X+FjKZhr+V{KD)2j zztM$g1aUhVcq=&M+>izZ6w`U?V#ZaRr%RcqeQAvN+cVyKFohB>7pZSZ<`Wa27f{1YFMc-au!tdN4|%;Ga^4OL@SY#pim(42l!2KWG*5_ zN#u3plt%i&Qx>@n?p+??ezziWKja4^6OddP*$Mn{rg&=ZpWCt{&s*-tx#cNINuAgVMtyn_!I<5t?CTWF_RUiulos!z15?=Bp!(xUPw`A;PSU z{2ZDe5t+bsUF1!0u8-V~NY)g&2BjM!&w;Z!vK3mjL;{f98o3&)&&J4^$k`P63|ibA zS%yf{7O6ztBO_nN>^Um(O=#X8i6XxvvJ@8B5?P9zt&vyJmssRI=++x4gB|)JpMkXg z$SmZ?BO2Blh;+hd2P5}E+o8z4keP_ALQnTbEjIEoH@(?f z1^WednRst`Q9CedyY3ix11H=0E761Ew4EP>cEzXL>F-0|;6+s)U?p!@#hi;)8v2&rXESx6H>D5S=~uy2`h7bcLyt=z zH*?7PE$mnNoSpwZtX2A=o%W%{vWx8WR*XRTgq^+_qgTGyPX7|)U%t zu0r?AFAaSj_0_^mx=)o~7CHljc6r>3>d@En%V$ti?Xuj9&OqzsSJ<@H?nReFv+^$r zt=tP!{i^)RVjjj(-LvQ>%DyW2fT1nVqA(OLzqtYG+v(=JFeD^)G_@6&=R#Me{4-zGtcaL#Rt$nh!PW0)#Imv-etlJ5aX z3g&6kGv8CtKIqdGFTp;(OVDi4FC{S&0U>%>r&NePu}(!k> z)~eP4Ze^^3JXPz*>a%}U2wT}#;&OL>#TpMb_TDgb`?fHc$kynDpLMaAnDtvJmX;u zid*@%vV|4e!RIYH9asEY09$5ad7S62JJYbtF{#J zE!eCBAEEPZ?@agNL{bG?bSWJH-s@4mf3ixec0I-h*$jqYoAzx*D*Q9}W$;*Cv>y$k ze;pjU?b>x1&_f2W?$Ew{Wc>_m7Tl>3D!_Tj==g{V#%w(-Iz--RVc2)t(e!rD|Prq^dmp~0>(dhwXPy#ariM9EO?C$kAo@?-%lU8R?j>Y7z(FY zcAZVl3jc$X@JqVtOq5lJ6{1A&dR=ussQKYi41DlLUH%17i^4B4blhZn)8g>mXf=4V zO*MpzIa*)Sb1wzw^6<$}FL;ZddljgaVR)$u-m2$Z4{A*~!U^(qJ?Can>%$w_!fkra zZJ=7h&6N2Kd!x2F`~U;UH?@hi?cv8s-ELD`YL~HvJ9PW?F=?@*JMUlZHRXK zwl1eb!!LVkJ?!Y+PKN5KJ(?N!I2rlJ)IP#a-0NhhV`?YZu3cLYkTcJs2RL} zGUK?~g|yd$x|m@=d-d_Pqiptj&V;qL*ZuE-0eQ0HlH1N*l`MdLapXFKH_9} zPOQZ&Qo%=cxxIv0C)U2nDv#-+^Vy2av!iw~f_(6Yy6k)uXv?*u_5qIm<1)!Cy`%O5 zEDXUPiDG$Hw6=ko{@C#}9j!f|vHJ-pLq#$19)=XJ`(J3q>plTq;&nHg>se^V>plrK z_qs1PIX*b1*L}O;++@-k%bJhFAN+}S<$>_r1!9gn_?-5KQF-x5o;vVXvOmW^drCdlX_3a&Lnc!Cz|^TUpYt zgTK{29%;fiFr>Yr%SfmyW5eIsHVo-1)6lEB=qhsRs_W>Lzt^EVKpv^9j-h+~L6`8b z*o6}dbt9*V@&_sZZj_VN&|Y)J9jqY)58f`cbCvHUy7Oz=wG4UIO^AAxmlSbZS^XL= zq1AA|5Vr-&+JA+kzaee8_P8}CyOz$suz#$gE$G9i7s^Nf@Uon-e)o{Sd8%t~0HZ9Qh?*te{Z3Az_ zB&@u-l&2k2XV3psM_KpM$X_cx$6^24zhghcSSzp5s&57uT8Q} z3FTB(*0Y=wj}^T`t|G)~+e&P3%D&3l!b$LWQ5X!>^^;s&Bn+3bF2)*I`D1(RPe*{Q ze4=O*nRn$f^Q*eX{3)CjkJi`Av_X*+!qW&YfjIY^#g6kS7^_e{z(acl<% z!M0Ef;(X;ZhRZq)J*s@J=%=jly8~+|>us#Cl`j;%Ne1kGq~}?oF-hv-5A&+znz@V2cLv_S}a+R0muPM}JxH1c>>8Q#oV*I`3H!ivn-ZU*4JbGKj^2 z)36_@{M&*zKr{p{$7)vj?#y>VEDwB$m7?;!S^6OCuL3Vn>-T5-L97Y9$o~AjrV_;Z zz-#DKdE%6*;_#L1kUAH zel+_y5Zl8OY*gtv{h&?=m(x62S0+L24Bu&ivUK$+p!&l%P@qfCJQvhZILLtQ)(b8I zH5|U0QapOjHK0=Azi~+O^qjAP8VldT-h1_|yFl#;pTzK$uWKFvby|421)aS#U9EBNr!CygL6#fm%igeAtKwXAV z{3NvT&=I_DF3O%^ljIugnJ`JNub#6^l53~u3ns~R(Q~Cqa?SJHXp%lC?77_}E110B zB)L9$eqfSZc05m;B$pJ=uTAnlnEX$Zw5lQ2mJAkUadGRk;9W0I?x z{H#eboOmub$q6REY?5a)d7DXI$mG2y$uQx0#3UbK@=23qDDXUQlAQFO-MU zXSe5lBz>9lMp75zLwk0ICT zV9kYYlzvH<_aW221ucIb2{d{pt6qX-BXqr<#k`ucP=98_zlV?=XBQQ6UZT+B<8p+?pCYObr;vd=AB1jY`K#DYXtcu#-CM zRw_B*;d#osIC)qSQ2-=GSQihkfa(hRse=~bkxPFsi*|sF;~T?wt%Rc!(4{94-UpNnxC-yLnYK@KfdSUyJkHuWLP^k ztn^89ABHk{e`#RfkD%#ym2$GIX28R2q3Bk8S9anu7Y$xy^f_8LsFmB1wHR5q z+A3PRp$+v|Ie>yyD0tE?@VMAf>Ytya{^JlgjGR`myexH@H-@~Uk@q({&sBgSTX_aD z*+>9gLT8yNtz3W-wzAYN$!cY{(+a!FRyNu!rsb=Vw*z@6N;N;-Lan?>+L_302i^RZ zv~%?V?VRqkbDy+xdsaISi@?Vv&$bTaJtgv9KS17DBJc2LL>@;Mmchs}2U{^!hY>UG za-MOQ?<4Db_#XZ;E>r#hV>vW(3#CTl!%+N=BTtJj#)*JsCvCEBrxe5v_s&H`< z&-_qMf#=)hc99v~H>Kp-sSh0yI63tUrMK9rHK*6%&!)aE&h5K)drBo~iRT%)!o|-(b1B zaKnq`O7T0hN*6TWfds$4v-6s-Ld56Sm(JVJf>!t~`Km75aJ;1yzcc6S0;Nmzf}*lQ zS5Z~bw#pJ+j0#pzxrz=iTwS=TkdK00^HpKt5#T^TI#e;o6ETn{1(53vfQLo-WvI(p zC^sD%(!S)musv=s|^OqXX)Rz<(4a9FCE zZc=zvP6lMnn$$Qyq>hLWgHT+lATeg@rQ;{e|qrB2mJ4z*P3ZZarO6ZMM2ooQH^9qb(&a z&d!+PtD6C{vV4hjL#$A5`~d1VWDoGH0;L+4=yfxl(Q-y-sV8dyv7}AsDbb~Q>qB4M zU@W;jo7t-T&IY*rp=f5(Y?60acGFe}p{Wp)r8JMDv2y=e8bqUU+Et%D3(qY>7jFR1 z;Z6Y-mz?@`J8NtaSe9}cM8zYrGY~wcccI$2+xjJFGp9FA9@SVT8gE#l=ozC$#y&75 z-bcvE!g#`EoDZz2wCW^q(RU--bYAZiI=CH)UVOoL2H>-Hl55EAcJg7s6Lu0;^Ks$M zKBMY-d@a>*J&`R~s&P_2;*Z7rXYeHt(N0hC;3SURf8eXtF}Ru!Drz#mj4uTe?R3MW zaAcWJ9cgmwyiSS1z>%VbRk6ESjP47bL8OuTBle z#s-qz0Bvn6=Oz*0n%&JQzckQjiUz?2Y zVP;*XZ(ss>>9NGk))DQOc)y2{y zb)(7AcwIc!o2Xk=x3r;gRo%(U>qcTHCDZl8iC%Km=Wx}pTC#LWV|`+@Z+N^v{{Nf4 z=Jru~SD)GYzjZV@-ch_mQa_MLk4(hU@%l+O9Kjg>FCCZvLF?XREZzUfQ@gpNyREyv z?SJ)b_#dp^AK#tmi)ZRPwy!+8Ye(8>YYfR{K+$Te>$-{p3cHfZ@pFH(58Eh~IK6!eZ6F^^b zWF+|s+<`d`FZwHXCOXtVl8C1FEa~G>Co|TMzj&_0nPABfPgBFmzFkP+)?0LJZz`U# z)8Oil57->zqY039emWi>9kY`TH*PeWeP7gW6NR`7(3ecdqkSXGLE$WiEjSKGQL{lo zju&svZ(kW5P9>I72^`fjNhW-F1{)jgAI6N$=C#*Yl;hkROC^xNnHWoeov?Fo|Itq1 z9`QhCIEo36Vx06ymUsvxq&#Jw!aP7;gGc9;Ra+XT$|;VQz~L+Rcq&jh!&A6`e0fXqmS{b;ou|)> zj?}1Jl~)d~vNF%Xc_p4%H6GuDXVz?wFK^xwWx2Jv3AkN&O|CX zfhI?i{qg8-6&>kii*XgjWe?t};mJzed&nzXibG%56=kC%RhcYLGh@-AtmkMlShAC2`6$JrU^ zYG>F#V(DI8lz$D*ul zY&hOKef(^;k?0_7@G*u{(Z1bdd@c;7(<2-{2#979gVBL;^fi_+VM%%kt3^|>@l4#< zJXfEsJ)L&AOUGmV%a*DrJENkbz2gHaIzEa@{bJuH{Qk$Wxs^9JwHqhOaj*8yW|L`; zV}CM=2iE99Dwas+*6wcYYHMnD+yoZJJsoE-&>ItkW5dG;I%CV0PPb26Q>W@1OAk*I z*}MsU)ZeczoaWOgKd#1JC)P~7s{2^z6H?}u*Z&vB#NYu1x0t^Ni4lN4C z`g@%@H5AK4Igq)M+dH>4b=lzwulh%$8TeXnEEAu`g($-CFqWJ^EHE)5)|O~v zLsq(xY~!i^hB#+4kn-g0$gs7I=5}K!`I&a*j|-h8chyN3lAM_ zoo&&U?zY@|t<4M?(e|y)M@4&bi`qLG#nD|(29D#>K2Cr%voJi&;zAxpFt-DrOlrg) zgu`Pn1zWJWNv0I~jyMxHp^nRd9TZU=-qhLE+SIY3y;U(3jSr9E=Swgk{d`6)IqDZrke$f%!w)37$Fa`r#d+GB@dfQ zu9!-$oJy|BHDmY2CN(~a_&FNyug1M%bPOF#j*po&G-W)^1SF;qs3v>D_>8UASQ@LL z-8b7O%(|AQ>%y7r^=+a*W7b%#)z~t^vS~B^h}xLi*m^}{$x)gU63r3?|C*XfV2@6u z6Id^>42}%K%i_J`gVEvm?l_iVIN!KgyvJ0>M*MlP9RW6Vc162;ntIGKcGz;ZI1)`@ zZFLsn*zQ}bv4?sRP~ROw{ zcH;bWO=#%OW2ZSQewnOU#YcB1(%2M^U<`Gq;SU9@9_y|bHC&~$ZR6w4NZi`k7QM$KAg z%b1GfBGlPeqq7+KTwQ40t}UB#Gq-oOz`ABn&d@=V#rkmLJd@y_IcK=r%pAzc;yGjM zmS|5?_faO2@^9>5w>@TdPaZJP8}404W5dQlb0l=PbaXVsg_6l#iMSn&V|^TyKDZtt zYnp?VQ==)B8cy_?2ajE`(ZP5(nanb_717YFW3-X24{mW~hLh7I^mJ|N*tUJrMeLY7 zjiJBE~&_kE;&A= zCfAhA5FQa%Ppim9p$ovrm#qx6_YJRGYsQ7dW#2jG;eEf z#$AEo!4(+s z4jd|*o4Q&gByi_G5kvSjhY3_SCsy3PO5qh11kCgpjzxpR<8fuq7E=*$D!yXAwX|;7 zwkg`u)YFt}5rz=6E0fj^yf-CNw;y|UdHq8fDf2ygg!@R7ss;(E_+c#95#^e1AUOlQ_ zx?;tlt5%&@T{nUa!&=;7$6dy{k>#MrhQ>#Ffdj+I*jOE216rF&4vY)b8bV znN(eW<6+1dP1cQLe_~dQI(q|z+*qnFLrC`xt;KsZyH~{PMh>Bb!RorLD8U(WZ66e$ zN(?}dePg`3Zh-gd_^1KV;RA+cIE?CPq@@ zc#46$3Am>-yvrPea+<(;v(dh9$^%MHQA=|tZaQ*}N!uD=_da#v!}4P$jJYQjGusUu zTi^ks_<75$V32bpnO1=KI6i`n!T|20Q`>ywNc*icLMYDA*_P zRu_DvpL+|rTg|#dvTwJa+sm6?bR@_sb~nYkgdG$$%f?=wS`eWy?Y&7_7HAA1;VQ&4-R zjI+s2p)u9g(-H03vtfK-07obo%-r7kxB%X|y{ENnOSHAMvumrY&1QklSt{fJWrr2q z7|pUY_N>?%^SQ!c4Cg;{4nc~!<_6xB$IA&&bvNM#So}R5+atEWMdy_OVdE}v=!d>ZW_Av&JYH};dzKk~q zbG(4VvZ=FeYnBDfgBatL&gKBa!BIZ&{`#cUZjOm_)&@Hsb?~4%rUtP??&-s%G52)L z1~#Yt)-A2JQ*j^2Co&j!nA%vvjN9byDyN!xienz9!0Wh6;%UO@?Cf&nLDsaH*Nj`K zQ~Mve6JkGe;YKUhHtZeuK@v-HPC>bxoh==9b{<9#3KH+cRh=mBwimNXN^m(83#n%~(WmaKrtd+&6R08@i4Tc%*Fv z*$)%#oq;%k*`>g?=1!%vhdEF+gaPWjtgDz;n3(oW5Zsxw_sI58WIY(-=;OG}?nAb*E@Gz)+0-2qvlq;d&K+Lv zc5Knk&S}aD*#9nHX_}F}3fh6WxNc6yOlFz$Bn6qa-~h3Ha{@f@wm*+v9c^3MxYIP7 zYsk;ht#k8nlMPODgKpf3-P+8jbaWImP3$PveXM<#!Ja>IPYQaOiHmht$)VKd=EJ+K z_^a9G=EJKOaXZz+H=(Ps=c;Z>k5spg^v3b(LVtB~!G$#kZA+B?w)|9{zi*?;Qv z5k7dVeOi%!hWXPc=go7zb{1{oO8^5KgD_!{MGL2t<(R1*YLhgsJusa{Odix_MO?2^% zkF1YN-k*1}Tzu~%>*K;p5O^UX>yz7@i|=-1eO!3EBbPr<;g2oU2a`N}lYi>t!pk1H z{LXv&HV=MSZHgHw7hm2l zn?}C^dP;xv!i1WscY@}Rsrmf}Mt8%7Dd{}Pu=j>?3c_ZZ5el21>F+`O-(HeH{K>9q zx0`)n%G!fsH_NlE(}?|y$LJ-G`0a>cLJ5*wN_Z35aKxtWm!bc7b4c+AGVy0SssMlS zc@PnQ?6+L#HA1%&F@gD4ECu*G;a(!@4H4(yPq2w|@gomX{#hx%NXoAuRx9;oBI@5x zME$#osQ-ZEKOy-)ll=c6LZ8V6cC{-OpS=-(+(_OEx2B=Tkv>6`ZD>_f)j%03ep}dzd`V8 zg7*kMD)=M8UkmLg6)Ez68x87A?70M^LMg|3k44q&+BKW2t12E;x5S%HvK(JA8tssApi~QRJPZr!S_>ka}g1-{vcEPkG7#3V8xLmMF zaEsul1oQE6WlpDfputfZEvB3txHG-Q3w+Y4sGlF{sKO=aq;O7J{7W|^% zb%Hkv-YR&9;5~xh6?{bSalxMo{!;K)g1;5~Pr)|?-xhpN@Iyft);{*zC&-^oCtV>} zC0HZ4P>{c^MZRT%s|42xwhA64c(mZLf+q_02_^)Sg5!exQGB*@rr`O4Ul6=h@G8OU z1^KhotaqE>U4r~SnwbBf;G=>+7JORpSwa5h7WrQh{G;HX1^+7ecfpSYJ$QAR^$G<` z1Sl51-~tLzu-fHj|u)n@EO713cexuo}jDPZZ9BMCAd&K z3Bhr}GX=jOc$MJIf_Di%DEMQ+X9Zsu^kVNvJ5&lT6x=9yjNpJEe>k7~`vfl&yjAcq z!RG|u5`0(iL%~YyH7RGd;5@;D1?vS56GiQbGO}3F&o${I3c~pCGtP@D#y^1%E2|C&6-@ zRaviDFfI5M!Dj_|b|ha=@JPYEg0~3%M$npN^Dh!yF1TLs9KnYKEu3X3zfo|f;AMi3 z3i7{}AYTAyT_S(VnYc!9Sa6TvIf54n-YfWh!B+*{ICE1@vEXXKe!-IkKP~t}q|39VtPl9hs{)|O-`8>e}BI>UuqMdbuEmD3Q5qss6h~OKS^1XteCg$Tmi4pv| z;CG2$rG6^(D}wI|79VWat097Knb4aAcL?qg+)o7GHA3GZ_#?qzN%e<)a9i+bo+ zNN_eWA3sJUxQ+<9n+3N>{;1$S!RrLSP6YqsMA+j6!9Ni_xQ|Uld+HDy^N8Rp5G)g{ z6s#7UFIXqoD0sNw5rP{9j}+_@JVr1o*eB?QD(o-*8Ki2Yp_0Km!A8NAf@=hu1vd$9 z5$qC-3nm0l791DcFZcz)%LT6zyiM>9!S4(HQ1B_iUkLtz2s^(n__pBR1oMdSS8QJm zAC_CwPk^C~Jy74V2adm{+?>;pKf?113bB1s7A~ef@)2GPy-4_5gx*Xn#AQil@5orJ z7l^kr4GuXeymd2%U+?E%3NGozF9j`O1}=C+nEiBgNjga$yI|@*It4Z^X;e$_#!ptw zDTZu$SvRo_zx|gI<|g+NJ00uo#rr|FG&=`Rud~S*ULqRA+xl7c56t0zc#STZzr%oj zY6;)#;rk+4wFc67>t8Lw>q$#uV|am}cN|@YrT$-ku=Oy{AvmV|EVp6uid&uLgQd#w zxrCn1rzL+OkmLS;<68_K*2!*{^_-8>F6RdMmP!HV4Cj&aVHv*zf{wft=RlLl5fk!p${qrpE$_9x_WY$hOzTN`&mry9K~l}Z0CJu?AE%5lCtIF6 zMX74!QC=~=j(!{?rw)?pFv#1-Kr0`o?DwFv4!Rzl1}c^Ktn2%!g^`bJ|Y)7`j6M*)BhPMwG2z1B6jF^~3RNQa?Uh z!LX;0Wj;^toYIvUPFqBa8S?pHCwvx=eBd=tV)<1b%Op0BR0$rlTyyL$6Qf4tv! zM8bR_rroWLKl4sYqN^#q;>%CI_;SRDZhgr|`F`P}n8lB<44t@Y)UL-qc3LgB_?M|X z-!hAzX!go{H06U!PPh0~%(iUaUHY=Lf34&hSf+SgDJfOnpnqjn-U=CBF7MiSu}6&G zJMJofr7WlDPxUX#qE|GxWz*cFFFV~oFPjFrN>asPhrc>2SD=>Rb?o#{$f0nJ+dCu! z_@C+bW#{{|+q27Go|BiYhx7dIti1i778VuXioH5QqYx#?ew5JDeUF&!xuEpN9A zpxX|OLSg|(^+07SF<4C5R@=TJfWtP?i=4ZixYbm~kz?B^OFMp%hom^{R-Zm{2PNtD zZ-JqHc`p7HewSP`Y*Vu8JJMwl)a@bRqLgZO((f%|M^pOa!pq-X+BcB0* z-TFN4jtE+$hf%e4s*5DkFD*wnDZ|b~uv*(jt>QjpDyF|Z z65;PxJ%XGftKFJLnniOw2QAwuT-=Y!@`~K&BW$Cdsl~}T~RESD@tz(uB0Y?@hV|potMQL!0u+NZ^ zTiy3V$MzWo#L40Q5)Q*YLsn7fJ_?Gr�oDqSD|tVV_xWG>Vr&&Q~C3;WN0cM1s_e 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 J-@MG={{?I8jlKW? literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_img.o b/build_mx8qm_b0/test/ss/test_img.o new file mode 100644 index 0000000000000000000000000000000000000000..0fea1b5a1cac6ff43fb97766be69d9c1170fd037 GIT binary patch literal 32240 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_lcdif.o b/build_mx8qm_b0/test/ss/test_lcdif.o new file mode 100644 index 0000000000000000000000000000000000000000..0956e7b9c06b756a1edda0d01914bdaf179a7467 GIT binary patch literal 30252 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

  • S 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�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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/mx8qm/test_all.o b/build_mx8qm_b0/test/mx8qm/test_all.o new file mode 100644 index 0000000000000000000000000000000000000000..75cd455d1f19be02c2d103ead8c1904a5d7dffbe GIT binary patch literal 41580 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 NALX0o1R~6F{x8yY!JqtATrIrrRi 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/ss/test_audio.o b/build_mx8qm_b0/test/ss/test_audio.o new file mode 100644 index 0000000000000000000000000000000000000000..ec9782ea1e96c40149dee67c2bf52ba535c9ce2d GIT binary patch literal 37552 zcmdsgcYK@G_5OYJN|t3il2>e5NgO#lCLW1H5;91fZOC*S2ow+=@*uV)Bs)$hv|)#x zFar&n0%4R|?u|nrOGOijSRyW(eXk$ybH4*CyFI%->Ndyve!qpqcR?pa&m6nGpBD%Kf%H^vf3)a;C zu+-$;r53JPrA

    1-CQCD~>RPa2q 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_boottime.o b/build_mx8qm_b0/test/misc/test_boottime.o new file mode 100644 index 0000000000000000000000000000000000000000..61ea210bcca1dd482d206141b3fa89fbd365d101 GIT binary patch literal 35808 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/test/misc/test_critsec.o b/build_mx8qm_b0/test/misc/test_critsec.o new file mode 100644 index 0000000000000000000000000000000000000000..f1dd8f31e1f1abb0eb3a6d29c17069f6336f8014 GIT binary patch literal 40292 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 Q8Y4F$fgd?=GfU+D53)!eR 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 LrJaa0JNUlg);2u1q}#IG+{6#gE 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ℑPg81IbEC3;8?p-IeR$r1=k!*T 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 QI<8%CRM)>nI`HlO4ISLB;{X5v literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/hdmi/v1/ss.o b/build_mx8qm_b0/ss/hdmi/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..9acbf1dd82bab2f5f60f2c8a06a8fe8e8b408074 GIT binary patch literal 51764 zcmdtLd3;pW89#i_ow=DzGGwwbnM_ESzyM*%LI|6(g)9(BNJxT!+b~HcB#>p8Nmx{r zx`I236%nOwb*)RSORE&zs%_oS+Pc);YTa6_wQ5~>zt1_(oy-hrfA9PG{Zroi$(`?c z&Uwyrp7WgNtoP33%$oXIA%tdLLMzgSC{6qGV=~34kWi$RY9*Sd)>vZsrfa{} z%EY13;_z2L?AP`aOYuivREkMywbt5ezxJkA9~33W9vs^^che)a`yL*1T=Uo7t*?CT z^Xii`d&T8bU(qL)zB;*9+@4Yh35O@w>SIz0y|okuS6N<ODBTQ~*G{Ze zoRe$IYt38~HaX^n^n3RG_0W&Bu@^zhuRlzwvhEj4JfSZ>lvTmU%=?X6N3C&aw4r%N zd~VYh{Nt*OPZwPLwM`=p-m|5=eC^k^GIv$_p~Ft=K}#Xh(<#MrPuafWj}BE{`?Y(4 zbxO%Ao~6fs?S1>ruhUm2eIjyxaBn>Iy01@Iopk8Tq+c&Ae6{hPKR?~^t@d5!QpYDx zrOo&{?d@NGt~qlKTBkS;I!Z_H@2oa_k?t?r#?;Q1HP^hPb<$3JR-&~17Vp14O!EHo z!xZm7K2$a~?d)#IUAp{hZ)k3}@rf9jU!C;Hfut+Hwr@?oR=e_n%~mPxq0e<^(xLfD zMs4=Nw8hXRV)@o;ZSQ`s&9Nk}OH8&OJZWep#?OS;{BdY2MI2 zF~+l+%CnC7GTIg-yX+U)ll5!$gJq8>x%z$!bez0e^OijlTBPc(YnsTm5w|At4NbcW z&bkZ!d$rKD-NK@!>Q&n70Y%A6h!H}!r)b)YKCvwwiX`7%YPZ{ET8ce2 zodOrz6}Q8lB;!r2vqO7aK%u?!rGadMqa*WoF$(>I}L zeN4_\hrhAego9f2#00Zz9@|p5;+HukYcs|)G`jH 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/hdmi_rx/v1/ss.o b/build_mx8qm_b0/ss/hdmi_rx/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..466dc14fbbc2123ce88d4b84fdb8dd55d2158043 GIT binary patch literal 42680 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/hsio/v1/ss.o b/build_mx8qm_b0/ss/hsio/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..c5c0b1e2cc2673cdd96ce9ee3061b1716da6d8a7 GIT binary patch literal 52936 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/img/v1/ss.o b/build_mx8qm_b0/ss/img/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..617648aed399d0db5ba298b68302ed7098dcc6d6 GIT binary patch literal 43596 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 fllT$W77Urk0>_a*9-D&w3U3b?eqPSM`ThP6 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/lsio/v2/ss.o b/build_mx8qm_b0/ss/lsio/v2/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..63e5bc66d9f71245e84f15a868690a3d83c59719 GIT binary patch literal 67988 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 Qgtbf22TxRBM8DmC0UDxfu>b%7 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/lvds/v1/ss.o b/build_mx8qm_b0/ss/lvds/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..cfc487188dc4ded08f1033bb4d228b5d3363f54c GIT binary patch literal 39612 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/ss/mipi/v1/ss.o b/build_mx8qm_b0/ss/mipi/v1/ss.o new file mode 100644 index 0000000000000000000000000000000000000000..259b09fdc273f6c25e19a181aa5b229fcd4330da GIT binary patch literal 48736 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

    49M(u`p_)EB4h6Y~()KK<__aM0$+>Jo} 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 bJEj3;cbF;phVj|hlow9<`(920VYvSTv6S8U literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/main/monitor.o b/build_mx8qm_b0/main/monitor.o new file mode 100644 index 0000000000000000000000000000000000000000..b931c8b927a13c14c137c46d82655d2fa873a87b GIT binary patch literal 118092 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 Q7g`k+s^dGadA{C%0GxW!A^-pY literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/main/rpc.o b/build_mx8qm_b0/main/rpc.o new file mode 100644 index 0000000000000000000000000000000000000000..0546f790e8d5219b15c9ce588c47d4a16ada44c1 GIT binary patch literal 25920 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 literal 0 HcmV?d00001 diff --git a/build_mx8qm_b0/soc/common/soc_common.o b/build_mx8qm_b0/soc/common/soc_common.o new file mode 100644 index 0000000000000000000000000000000000000000..c97e0075389c5b77fc8edeb0b6c1d382e85a2ba8 GIT binary patch literal 136972 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